myCSharp.de - DIE C# und .NET Community
Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 
 | Suche | FAQ

» Hauptmenü
myCSharp.de
» Startseite
» Forum
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Suche
» Regeln
» Wie poste ich richtig?
» Forum-FAQ

Mitglieder
» Liste / Suche
» Wer ist wo online?

Ressourcen
» openbook: Visual C#
» openbook: OO
» Microsoft Docs

Team
» Kontakt
» Übersicht
» Wir über uns

» myCSharp.de Diskussionsforum
Du befindest Dich hier: Community-Index » Diskussionsforum » Entwicklung » GUI: WPF und XAML » Wie kann ich alle DataGrid Änderungen erst zwischenspeichern und gesammelt an Datenbank senden?
Letzter Beitrag | Erster ungelesener Beitrag Druckvorschau | Thema zu Favoriten hinzufügen

Antwort erstellen
Zum Ende der Seite springen  

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

 
Autor
Beitrag « Vorheriges Thema | Nächstes Thema »
LelViLamp
myCSharp.de-Mitglied

Dabei seit: 22.06.2020
Beiträge: 2


LelViLamp ist offline

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

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

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 smile
Neuer Beitrag 22.06.2020 17:17 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
T-Virus T-Virus ist männlich
myCSharp.de-Mitglied

Dabei seit: 17.04.2008
Beiträge: 1.594
Entwicklungsumgebung: Visual Studio, Codeblocks, Edi
Herkunft: Nordhausen, Nörten-Hardenberg


T-Virus ist offline Füge T-Virus Deiner Kontaktliste hinzu

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

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

Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von T-Virus am 22.06.2020 17:57.

Neuer Beitrag 22.06.2020 17:55 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Abt
myCSharp.de-Team

avatar-4119.png


Dabei seit: 20.07.2008
Beiträge: 14.167
Herkunft: Stuttgart/Stockholm


Abt ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

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...
Neuer Beitrag 22.06.2020 17:57 Beiträge des Benutzers | zu Buddylist hinzufügen
LelViLamp
myCSharp.de-Mitglied

Dabei seit: 22.06.2020
Beiträge: 2

Themenstarter Thema begonnen von LelViLamp

LelViLamp ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

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! smile
Neuer Beitrag 28.06.2020 10:52 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Baumstruktur | Brettstruktur       | Top 
myCSharp.de | Forum Der Startbeitrag ist älter als 2 Monate.
Der letzte Beitrag ist älter als 2 Monate.
Antwort erstellen


© Copyright 2003-2020 myCSharp.de-Team | Impressum | Datenschutz | Alle Rechte vorbehalten. | Dieses Portal verwendet zum korrekten Betrieb Cookies. 20.09.2020 12:22