Laden...

Wie kann ich alle DataGrid Änderungen erst zwischenspeichern und gesammelt an Datenbank senden?

Erstellt von LelViLamp vor 3 Jahren Letzter Beitrag vor 3 Jahren 716 Views
L
LelViLamp Themenstarter:in
2 Beiträge seit 2020
vor 3 Jahren
Wie kann ich alle DataGrid Änderungen erst zwischenspeichern und gesammelt an Datenbank senden?

Hallo zusammen, das hier ist mein erster Post in diesem Forum, nachdem ich beim ewigen Googlen nach Lösungen immer wieder mal hier gelandet bin und dadurch "gerettet" wurde.

Meine Fragestellung ist, dass ich Daten aus einer Datenbank als Liste bekomme und diese in einem DataGrid zur Bearbeitung anzeigen möchte. Sie kommen als Objekte, sagen wir, der Klasse FreundeDaten und stellen einige Wertetypen der Art string Vorname, string Nachname, int AnzahlGeschwister, usw. zur Verfügung; die Datenbank liefert dann eine List<FreundeDaten>.

Man soll neue Einträge durch Button NewEntry_btn hinzufügen, das aktuell ausgewähle Element durch Klick auf Button DeleteSelection_btn löschen und bestehende Einträge durch Bearbeiten direkt im DataGrid ändern können.

Sämtliche Änderungen sollen erst mit Klick auf den Speichern_btn-Button gesammelt zurück zur Datenbank gesendet werden.

Mein Ansatz war nun, drei einzelne List<FreundeDaten> zu erstellen (_ChangesList, _NewEntriesList, _DeletionsList) und es scheitert daran, Elemente, bei denen ich z.B. auf Löschen geklickt habe, dann nicht mehr anzuzeigen bzw. neue Elemente in die Liste einzufügen. Außerdem bekomme ich es nicht hin, die geänderten Daten in die Liste einzufügen, das habe ich über das SelectionChanged-Ereignis des DataGrids versucht, es werden aber Daten auch dann zur Liste hinzugefügt, wenn ich diese gar nicht bearbeitet habe.

Bin ich mit meinem Ansatz auf dem richtigen Weg? Gibt es eine (ggf. abweichende) Standardlösung dafür? Ich glaube, dass ich an dem Punkt bin, wo ziemlich alle zeitsparend ist.

Vielen Dank euch allen 🙂

T
2.219 Beiträge seit 2008
vor 3 Jahren

Was du suchst wäre vermutlich UnitOfWork als Muster.
Dort sammelst du deine neuen, bearbeiteten und gelöschten Einträge.
Erst wenn du fertig bist mit sammeln, werden diese dann gebündelt verarbeitet.
Dafür solltest du dir dann eine Klasse anlegen, die dann die Einträge in deinen Listen sammelt und am Ende auch an deine DAL schickt.

Mit den drei Listen bist du schon auf dem richtigen Weg, sollte dann aber in einer eigenen Klasse durch entsprechende Methoden befüllt werden.

Nachtrag:
Die Anzeige musst du dann so lösen, dass die Einträge nicht immer neu aus der Datenbank geladen und gebunden werden.
Auch müssen die Einträge dann ihre Zustände(Neu, Bearbeitet, Gelöscht) bzw. über die UnitOfWork Klasse geprüft werden ob der Eintrag bereits gelöscht wurde.
Nur dann kannst du auch die gelöschten ausblenden.

T-Virus

Developer, Developer, Developer, Developer....

99 little bugs in the code, 99 little bugs. Take one down, patch it around, 117 little bugs in the code.

16.806 Beiträge seit 2008
vor 3 Jahren

So funktioniert WPF nicht.

WPF ist darauf ausgelegt, dass Du den MVVM Pattern verwendest ( [Artikel] MVVM und DataBinding). Das bedeutet, dass Du ein ViewModel mit der Liste der Elemente hast, die im Grid angezeigt werden sollen.

Was Du machen musst ist nun die Changes bzw. den State zu tracken.
Man kann das nun über zig Wege machen, zB über ein einfaches Property des States im jeweiligen ViewItem der ObservableCollection oder halt über entsprechende Pattern wie Unit of Work.

Frameworks wie ReactiveUI, die WPF und MVVM erweitern, haben nen eigenes State und Data Persistance Handling.
Evtl. ist das auch was für Dich.

Letzten Endes geht es ja nur darum eine Liste zu tracken und diese mit Hilfe eines Buttons dann zu Committen.
In der Theorie ist das immer simpel.. aber dann hast hinterher natürlich auch die Themen wie Context-Synchronität, optimistic vs pessimistic concurrency etc etc...

L
LelViLamp Themenstarter:in
2 Beiträge seit 2020
vor 3 Jahren

Hi ihr beiden,

vielen herzlichen Dank für eure Antworten. Ich hatte befürchtet, dass es auf das MVVM hinauslaufen wird - ich erkenne eh, dass das sehr sinnvoll und praktisch ist, aber es widerspricht meinen bisher aufgebauten Intuitionen (die ja nicht unbedingt sinnvoll sind).

Ich werde den Link zum MVVM und das Unit of Work durcharbeiten und mal schauen, wie weit ich komme.

Bis dann! 🙂