aufrufen So habe ich eine DataSet
, die ich bevölkere. Zu Testzwecken enthält dies eine einzige DataTable
. Dies wird von einer Abfrage aufgefüllt, die ein SQL TABLE
zurückgibt, das zwei Spalten hat: ID
und Name
. Diese Tabelle enthält einen Datensatz.HasChanges() ist immer falsch, wenn Zeilen geändert werden, wenn ich die BindContext EndCurrentEdit() -Methode des Formulars
Ich habe eine einziges TextBox
, dass ich in der folgenden Art und Weise binden:
Dim dv As System.Data.DataView = myDataSet.Tables("MyTable").AsDataView()
dv.RowFilter = "ID=1"
Dim dabi As New Binding("Text", dv, "Name")
txtInput.DataBindings.Add(dabi)
Das alles funktioniert gut in der Anwendung! Die TextBox
wird mit dem Wert aus der DataSet
gefüllt, und der Wert in der DataSet
wird aktualisiert, wenn ich Zeug in die TextBox
eingeben.
Also, ich mache eine in der TextBox
, und dann gehe ich, um es zu speichern.
Ich rufe myDataSet.HasChanges()
. Es gibt False
zurück, obwohl ich eine Änderung vorgenommen habe. Die Forschung legt nahe, dass dies etwas mit der Zeile zu tun hat, die nicht glaubt, dass die Bearbeitung "fertig" ist, aber ich bin mir nicht sicher, da ich keine gute Quelle für Informationen darüber gefunden habe, wie das alles funktioniert.
Ich habe auch entdeckt, dass HasChanges()
den korrekten Wert (False
für keine Änderungen, True
für Änderungen) zurück, wenn ich den Anruf zu myDataSet.HasChanges()
mit der folgenden Zeile vorangestellt:
Me.BindingContext(myDataSet.Tables("MyTable")).EndCurrentEdit()
Dies ist ein Verfahren nach etwas gerufen werden, was eine Art von globalem Bindungskontext zu sein scheint. Ich habe damit noch nichts gemacht oder irgendwelche "Begin Edit" -Methoden aufgerufen (die Forschung legt nahe, dass solche Dinge privat und implizit aufgerufen werden können).
Meine Fragen dann: Was ist hier los? Warum muss diese Leitung für HasChanges()
funktionieren? Mache ich etwas falsch in meiner Datenbindung, um diese Linie zu benötigen? Hat diese Linie möglicherweise unvorhergesehene Nebenwirkungen?
EDIT:HasChanges()
korrekt wahr zurück, wenn neue Zeilen sind -EndCurrentEdit()
ohne den Anruf hinzugefügt, das Problem nur mit Änderungen an bestehenden Reihen entsteht.
HasChanges kann nur funktionieren, nachdem Sie Ihrem Dataset mitgeteilt haben, dass Sie mit der Bearbeitung dieses Datensatzes fertig sind. Wenn Sie zum Beispiel in einem DataGridView bearbeiten, würde es beim Ändern von Feldern den Wert false zurückgeben, solange Sie den gleichen Datensatz beibehalten. Sobald Sie zu einem anderen Datensatz wechseln, wird True zurückgegeben. Da Sie eine EditBox verwenden, können Sie nicht zu einem anderen Datensatz wechseln und müssen sagen, dass Sie fertig sind, indem Sie die EndEdit-Methode aufrufen. Dieser Mechanismus ist nützlich, um mehr als ein Feld für den gleichen Datensatz zu bearbeiten und den gesamten Datensatz auf einmal zu ändern, anstatt Feld für Feld. – GuidoG
Es scheint tatsächlich eine 'EndEdit'-Methode für eine' DataRow' zu geben. Gibt es einen guten Grund, dies für jeden Datensatz zu tun, anstatt einfach "EndCurrentEdit" global aufzurufen? Aus Gründen der Übersichtlichkeit würde ich mich mit einigen verschiedenen Steuerelementen beschäftigen, die sich jeweils mit einem anderen Datensatz befassen. Das Speichern erfolgt nur, wenn die Schaltfläche zum Speichern gedrückt wird. – Interminable
Ich erkläre allgemein die globale EndCurrentEdit() als erste Codezeile in meinem Speichern-Tastencode. Bei anderen Methoden, bei denen ich einen Wert in einem Datarow im Code ändere, rufe ich die Methode datarow endedit() auf. – GuidoG