Problem beim löschen von Zeilen

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

Es gibt 13 Antworten in diesem Thema. Der letzte Beitrag () ist von ErfinderDesRades.

    Problem beim löschen von Zeilen

    Hi,

    ich habe ein Problem beim löschen von Zeilen.

    Ich gehe wie folgt vor:


    1:

    VB.NET-Quellcode

    1. Dim TableName As String = "[Table_" & Name & "_DB]"
    2. Dim queryString As String = "SELECT * FROM dbo." & TableName
    3. SQL_TableAdapter = New SqlDataAdapter(queryString, VarConnectionString)
    4. SQL_TableAdapter.Fill(SQL_DataSet, TableName)
    5. SQL_BindingSource.DataSource = SQL_DataSet.Tables(TableName)
    6. DataGridView_DB.DataSource = SQL_BindingSource


    Nun habe ich die Einträge aus meiner SQL Datenbank in dem Datagridview. Wenn ich nun die letzte Zeile markiere und diese dann wie folgt lösche:

    VB.NET-Quellcode

    1. For Each selectedRow As DataGridViewRow In DataGridView_DB.SelectedRows
    2. Me.DataGridView_DB.Rows.Remove(selectedRow)
    3. Next
    4. Dim TableName As String = "[Table_" & Name & "_DB]"
    5. Dim cb As SqlCommandBuilder = New SqlCommandBuilder(SQL_TableAdapter)
    6. SQL_TableAdapter.Update(SQL_DataSet, TableName)
    7. SQL_TableAdapter.DeleteCommand = cb.GetDeleteCommand(True)
    8. SQL_TableAdapter.UpdateCommand = cb.GetUpdateCommand(True)
    9. SQL_TableAdapter.InsertCommand = cb.GetInsertCommand(True)
    10. Me.DataGridView_DB.DataSource = SQL_BindingSource


    Funktioniert das Löschen ohne Probleme. Der Eintrag wird gelöscht.

    Nun zum Problem. Wenn ich aber anstatt die letzte Zeile im Datagridview markiere, irgendwo zwischendrin, erhalte ich diesen Fehler in einer MessageBox:

    Quellcode

    1. Auf gelöschte Zellinformationen kann nicht über die Zeile zugegriffen werden


    Der Fehler wird bei

    Quellcode

    1. Me.DataGridView_DB.Rows.Remove(selectedRow)
    ausgelöst. Wenn ich den Codebereich in Try/Catch setze, erhalte ich den Fehler trotzdem. Nachdem ich den Fehler weggeklickt habe, wird die Zeile aber gelöscht und die Datenbank wird auch erfolgreich gespeichert.

    Ich weiß nun nicht wie ich diesen Hinweis ausgeblendet bekomme bzw. korrigieren kann.



    Folgendes habe ich probiert:

    - Zeile in der BindingSource suchen und dann in dieser löschen
    - Über RowState den Status auslesen und nur wenn nicht "Deleted" die Methode ausführen

    Kann mir da einer helfen?

    Danke Euch.
    Hi @mrMo

    Ich habe es nun wie folgt versucht:

    VB.NET-Quellcode

    1. For Each selectedUser As DataGridViewRow In DataGridView_DB.SelectedRows.Cast(Of DataGridViewRow).Reverse
    2. Me.DataGridView_DB.Rows.Remove(selectedUser)
    3. Next


    Es kommt derselbe Fehler. Wie beschrieben, kommt der Fehler auch wenn ich eine einzige Zeile lösche.
    Ich dachte eher an sowas. Syntax zum entfernen der row hab ich grad nicht im Kopf, denke aber es sollte klar sein was ich meine.

    VB.NET-Quellcode

    1. for i as Integer = 100 to 0 Step -1
    2. removerow(i)
    3. Next
    "Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. Lehre einen Mann zu fischen und du ernährst ihn für sein Leben."

    Wie debugge ich richtig? => Debuggen, Fehler finden und beseitigen
    Wie man VisualStudio nutzt? => VisualStudio richtig nutzen
    Hä, das Beispiel von @VB1963 sollte für dein Anliegen doch passen.
    "Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. Lehre einen Mann zu fischen und du ernährst ihn für sein Leben."

    Wie debugge ich richtig? => Debuggen, Fehler finden und beseitigen
    Wie man VisualStudio nutzt? => VisualStudio richtig nutzen
    Die SelectedRows sind eine Ansammlung von Rows. Und da jede Row einen Index hat … Musste dann aber mit RemoveAt arbeiten.
    Genauso gut könntest Du aber auch schreiben: DataGridView_DB.Rows.Remove(DataGridView_DB.SelectedRows(i))
    Allerdings stell ich jetzt mal wieder die Frage, ob das Löschen von DGV-Zeilen bei ner Datenbankanbindung sinnvoll ist.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Sorry, da muss ich passen. Bei Datenbanken bin ich nich nicht. :D Aber wenn ne DataTable dranhängt, wird normalerweise in der DataTable gelöscht, nicht im DGV. Oder über die BindingSource.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Also im Grunde kann man die Daten aus der Datenquelle (DataTable, List(OF T), etc.) entfernen und Parallel in der DB löschen. Das Grid selber zeigt nur Daten an oder nimmt Eingaben entgegen. Ich kenn mich mit deinen TableAdaptern und Co. allerdings nicht aus, ich schreib das SQL lieber selbst.
    "Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. Lehre einen Mann zu fischen und du ernährst ihn für sein Leben."

    Wie debugge ich richtig? => Debuggen, Fehler finden und beseitigen
    Wie man VisualStudio nutzt? => VisualStudio richtig nutzen
    Ich empfehle Databinding an ein typisiertes Dataset.
    Damit ist eine allgemeingültige Lösung gegeben, für alle Tabellen - mit nur einmaligem Programmieraufwand.
    Um DataRows vom DGV aus zu löschen muss man gar nichts tun - einfach die Rows am Zeilenkopf selektieren und [Entf] drücken - sofort verschwinden sie aus dem DGV und sind im Dataset mit RowState.Deleted gekennzeichnet.
    Dank der Änderungsverfolgung kann ein DataAdapter diese Löschungen (und sämtliche anderen Änderungen gleich mit) mit einem Befehl an die DB übermitteln:

    VB.NET-Quellcode

    1. DataAdapter.Update(dataTable)
    Das ist die Technologie, die bereitsteht.

    Man muss allerdings eine dafür geeignete Datenbank schaffen, ein typisiertes Dataset generieren, und den DataAdapter richtig konfigurieren.
    Ich hab dann eine Klasse entwickelt, die die Konfiguration automatisch abfackelt, und mit der man das komplette Dataset widerspruchsfrei persistieren kann.
    Damit ist Sql coden müssen innerhalb einer Anwendung Geschichte.
    Sql ist natürlich weiterhin möglich, etwa um spezielle Filterungen umzusetzen.

    Aber wie gesagt: Das ist ein Gesamtkonzept, was Datenbank, Dataset und Anwendungs-Oberfläche mit einbezieht, und somit eine grundlegende Entscheidung für diesen Weg.
    Mit zum Konzept gehört databinding-getriebene Oberflächen-Entwicklung - die Möglichkeiten habich hier mal angerissen:
    vier Views-Videos
    Ja, und hier gehts zum "Datenbank-Anschluss" der im 4-View-Tut skizzierten Datenverarbeitung:
    Dataset->Db