Zeilen in DGV löschen -> hierbei Relationen berücksichtigen und in DB aktualsieren

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

Es gibt 2 Antworten in diesem Thema. Der letzte Beitrag () ist von Duke.

    Zeilen in DGV löschen -> hierbei Relationen berücksichtigen und in DB aktualsieren

    Hi zusammen,

    noch mal ein Frage:

    Ich habe hier ein typ. Dataset das tabellenweise mittels TableAdapter.Fill() gefüllt wird.
    Jetzt möchte ich unter anderem auch mal Parent-Rows löschen. Durch die gesetzte Cascade-Beziehung
    im Dataset-Editor werden wie erwartet auch die Child-Rows auf "Deleted" gesetzt.

    (...es können noch weitere Änderungen vorhanden sein (Modified etc.))

    Wenn ich das richtig sehe, muss ich jetzt erstmal in umgekehrter Reihenfolge ein Update, beginnend mit den Child-Tabellen durchführen

    Das mache ich über

    Visual Basic-Quellcode

    1. ChildAdapter.Update(Childtable.GetChanges(DataRowState.Deleted))
    2. ParentAdapter.Update(Parenttable.GetChanges(DataRowState.Deleted))


    Durch Table.GetChanges wird aber neue neue Tabelle erzeugt, so dass der Row-State in der Originaltabelle
    nicht aktualisiert wird. Dadurch werden die eigentlich schon gelöschten Rows beim Folgeaufruf in richtiger Reihenfolge (Parent zuerst)
    für alle anderen Row-States (z. B. Added/Modified)

    Visual Basic-Quellcode

    1. ParentAdapter.Update(Parenttable)
    2. ChildAdapter.Update(Childtable))


    wieder mit gefunden und es tritt ein Fehler auf.

    Frage: Wie bekomme ich am besten die RowStates "mitgenommen", so dass die
    Folgeaufrufe von Update für alle anderen Row-States nicht in einen Fehler laufen.

    Ich denke, es kann doch nicht Sinn der Sache sein, für jede Row den State einzeln zu aktualisieren setzen, oder ?(
    Oder gehe ich an die ganze Sache falsch ran ?

    Also, wie mach ich's richtig ?


    Edit:

    Ich hab's jetzt so gemacht :
    (aber vielleicht gibt es ja noch was Eleganteres)

    Visual Basic-Quellcode

    1. ChildAdapter.Update(Childtable.GetChanges(DataRowState.Deleted))
    2. ParentAdapter.Update(Parenttable.GetChanges(DataRowState.Deleted))
    3. ParentAdapter.Update(Parenttable.GetChanges(DataRowState.Added & DataRowState.Modified))
    4. ChildAdapter.Update(Childtable.GetChanges(DataRowState.Added & DataRowState.Modified))
    5. Childtable.AcceptChanges()
    6. Parenttable.AcceptChanges()

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

    hm, interessant.

    Danke


    Edit:

    So, ich hab beim "ErfinderdesRades" mal ein wenig abgeguckt und meine Update-Lösung sieht jetzt so aus:

    VB.NET-Quellcode

    1. Public Shared Sub UpdateTable(dTable As DataTable, tAdapter As Object, rStates As DataRowState)
    2. If rStates > 0 Then
    3. Dim rowsToChange() As DataRow = dTable.Select("", "", rStates)
    4. If rowsToChange IsNot Nothing AndAlso rowsToChange.Count > 0 Then
    5. tAdapter.Update(rowsToChange)
    6. End If
    7. Else
    8. tAdapter.Update(dTable)
    9. End If
    10. End Sub


    Die Funktion rufe ich in zwei Durchgängen für die Tabellen auf (einmal für Delete und einmal für die anderen RowStates)
    Auf die Lösung mit dem "Select" hätte auch selber kommen können < :whistling: -> doof >.

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