| 

.NET C# Java Javascript Exception

1
Eine DataTable ist an ein Formular gebunden. Wenn ich jetzt in dem Formular Werte eingebe und auf den Knopf Okay klicke, sollen die Werte in eine Datenbank gespeichert werden. Wie ermittle ich aber, welche Felder verändert wurden? Die Events ColumnChanged und RowChanged helfen nicht weiter, weil die auch beim Focus-Verlust einer TextBox gefeuert werden und natürlich nicht erst, wenn der Okay-Knopf geklickt wird. Was fehlt ist sowas wie ein IsDirty für jede TextBox. Gibt es sowas, oder was ist hier best practice?
21.02.2011
Schnurz 21 2
4 Antworten
2
Kein best practice aber konkret zur DataTable und deren Member:

Du bekommst den Zustand einer Zeile (DataRow-Objekt) über die RowState-Eigenschaft heraus.
Wenn du allerdings Werte vergleichen möchtest, dann wirst Du Dir die BeginEdit-Methode mal näher ansehen müssen.

Das ist jetzt sehr kurz und knapp aber dürfte Dich erstmal weiter bringen.
21.02.2011
Torsten Weber 691 1 8
Danke. Aber irgendwie hilft mir das nicht weiter. Wie kann ich die Felder in der Tabelle ermitteln, die sich verändert haben?
Schnurz 21.02.2011
Es gibt (zumindest mir) keine bekannte "IchWurdeGeändert"-Eigenschaft, die Du einfach nur auslesen musst. Du musst das RowChanged-Ereignis der DataTable überwachen, damit Du jede Änderung direkt mitbekommst. In diesem Ereignis kannst Du dann mit den geänderten Werten hantieren und individuelle Entscheidungen treffen. Zum Beispiel kannst Du im RowChanged-Ereignis eine Liste mit den Spaltennamen füllen, die sich gändert haben. In der Dokumentation zur BeginEdit-Methode ist ein vollständiges Beispiel dazu.
Torsten Weber 21.02.2011
1
Schau dir mal die GetChanges() Funktion der DataTable an. Die Funktion gibt dir eine kopie der System.Data.DataTable zurück über ein Parameter kannst du auch sagen welchen RowState du gern hättest.
22.02.2011
0
Noch ein anderer Ansatz.

Vielleicht kannst du deinen Code so ändern, dass er nicht mehr auf eine DataTable verbunden ist, sondern an Listen von Objekten eigener Klassen (Entitäten).
Diese Klasse könnte dann die Standardinterface wie IChangeTracking implementieren.

Von da an hast du es mit deinem Code selbst im Griff zu erkennen und auswerten zu können was isch geändert hat.

Es wäre eben etwas mehr zu tun aber dafür sauberer und variabler
22.02.2011
Gentlehag 1,0k 2 8
1
Datenbindung ist in jedem Fall vorzuziehen, bevor man da selbst Hand anlegt mit Lesen und Schreiben in die Controls.
Hubert 22.02.2011
Datenbindung schön und gut aber worauf?
Wieso nicht auf ein Model ?

Ansonsten bleibt eben noch ein Adapter um das Model auf die DB zu vereinen, aber dafür gibt es ja einige ansätze.
Gentlehag 23.02.2011
0
Schau dir einmal die Indexer-Überladungen der DataRow mit "DataRowVersion" an:
http://msdn.microsoft.com/de-de/library/ms135373%28v=VS.80%29.aspx.

Wenn du damit über alle Zeilen und Spalten läufst, solltest du per DataRowVersion.Current- und DataRowVersion.Original-Vergleich die Änderungen ermitteln können.
22.02.2011
tb 220 3

Stelle deine Datatable-Frage jetzt!