0

Ich verspreche, ich habe mir die Bazillion-Beiträge angesehen, die das gleiche Problem haben, also bitte vergib mir, dass ich immer noch ratlos bin.VB.net DataRow.RowState wird nicht aktualisiert

Ich habe ein VS2008-Smart-Device-Projekt, das ein stark typisiertes Dataset enthält. Der Benutzer kann Werte eingeben und speichern, indem er jedes Mal einen neuen Datensatz im Dataset erstellt. Wenn der Benutzer Werte bearbeiten möchte, wird ein modales untergeordnetes Formular mit mehreren Kombinationsfeldern angezeigt, die die möglichen Werte für eine akzeptable Eingabe zum Bearbeiten der Zeile enthalten. Jedes Kombinationsfeld wird im Konstruktor für das Kind Form in der Art und Weise unten gebunden:

With cmbSize 
     .DataSource = frmMain.dstConfig.Sizes 
     .DisplayMember = "Display" 
     .ValueMember = "Value" 
     .DataBindings.Add("SelectedValue", trowNewRow, "SIZE", True, DataSourceUpdateMode.OnPropertyChanged) 
End With 

dstConfig ist ein Datensatz von Tabellen, welche die Einschränkungen enthält. Die Bindung an die Anzeige- und Wertelemente der Quelle funktioniert einwandfrei.

trowNewRow ist ein Verweis auf die Zeile in dem Dataset, die vom Hauptformular übergeben wird, wenn der Benutzer ein Bearbeitungsverfahren einleitet, zum untergeordneten Formular, indem die Zeile als Parameter "ByRef" übergeben wird. Die starke Typisierung bleibt erhalten. Es kam mir in den Sinn, dass es eine Art von Trennung geben könnte, die mir nicht bewusst ist, wenn dies passiert. Ich übergebe die Referenz, indem ich eine "Select" -Prozedur für das Dataset durchführe und nach einem eindeutigen ID-Feld für die Zeile sortiere, die bearbeitet werden soll. Das Ergebnis ist ein Einzelarray mit stark typisierten Zeilen desselben Schemas wie die Datensätze, aus denen ich das erste (und einzige) Objekt als mein Objekt übergebe.

Nachdem der Benutzer die Änderungen durch Klicken auf eine Schaltfläche OK übermittelt hat, wird eine Prozedur ausgelöst, um zu bewerten, ob eine Änderung tatsächlich durchgeführt wurde. Der beste Weg, dies zu tun, war, den RowState von trowNewRow zu überprüfen. Der RowState bleibt jedoch unabhängig von den Änderungen "hinzugefügt". Manuelles Überprüfen der Werte der Zeile zeigt an, dass die Änderungen tatsächlich aufgezeichnet wurden. Ich habe überprüft, dass die AcceptChanges-Prozedur von trowNewRow nicht explizit von meinem Code aufgerufen wird.

Ich habe versucht, die folgenden: 1.) Aufruf des EndEdit Verfahren von trowNewRow 2.) manuell auf den Writevalue Comboboxen 3.) Der Aufruf der EndCurrentEdit Prozedur auf der Comboboxen Binding Objekte 4 durchgeführt wird.) Jede Kombination der oben genannten

Vielen Dank im Voraus für Ideen oder Lösungen.

+1

Relevante Code anstelle dieser zwei langen Absätzen könnte das Problem besser darzustellen und Langwierigkeit reduzieren. Wenn der rowstate hinzugefügt wird, bedeutet dies, dass der Datenadapter die Datenbank noch nicht aktualisiert hat. Da es ein newrow ist, bleibt es eine neue Zeile (egal wie viele Änderungen/Änderungen es gibt), bis Sie es speichern. – Plutonix

Antwort

1

Ein DataRow enthält zwei Sätze von Daten - Original und aktuell - und die RowState spiegelt die Beziehung zwischen ihnen. Wenn keine Originaldaten vorhanden sind, aber aktuelle Daten vorhanden sind, lautet die RowState . Wie @Plutonix sagt, wird keine Menge der Bearbeitung der aktuellen Daten Originaldaten hinzufügen, so dass die RowState bleibt Added bleibt, auch wenn Sie weitere Änderungen vornehmen. Wenn keine aktuellen Daten vorhanden sind, aber Originaldaten vorhanden sind, lautet die RowStateDeleted. Wenn die aktuellen Daten mit den Originaldaten übereinstimmen, ist RowStateUnchanged, ansonsten Modified.

Wenn Sie Update auf einem Datenadapter oder Tischadapter aufrufen, wird die InsertCommand für jede Added Reihe ausgeführt wird, wird die UpdateCommand für jede Modified Zeile ausgeführt und die DeleteCommand für jede Deleted Zeile ausgeführt wird. Nach erfolgreichem Speichern ruft der Adapter implizit AcceptChanges auf. Dadurch werden alle Deleted Zeilen aus der DataTable Zeile entfernt und die aktuellen Werte in Added und Modified Zeilen über die ursprünglichen Werte kopiert, wobei die RowState in Unchanged geändert wird.

Also, die RowState ist für Änderungen seit dem letzten Speichern in die Datenbank zu verfolgen. Sie können damit nicht feststellen, ob der Benutzer Änderungen an der Benutzeroberfläche vorgenommen hat, es sei denn, Sie speichern diese Änderungen nach jeder Änderung in der Datenbank. Wenn Sie eine feinere Änderungsverfolgung wünschen, müssen Sie diese selbst implementieren. Persönlich bin ich in diesen Fällen nicht gebunden, aber warten Sie, bis der Benutzer auf OK klickt, um die Daten in die DataRow zu schieben. Dadurch können Sie auch die letzte Bearbeitung abbrechen, ohne vorherige Bearbeitungen zu verlieren.