Wann muss der Datensatz aktualisiert werden?

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

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

    Wann muss der Datensatz aktualisiert werden?

    Hallo,

    ich habe ein DGV gebunden über BindingSource an ein DataSet, das mittels DataAdapter/Commandbuilder gefüllt und geupdated werden kann.

    Die Tabelle enthält eine Boolean-Spalte, dies ist die einzige editierbare Spalte im DGV. Die BindingSource filtert nur Haken = True, das heißt man kann nicht mal Haken setzen, nur Haken nehmen.

    Tut man dies und verlässt die Zeile verschwindet diese entsprechend. Wie übernehme ich die Änderung? Bzw. wo muss ich Adpt.Update aufrufen?
    Auf nem expliziten Speichern Button ist nicht gut, weil wenn die Zeile verschwindet könnte ich ja gut vergessen, dass die mal da war und benutze den Button gar nicht. Das Ganze müsste im Verschwindemoment automatisch passieren.
    Gibt es da ein Event, das ich nutzen kann? Ich habe CellEndEdit versucht, da sind die Änderungen aber noch nicht in die Tabelle vorgedrungen. Alle anderen Events feuern mir auch ohne Userinput.

    Viele Grüße
    Ah da muss man erstmal drauf kommen, die DataTables stehen ja nicht aufm Form deswegen kann man diese Events nicht in der Liste finden.

    VB.NET-Quellcode

    1. Private Sub dt_Changed(sender As Object, e As dtRowChangeEvent) Handles DS1.dt.dtRowChanged
    2. If e.Row.RowState = DataRowState.Modified Then
    3. adpt.Update(DS1.dt)
    4. End If
    5. End Sub
    Jo, wenn man Databinding-basiert entwickelt hat man eine recht hübsche Trennung von GUI und Daten, entfernt ähnlich dem MVVM-Pattern der WPF.

    DataTable-Events zu behandeln ist übrigens oft ziemlich heikel.
    Nämlich bei "Massen-Operationen" werden entsprechend massenhaft auch Events gefeuert.
    Ist glaub bei deim RowChanged jetzt nicht so kriegs-entscheidend, es sei denn, dir fällt mal ein, mit einer Schleeife über die DataTable zu laufen und alle diese Bools zu setzen.
    Da wwird dann für jede Zeile ein Datenbank-Zugriff vom Stapel gelassen.

    ErfinderDesRades schrieb:

    Da wwird dann für jede Zeile ein Datenbank-Zugriff vom Stapel gelassen.


    Was ich in solchen Fällen gerne mache, ist ich baue einen DatabaseController auf, der dann diverse Operationen übernimmt.
    Wenn ich weiß, dass viele Datensätze angepasst werden, dann gruppiere und verbinde ich solche Aufrufe dann wo es geht.

    So kann man die Aufrufe zumindst in einem Batch abarbeiten; muss man nur so programmieren, dass man am Ende alles wieder auseinander bekommt.
    Quellcode lizensiert unter CC by SA 2.0 (Creative Commons Share-Alike)

    Meine Firma: Procyon Systems

    Selbstständiger Softwareentwickler & IT-Techniker.
    ich mach anners: ich hab ein bischen Helper-Brimborium, womit ich sämtliche DataTable-Events des gesamten Datasets abschalten kann.
    Das Helferlein ist eine Extension, die IDisposable returnt, so kann ich mit einem Usingblock ganz sicher coden, dass die Events hinterher auch wieder angeschlossen werden.

    VB.NET-Quellcode

    1. Using Dts.SuppressEvents
    2. 'massenOperationen()
    3. 'evtl: adp.Update()
    4. End Using
    naja, da sind noch mehr Helferlein, etwa eines, was immer sämtliche Tabellen des Datasets updated.
    Controller weiss ich nicht wirklich was das ist - ich glaub da versteht jeder was anderes drunter.
    Vielleicht sind meine Helferlein ja ein Controller.
    Jedenfalls ist das ganz generisch, und ich kanns auf jede Datenbank anwenden, ohne iwelchen Code anpassen zu müssenn - einfach einbinden und anwenden.
    Ja, so wäre es aber DataRowState.Added, wenn der Eintrag wirklich neu ist, das prüfe ich schon im Handler. Wenn man mit Primary Key arbeitet, darf er aber natürlich nicht mehr stumpf hinzufügen, sondern muss gucken ob der Datensatz schon da ist.
    Und dann wird DataRowState.Modified gesetzt und ich denke mal selbst dann, wenn der Datensatz in allen Non-Key Feldern gleich bleibt.