ListBox in Form1 aus Form2 befüllen - Code Review

  • C#

Es gibt 7 Antworten in diesem Thema. Der letzte Beitrag () ist von mrMo.

    ListBox in Form1 aus Form2 befüllen - Code Review

    Guten Abend,

    ich habe folgende Problemstellung: Ich möchte eine ListBox, die sich in meiner Hauptanwendung (Form1) befindet, befüllen mit Einträgen aus einer sekundären Form (Form2). Kurz: Ich möchte Daten von Form2 an Form1 übergeben.

    Hierfür hatte ich mir gedacht, dass ich mit einer Referenz arbeite. Ich muss sagen, dass auch alles so funktioniert, wie es soll. Aber nur weil es das tut, heißt das nicht, dass das auch die beste Lösung ist.
    Daher bin ich an einem Code Review interessiert. Meine Frage ist daher geht das auch besser umgesetzt, oder ist das, so wie ich es implementiert habe, die typische Lösung für derlei Problemstellungen?

    Ich bedanke mich für kommende Antworten! :thumbup:

    Hier einmal der Code:
    Form 1:

    C#-Quellcode

    1. using System;
    2. using System.Collections.Generic;
    3. using System.ComponentModel;
    4. using System.Data;
    5. using System.Drawing;
    6. using System.Linq;
    7. using System.Text;
    8. using System.Threading.Tasks;
    9. using System.Windows.Forms;
    10. namespace ParameterÜbergabeAnForm
    11. {
    12. public partial class Form1 : Form
    13. {
    14. public Form1()
    15. {
    16. InitializeComponent();
    17. }
    18. private void button1_Click(object sender, EventArgs e)
    19. {
    20. Form2 frm2 = new Form2(this);
    21. frm2.ShowDialog();
    22. }
    23. public void addValuesInLB(string _inp)
    24. {
    25. listBox1.Items.Add(_inp);
    26. }
    27. }
    28. }


    Form 2:

    C#-Quellcode

    1. using System;
    2. using System.Collections.Generic;
    3. using System.ComponentModel;
    4. using System.Data;
    5. using System.Drawing;
    6. using System.Linq;
    7. using System.Text;
    8. using System.Threading.Tasks;
    9. using System.Windows.Forms;
    10. namespace ParameterÜbergabeAnForm
    11. {
    12. public partial class Form2 : Form
    13. {
    14. public Form2()
    15. {
    16. InitializeComponent();
    17. }
    18. Form1 reference;
    19. public Form2(Form1 _inp)
    20. {
    21. InitializeComponent();
    22. reference = _inp;
    23. }
    24. private void button1_Click(object sender, EventArgs e)
    25. {
    26. reference.addValuesInLB(tb_name.Text + " - " + tb_lastname.Text);
    27. }
    28. }
    29. }


    Und hier ein Paar Bilder:



    Bilder
    • Pic1.PNG

      6,52 kB, 394×307, 203 mal angesehen
    • Pic2.PNG

      12,66 kB, 685×373, 175 mal angesehen
    Man kann auch die Daten von Form2 per Event senden. Hierzu ein Event in Form2 implementieren welches von Form1 abonniert wird.
    "Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. Lehre einen Mann zu fischen und du ernährst ihn für sein Leben."

    Wie debugge ich richtig? => Debuggen, Fehler finden und beseitigen
    Wie man VisualStudio nutzt? => VisualStudio richtig nutzen
    @VB.neter0101 Du rufst Form2 modal auf, gib ihr ein DialogResult: Cancel => nix tun.
    Gib Form2 eine Prozedur, die alle Daten als List(Of T) zurückgibt.
    Bei DialogResult.OK holt sich Form1 diese Liste und Du befüllst Deine ListBox.
    Feddich.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    @mrMo: Danke für deine Antwort! Ich habe eine Vermutung, wie man das realisieren könnte. Falls du Lust hast, könntest du das ja etwas weiter ausführen
    @RodFromGermany: Danke ebenfalls für deine Antwort! Das war tatsächlich meine erste Lösung (so in der Art, aber vermutlich nicht ganz sauber), ich fand das dann aber etwas zu "statisch" weil die Parameter (also die Daten) erst in die Form übertragen worden sind, nachdem sich meine zweite Form geschlossen hatte. Aber ein ebenfalls interessanter Ansatz!

    Vollzitate durch "Anschreiben" ersetzt ~VaporiZed

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „VaporiZed“ ()

    VB.neter0101 schrieb:

    nachdem sich meine zweite Form geschlossen hatte.
    Da Du die zweite Form als modalen Dialog öffnest, wird die erste Form vom System eh praktisch angehalten.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Vollzitat des direkten Vorposts an dieser Stelle entfernt ~VaporiZed

    Ich habe es vielleicht nicht mehr richtig in Erinnerung, aber mir ist es bei meiner Implementierung (damit meine ich jetzt nicht die, die ich oben angegeben habe) aufgefallen, dass die Daten erst zeitlich versetzt in die alte Form1 übertragen worden sind, das fand ich von der Benutzung eher weniger gut, da ich gerne sofort die "Übertragung" bzw. Änderung (push der Daten an die erste Form) gesehen hätte.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „VaporiZed“ ()

    @VB.neter0101 Unterlass das Zitieren vollständiger Posts über Deinen :!:
    Wenn da was zu sehen sein soll, musst Du die zweite Form nicht modal aufrufen (.Show()), dann allerdings musst Du mit Events arbeiten.
    Gugst Du Dialoge: Instanziierung von Forms und Aufruf von Dialogen
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    VB.neter0101 schrieb:

    Danke für deine Antwort! Ich habe eine Vermutung, wie man das realisieren könnte. Falls du Lust hast, könntest du das ja etwas weiter ausführen

    Kannst alles hier im Forum nachlesen. @ErfinderDesRades hat dazu mal nen Thread gemacht ...
    Alles über Events

    Grob zusammen geschrieben um ungefähr zu veranschaulichen was tu tun ist

    VB.NET-Quellcode

    1. 'Form2
    2. Public Event Foo(data as String)
    3. Private Sub DoAwesomeStuff()
    4. Raise Event Foo(„foo“)
    5. End Sub
    6. 'Form1
    7. Addhandler MeineForm2Instanz.Foo, AddressOf MeinPassendesEvent
    8. Private Sub MeinPassendesEvent(data as String)
    9. MessageBox.Show(data)
    10. End Sub
    "Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. Lehre einen Mann zu fischen und du ernährst ihn für sein Leben."

    Wie debugge ich richtig? => Debuggen, Fehler finden und beseitigen
    Wie man VisualStudio nutzt? => VisualStudio richtig nutzen