Dataadapter insert in Datatable, aber Datagridview mit Datatable als Datasource übernimmt Änderungen erst nach verlassen der Form

  • VB.NET

Es gibt 6 Antworten in diesem Thema. Der letzte Beitrag () ist von T-BoneSteak.

    Dataadapter insert in Datatable, aber Datagridview mit Datatable als Datasource übernimmt Änderungen erst nach verlassen der Form

    Hallo liebe Programmierer,

    Ich habe auf meiner Form ein Datagridview. Dieses ist über die Datasource an einen Datatable aus einem Dataset gebunden. Mit einer dataadapter.inser Anweisung möchte ich eine neue Zeile hinzufügen. Dies funktioniert auch wunderbar. Jedoch wird die neue Zeile erst nach Schließen und wieder öffnen der Form angezeigt.

    VB.NET-Quellcode

    1. Me.UserstofavoritsTableAdapter.InsertFavorit(Now, usr_id, dgv_Eepa.CurrentRow.Cells("eepa_id").Value, "")
    2. EepaDataSet.userstofavorits.AcceptChanges()
    3. dgv_Favorits.Refresh()


    Dies ist mein bisheriger Code. Hoffe ihr könnt mir helfen. :saint:


    Euer Steak
    Der Denkfehler ist, dass du den Datensatz in die Datenbank einfügst - da kann das DGV den natürlich nicht sehen.

    Füge den Datensatz in der DataTable ein - ein gebundenes DGV zeigt solch sofort an.

    Gugge vier Views-Videos , insbesondere das Vid zum Coden in typisierter Manier.

    Fast ausnahmslos jeder, der mit typisiertem Dataset in Kontakt kommt, verfällt zunächst auf die untypisierte Manier und codet, was man als Ranz bezeichnen muss.
    Konnte das Problem lösen. Vielen Dank für die schnelle Hilfe :thumbup:
    Hier noch mein Code, falls jemand vor dem selben Problem steht.

    VB.NET-Quellcode

    1. Dim addfav As eepaDataSet.userstofavoritsRow
    2. addfav = EepaDataSet.userstofavorits.NewRow
    3. addfav.ufa_timestamp = Now
    4. addfav.ufa_to_usr_id = usr_id
    5. addfav.ufa_to_fav_id = dgv_Eepa.CurrentRow.Cells("eepa_id").Value
    6. addfav.ufa_history = ""
    7. EepaDataSet.userstofavorits.AdduserstofavoritsRow(addfav)
    8. Me.UserstofavoritsTableAdapter.Update(Me.EepaDataSet.userstofavorits.GetChanges(DataRowState.Added)) 'Neue Favorit werden gleich gespeichert
    9. Me.Validate()
    10. UserstofavoritsBindingSource.EndEdit()
    11. EepaDataSet.userstofavorits.AcceptChanges()
    12. dgv_Favorits.Refresh()
    Wichtig!!
    Option Strict On!

    und dann die typisierte NewRow-Methode ( ich sags ja: Niemand macht das von anfang an richtig ;) )

    VB.NET-Quellcode

    1. Dim addfav = EepaDataSet.userstofavorits.NewUserstofavoritsRow


    und zeilen #1,#9 - #12 weglassen

    ach, zeile #5 gabscht auch noch ins DGV :thumbdown: - das ist sicherlich auch unnötig, aber für konkretes müsste ich das projekt selbst vorliegen haben.
    Allgemein: Daten holt man aus der BindingSource, nicht aus dem gebundenen Control. ist in dem Vid auch gezeigt.
    Okay sehr schön, läuft einwandfrei:) Muss nicht unbedingt sein aber wäre jetzt noch die Kirsche auf dem Sahnehaufen:
    Wenn ich nun auf diese Weise einen neuen Favoriten zu userstofavorits hinzufüge ist die ID (Primery Key generiert automatisch ID) -1. Erst nach schließen der Form und erneutem Öffnen wird die richtige ID angezeigt. Fügt man nun einen Favoriten hinzu und möchte ihn aber gleich wieder Löschen, ist mir bisher kein Lösungsweg eingefallen, da ja eben die ID fehlt.
    ja, das ist auch ziemlich aufwändig, DB-Zugriffe richtig zu handeln, besonders die Inserts.
    Entweder du verwendest typisierte TableAdapter, die VS dir generiert.
    Das sind aber schnellmal 10000 Zeilen generierter Code, und nach meiner Erfahrung funktioniert das auch nur mit Sql-Server zuverlässig - aber vlt. haben sie auch inzwischen für SqlCe oder gar für Access nachgebessert.
    (Ah - ich sehe grade: Du verwendest ja bereits typTableAdapter, und offensichtlich failt das dennoch.)

    Oder du verwendest das Framework was ich gecodet hab, das sind glaub auch bis zu 10000 Zeilen, aber dabei bleibt es, während die typTableadapter für jede DataTable um >1000 Zeilen wachsen: DBExtensions - allgemeine Lösung der Daten-Persistierung via Datenbanken


    jdfs das Prinzip bei den Inserts ist, dass der DataAdapter nach jedem Inserteten Datensatz einen Select nachschießt, um zu erfragen, welchen Primkey die DB für den neuen DS generiert hat.
    Dieser Primkey wird dann ins Dataset eingepflegt.