Datarow vor speichern auf Änderung prüfen

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 8 Antworten in diesem Thema. Der letzte Beitrag () ist von AndPod.

    Datarow vor speichern auf Änderung prüfen

    Hallo,

    ich arbeite an einer Anwendung, welche an eine MySQL Datenbank gebunden ist. Die Formulare sind so aufgebaut, das ich im Datagridview die Datensätze der einzelnen Tabelle sehe, die notwendigen Felder aber über andere Steuerelemente bearbeite (Textbox, Checkbox, DateTimePicker usw).
    Nun würde ich gerne prüfen, ob sich etwas am aktuellen Datensatz geändert hat sobald der Benutzer den nächsten auswählt.
    Die

    Quellcode

    1. .HasChanges
    Option des Datasets funktioniert aber nur, wenn ich vorher

    Quellcode

    1. BindingSource.EndEdit
    ausgewählte habe. Dann kann ich aber nicht mehr

    Quellcode

    1. BindingSource.CancelEdit
    nutzen falls der Benutzer die Änderungen an diesen Datensatz nicht speichern will.
    Unter Access konnte man dies mit "BeforeUpdate" bewerkstelligen, unter vb.net (Visual Studio 2015) habe ich bisher nichts passendes finden können. Gibt es da nichts oder denke ich irgendwo falsch?

    Edit: Die Funktion Dataset.RejectChanges scheint wohl erstmal ganz hilfreich für mich, diese macht sämtliche Änderungen im Dataset seit dem letzten speichern rückgängig. Ist zwar erstmal eine Holzhammer-Methode, aber besser wie nichts. Aber vielleicht hat ja doch noch wer einen anderen Vorschlag.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „AndPod“ ()

    AndPod schrieb:

    .RejectChanges
    gibts acuh für einzelne Tabwllen, und glaub sogar für einzelne Rows
    Problematisch dabewi ist, dass .Rejectchanges auf den Zustand des letzten Ladens bzw. letzten Abspeicherns der Daten zurücksetzt.
    In Szenarien, wo Änderungen nicht jedesmal sofort gespeichert werden, sondern wo der User multiple Änderungen machen kann, und dann alles in eine, Aufwasch speichern, wird das mit dem RejectChanges ungeeignet.

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „ErfinderDesRades“ ()

    Da hätte ich ja auch mal ein Tick weiter denken können. Danke dir :thumbup:
    Da ich die Nutzer meiner Anwendung leider kenne (warum bewirbt man sich auf einen Computer-Arbeitsplatz wenn man nicht mit der Technik umgehen kann und will), soll der Anwender beim (vor) Datensatzwechsel gefragt werden, ob er die Änderung speichern will. Das ist zumindest bei den meisten Formularen so, gerade was das bearbeiten von Stammdaten angeht. Hast mir also sehr geholfen, damit ich nicht die Holzhammer-Methode anwenden muss :)

    Nachtrag:
    Falls jemand vor einem ähnlichen Problem stehen sollte:
    Ohne Bezug zum Datagrid:

    Quellcode

    1. Dim bm As BindingManagerBase = Me.BindingContext(Me.DataSet.DataTable)
    2. Dim dr As DataRow = CType(bm.Current, DataRowView).Row
    3. dr.RejectChanges()


    Mit Bezug zum Datagrid (darf laut anderer Seite aber nicht sortiert sein):

    Quellcode

    1. Dim bm As BindingManagerBase = Me.Datagrid.BindingContext(Me.Datagrid.DataSource, Me.Datagrid.DataMember)
    2. Dim dr As DataRow = CType(bm.Current, DataRowView).Row
    3. dr.RejectChanges()

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „AndPod“ ()

    @us4711
    Das liegt bei mir in einer Funktion, welche nach RowValidating aufgerufen wird. Ist zumindest der Plan, ich bin noch dabei, deswegen ist das jetzt nur der relevante Code.
    Bei der Funktion fncDialogForm rufe ich eine selbst erstellte "Messagebox" auf, da kannst du auch die normale verwenden. Ich habe auch die Begriffe angepasst, bei mir heißt die Datatable nicht DataTable ;)

    Quellcode

    1. Me.DataTableBindingSource.EndEdit()
    2. If Me.DataSet.HasChanges Then
    3. Dim result As DialogResult
    4. result = fncDialogForm(Me, 1, "Datensatz speichern?")
    5. If result = DialogResult.Cancel Then
    6. Exit Sub
    7. ElseIf result = DialogResult.No Then
    8. Dim bm As BindingManagerBase = Me.BindingContext(Me.DbLeiKaDataSet.tblSdRegionalbereich)
    9. Dim dr As DataRow = CType(bm.Current, DataRowView).Row
    10. dr.RejectChanges()
    11. Exit Sub
    12. End If
    13. Me.DataTableTableAdapter.Update(Me.DataSet.DataTable)
    14. End If
    @'AndPod
    Ah, ok. Würd nicht auch gehen:

    VB.NET-Quellcode

    1. Dim dr As DataRow = DirectCast(DirectCast((Me.DataTableBindingSource.Current , DataRowView).Row, DataRow)
    .
    Und wo kommt das Event RowValidating her?