ListBox - Daten aktualisieren

  • C#

Es gibt 5 Antworten in diesem Thema. Der letzte Beitrag () ist von Hatori.

    ListBox - Daten aktualisieren

    Moin,
    ich hätte da mal wieder ein Problem. Ich hab ein Formular mit einer TextBox, einem Button zum Speichern und einer ListBox, die anzeigt, was bisher in der Datenbank gespeichert ist. Speichern klappt tadellos, nur krieg ich die ListBox nicht aktualisiert.
    Das Abholen der Daten aus der Datenbank:

    C#-Quellcode

    1. private List<GraduierungsModel> VorHandeneGrade = GlobalConfig.Connections.GetGraduierungen();

    Dann die ListBox füllen:

    C#-Quellcode

    1. private void ListeGraduierungen()
    2. {
    3. GraduierungsListBox.DataSource = null;
    4. GraduierungsListBox.DataSource = VorHandeneGrade;
    5. GraduierungsListBox.ValueMember = "IdGraduierung";
    6. GraduierungsListBox.DisplayMember = "Graduierung";
    7. }

    Die Daten werden korrekt angezeigt. Dann speichere ich den nächsten Datensatz:

    C#-Quellcode

    1. private void GraduierungSpeichernButton_Click(object sender, EventArgs e)
    2. {
    3. if (ValidateForm())
    4. {
    5. GraduierungsModel model = new GraduierungsModel(
    6. GraduierungTextBox.Text
    7. );
    8. GlobalConfig.Connections.CreateGraduierung(model);
    9. ListeGraduierungen();
    10. GraduierungTextBox.Text = "";
    11. }
    12. else
    13. {
    14. MessageBox.Show("Bitte alle Felder ausfüllen!");
    15. }
    16. }

    Klappt auch ... nur wird die ListBox nicht aktualisiert. Wenn ich das Formular schließe und wieder öffne, sind alle Datensätze da, auch der neue. Aber wer will das schon.
    Sieht jemand, wo ich was verkehrt mache? Oder fehlt noch was?
    Das ganze Projekt auf dem jetzigen Stand hier: github.com/TrueHatori/Vereinsverwaltung
    Grüße aus Berlin
    ---
    Kuroi Fenikkusu Kampfsportverein e.V.
    https://www.spandau-ninja.de
    In meinen Augen ein logischer Architektur-Denkfehler und eine ungeeignete Technologie.

    Der Denkfehler ist: anzunehmen, dass sich eine Listbox ändert, wenn etwas in eine Datenbank gespeichert wird. Dem ist nämlich nicht so.



    Deine Technologie kenn ich nicht - es ist allerdings offsichtlich nicht die Dataset-Technologie.

    Bei einem typisiertem Dataset hättest du darin eine typDataTable, etwa des Namens "Graduierung", und daran könntest du die Listbox binden.
    Und Änderungen werden immer nur innerhalb dieses Datasets vorgenommen (nicht in der Datenbank).
    Wenn du dann an der Graduierung-Tabelle was änderst (im Dataset - nicht in der Datenbank), dann ändert sich die angebundene Listbox.

    Und Abspeichern geht nun ganz anders.
    Also man hat keine Extra-Methode für jeden einzelnen Datensatz zum Abspeichern, sondern man hat eine einzige Methode, die einfach alle Änderungen des Datasets in die DB zurückschreibt.
    Das DAtaset hat auch eine automatische Änderungsverfolgung.
    Ist was gelöscht worden, so werden geeignete Delete-Commands abgesetzt.
    Ist was zugefügt worden (etwa eine Graduierung der Graduierung-Tabelle), so werden geeignete Insert-Commands abgesetzt.
    Sind keine Änderungen gemacht worden, wird nix in die DB geschrieben.
    Dabei ist ganz egal, welche Tabelle betroffen ist, und mit welcher Operation (Zufügen, Löschen, Ändern).
    Es wird einfach die ÄnderungsVerfolgung des Datasets ausgewertet, und was zu tun ist wird getan.
    Alles in einer Methode und fertig.
    Der Denkfehler ist: anzunehmen, dass sich eine Listbox ändert, wenn etwas in eine Datenbank gespeichert wird. Dem ist nämlich nicht so.

    Tu ich ja nicht. Nach dem Speichern (dabei wird eine stored procedure in meiner Datenbank aufgerufen), wird ListeGraduierungen(); ausgeführt. Und die setzt erst DataSource auf "null" und schreibt sie dann neu. Und zwar mit dem Ding ganz oben, welches auch eine stored procedure aufruft, die die entsprechenden Daten rausgibt. Das sollte funktionieren, irgendwas fehlt aber scheinbar.
    Grüße aus Berlin
    ---
    Kuroi Fenikkusu Kampfsportverein e.V.
    https://www.spandau-ninja.de
    Die Technologie hier nennt sich ORM oder Object Relational Mapper und dient dazu schnell und einfach auf Datenbanken zugreifen zu können. In diesem Falle wird dazu Dapper verwendet.
    Das wiederum setzt auf StoredProcedures in der Datenbank selbst auf, in denen sich die eigentlichen SQL Befehle befinden.

    Oder um es kurz zu fassen, ein Umbau von dieser Technik auf typisierte Datasets ist quasi ein kompletter rewrite der Anwendung und würde ich daher nicht wirklich empfehlen.

    @Hatori eine einfache Lösung für dieses Problem ist es, dein erstelltes GraduierungsModel der Liste vorHandeneGrade hinzuzufügen und dann die DataSource der ListView zu erneuern.

    Edit:

    Hatori schrieb:

    Und zwar mit dem Ding ganz oben, welches auch eine stored procedure aufruft
    Falsch, du Initialisierst das Feld vorHandeneGrade mit dem Aufruf der Funktion wenn ein neues Objekt der Klasse erstellt wird. Wenn du das Feld nun jedoch abrufst, erhälst du nur den Wert der ursprünglichen Initialisierung zurück.

    Was du jedoch eher bräuchtest wäre eine ReadOnly Property.

    Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von „EaranMaleasi“ ()

    Stimmt, ich benutze Dapper.
    dein erstelltes GraduierungsModel der Liste vorHandeneGrade hinzuzufügen und dann die DataSource der ListView zu erneuern

    Da muss ich jetzt erst kurz drüber meditieren, ich denke aber, ich krieg raus, was gemeint ist :) Danke erstmal.
    Grüße aus Berlin
    ---
    Kuroi Fenikkusu Kampfsportverein e.V.
    https://www.spandau-ninja.de
    Ok, ich habs. Der letzte Hinweis hats gebracht:

    C#-Quellcode

    1. private void ListeGraduierungen()
    2. {
    3. GraduierungsListBox.DataSource = null;
    4. List<GraduierungsModel> VorHandeneGrade = GlobalConfig.Connections.GetGraduierungen();
    5. GraduierungsListBox.DataSource = VorHandeneGrade;
    6. GraduierungsListBox.ValueMember = "IdGraduierung";
    7. GraduierungsListBox.DisplayMember = "Graduierung";
    8. }


    Die Initialisierung da mit reinschreiben und es läuft tadellos. Damit erübrigt sich auch das ReadOnly. Zeile 4 und 5 könnte man auch in einer schreiben. Ich hab aber eben erst angefangen und wenn es zu kurz wird, kann ich es noch nicht wirklich nachvollziehen, was ich da gemacht hab - in der nächsten Version.
    Danke sehr.
    Grüße aus Berlin
    ---
    Kuroi Fenikkusu Kampfsportverein e.V.
    https://www.spandau-ninja.de

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