如何从C#中删除DataGridView和数据库中的选定行

private void btnDelete_Click(object sender, EventArgs e) { int i; i = dataGridView1.SelectedCells[0].RowIndex; OleDbConnection con = new OleDbConnection(constr); OleDbCommand delcmd = new OleDbCommand(); if (dataGridView1.Rows.Count > 1 && i != dataGridView1.Rows.Count - 1) { delcmd.CommandText = "DELETE FROM tb1 WHERE ID=" + dataGridView1.SelectedRows[i].Cells[0].Value.ToString() + ""; con.Open(); delcmd.Connection = con; delcmd.ExecuteNonQuery(); con.Close(); dataGridView1.Rows.RemoveAt(dataGridView1.SelectedRows[i].Index); MessageBox.Show("Row Deleted"); } } 

这是我从datagridview和数据库中删除seleted行的代码,但是当我点击删除按钮时,它显示此错误…

“索引超出范围。必须是非负数且小于集合的大小。参数名称:index”

Plz帮我代码……

手动探索DataGridView以填充然后访问数据(我的意思是从单元格中获取值),以及忽略using一次性用品,以及使用字符串连接而不是参数化查询,是地狱的直接方式。

我强烈建议您使用数据绑定和参数化查询。
声明一个实体类型,其实例将显示在DGV

 public class MyEntity { public int Id { get; set; } public string Name { get; set; } } 

DGV列配置为数据绑定(对于示例,分别将DataPropertyName属性设置为“Id”和“Name”)并设置DGV数据源:

  // your application fills this collection using data from database var source = new List { new MyEntity { Id = 1, Name = "Apple" }, new MyEntity { Id = 2, Name = "Orange" }, new MyEntity { Id = 3, Name = "Plum" }, new MyEntity { Id = 4, Name = "Peach" }, }; dataGridView1.DataSource = new BindingList(source); 

如果要从DGV删除项目,请使用基础数据源而不是从视图中拾取数据:

  private void DeleteSelectedItem() { if (dataGridView1.SelectedRows.Count == 0) { return; } var itemToDelete = (MyEntity)dataGridView1.SelectedRows[0].DataBoundItem; using (var connection = new OleDbConnection("...")) { connection.Open(); using (var command = new OleDbCommand("DELETE FROM tb1 WHERE ID = ?", connection)) { // delete item from database command.Parameters.AddWithValue("@Id", itemToDelete.Id); command.ExecuteNonQuery(); // delete item from datasource and update DGV var dataSource = (BindingList)dataGridView1.DataSource; dataSource.Remove(itemToDelete); } } } 

以这种方式尝试按照以下步骤操作
1.从DataBase中删除您的行
2.清除DataGridview的数据源
3.从数据库中选择数据并将其设置为DataGridview

“索引超出范围。必须是非负数且小于集合的大小。参数名称:index”

这意味着您正在访问集合中不存在的位置或索引。 单击“删除”按钮时,请validation是否选择了任何单元格。

 if(dataGridView1.SelectedCells.Count > 0) { i = dataGridView1.SelectedCells[0] OleDbConnection con = new OleDbConnection(constr); OleDbCommand delcmd = new OleDbCommand(); if (dataGridView1.Rows.Count > 1 && i != dataGridView1.Rows.Count - 1) { delcmd.CommandText = "DELETE FROM tb1 WHERE ID=" + dataGridView1.SelectedRows[i].Cells[0].Value.ToString() + ""; con.Open(); delcmd.Connection = con; delcmd.ExecuteNonQuery(); con.Close(); dataGridView1.Rows.RemoveAt(dataGridView1.SelectedRows[i].Index); MessageBox.Show("Row Deleted"); } } else { MessageBox.Show("Please select a row"); }