2016-07-20 5 views
0

ich von Datagridview ausgewählter Zeile zu löschen versuchen ausgewählte Zeile löschen und Änderungen dauerhaft in meinem Zugang zu begehen hier ist DB mein Code:Wie von Datagridview und Access DB in .NET

 cn.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & Application.StartupPath & "\Accountcode.accdb;" 
    cn.Open() 

    Try 
     For Each row As DataGridViewRow In DataGridView1.SelectedRows 
      Using cn As New OleDb.OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & Application.StartupPath & "\Accountcode.accdb;") 
       Using cm As New OleDb.OleDbCommand 
        cm.Connection = cn 
        cm.CommandText = "DELETE * FROM CheckDJ WHERE [ID]= @id" 
        cm.CommandType = CommandType.Text 
        cm.Parameters.AddWithValue("@ID", CType(row.DataBoundItem, DataRowView).Row("ID")) 
        cm.ExecuteNonQuery() 
       End Using 
      End Using 
     Next 
    Catch ex As Exception 
     MsgBox(ex.Message) 
    End Try 

    Try 
     Using cn As New OleDb.OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & Application.StartupPath & "\Accountcode.accdb;") 
      Using cm As New OleDb.OleDbCommand 
       strsql = "SELECT * FROM CheckDJ" 
       cm.Connection = cn 
       cm.CommandText = strsql 
       cm.CommandType = CommandType.Text 

       Dim da As New OleDbDataAdapter(strsql, cn) 
       Dim ds As New DataSet() 
       da.Fill(ds, "CheckDJ") 
       DataGridView1.DataSource = ds.Tables(0) 
      End Using 
     End Using 
    Catch ex As Exception 
     MsgBox(ex.Message) 
    End Try 

Aber ich habe ein Fehler.
Index war außerhalb des Bereichs. Muss nicht negativ und kleiner als die Größe der Sammlung sein. Parametername: Index Jede Hilfe wird sehr geschätzt. Vielen Dank im Voraus!

+0

Es ist, weil Sie Zeilen entfernen, während sie laufen. Werfen Sie sie zuerst in eine Sammlung, führen Sie dann eine Schleife durch und entfernen Sie sie aus der Datagrid-Ansicht und entfernen Sie sie dann aus der Datenbank. Derzeit in einer Schleife Datensätze aus datagridview zu entfernen, aber Sie benötigen die Datenbank und füllt die datagridview wieder innerhalb dieser Schleife, das ist schlechte Praxis und Fragen nach Problemen ... Auch verwenden Sie Parameter und schauen Sie sich richtig entsorgen Verbindungsobjekte, Befehle usw. ..Öffnen Sie die Verbindung, erledigen Sie Ihre Arbeit und schließen und säubern. – Codexer

+0

@Zaggler Ich würde es sehr schätzen, wenn Sie mir helfen können, indem Sie mir den richtigen Code zeigen. Sie können meinen Code ändern. –

+0

@ F0r3v3r-A-N00b sehe meinen bearbeiteten Code über –

Antwort

0

Sie gehen das alles falsch. Verwenden Sie zuerst einen Datenadapter, um eine DataTable aufzufüllen und diese an das Grid zu binden. Sie erhalten dann die gebundene DataRowView von jeder ausgewählten Zeile im Raster, rufen Sie seine Delete Methode, um es als Deleted (die es aus dem Raster entfernt wird) zu markieren und dann den gleichen Datenadapter verwenden, um die Änderungen zurück in die Datenbank zu speichern. Z.B.

myDataAdapter.Fill(myDataTable) 
myDataGridView.DataSource = myDataTable 

'... 

Dim rowsToDelete As New List(Of DataRowView) 

For Each gridRow As DataGridViewRow In myDataGridView.SelectedRows 
    rowsToDelete.Add(DirectCast(gridRow.DataBoundItem, DataRowView)) 
Next 

For Each row In rowsToDelete 
    row.Delete() 
Next 

myDataAdapter.Update(myDataTable) 
+0

Warum das DV auf diesem ??? – Plutonix

+0

Ich habe mich selbst über das DV gewundert. Ich wünschte, solche Leute würden einen Kommentar hinterlassen. Wenn es etwas gibt, das geändert werden muss, dann werden wir es nicht ändern, wenn wir nicht wissen, was es ist. – jmcilhinney

0
Try 
     For Each row As DataGridViewRow In DatagridView1.SelectedRows 
      Using cn As New OleDb.OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & Application.StartupPath & "\Accountcode.accdb;") 
       Using cm As New OleDb.OleDbCommand 
        cm.Connection = cn 
        cm.CommandText = "DELETE * FROM CheckDJ WHERE [ID]= @id" 
        cm.CommandType = CommandType.Text 
       cm.Parameters.AddWithValue("@id", ctype(row.DataBoundItem,DataRowView).Row("id")) 
        cm.ExecuteNonQuery() 
       End Using 
      End Using 
     Next 
    Catch ex As Exception 
     MsgBox(ex.Message) 
    End Try 

    Try 
     Using cn As New OleDb.OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & Application.StartupPath & "\Accountcode.accdb;") 
      Using cm As New OleDb.OleDbCommand 
        strsql = "SELECT * FROM CheckDJ" 
        cm.Connection = cn 
        cm.CommandText = strsql 
        cm.CommandType = CommandType.Text 

     Dim da As New OleDbDataAdapter(strsql, cn) 
     Dim ds As New DataSet() 
     da.Fill(ds, "CheckDJ") 
     DataGridView1.DataSource = ds.Tables(0) 
      End Using 
     End Using 
    Catch ex As Exception 
     MsgBox(ex.Message) 
    End Try 
+0

Er möchte nicht alle Zeilen löschen nur die ausgewählten ... – Codexer

+0

bearbeitet meine Antwort –

+0

@ F0r3v3r-A-N00b: Objektreferenz nicht auf eine Instanz eines Objekts festgelegt. Ich habe diesen Fehler beim Ausprobieren Ihres Codes erhalten. –

Verwandte Themen