2016-07-29 30 views
0

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.

+0

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

+0

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

+0

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

Antwort

0

Mit dem Aufruf EndCurrentEdit werden die Änderungen, die Sie an einem IEditableObject vorgenommen haben, in der zugrunde liegenden Datenquelle gespeichert.

Da die DataRowView implementiert IEditableObject, ruft EndCurrentEdit der Währungsmanager Ursache EndEdit von DataRowView aufgerufen und verpflichtet sich Änderungen an der zugrunde liegenden DataRow und beendet die Bearbeitungssitzung.

Auch wenn Sie die Position mithilfe der Bindungsquelle ändern oder die Position ändern, indem Sie auf eine andere Rasterzeile klicken, ändern Sie die Position des Währungsmanagers, wenn Sie die Position EndCurrentEdit aufrufen.

Um Änderungen zu bestätigen, sollten Sie EndCurrentEdit direkt oder indirekt aufrufen.

+0

Seit du gesagt hast * Forschung legt nahe, dass dies etwas mit der Reihe zu tun hat, nicht glauben, dass die Bearbeitung 'fertig' ist, aber ich bin mir da nicht sicher, da ich keine gute Informationsquelle gefunden habe Das funktioniert alles. * Ich habe versucht, einige offizielle Quellen mit Beschreibungen darüber zu teilen, warum Sie 'EndCurrentEdit' aufrufen sollten. –

+0

Lassen Sie mich wissen, wenn Sie Fragen zur Antwort haben :) –