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?
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.
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.
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.
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
Wenn du damit über alle Zeilen und Spalten läufst, solltest du per DataRowVersion.Current- und DataRowVersion.Original-Vergleich die Änderungen ermitteln können.