2014-01-10 60 views
0
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和数据库删除入围行,但是当我点击删除按钮,其显示的错误代码......如何在C#中删除选定的行从DataGridView和数据库

“索引超出范围必须大于集合的大小 非负少参数名:。指数”

plz帮助我的代码...

+1

抛出的错误在哪里?它在'i = dataGridView1.SelectedCells [0]'? –

+0

此命令引发此错误... delcmd.CommandText =“DELETE FROM tb1 WHERE ID =”+ dataGridView1.SelectedRows [i] .Cells [0] .Value.ToString()+“”; – user3138522

+0

你确定吗?因为你刚才评论说它是'i = dataGridView1.SelectedCells [0]'行。 –

回答

0

尝试在这样按照以下步骤
1.从数据库
2.您的DataGridView从数据库
3.选择数据的清除数据源删除您行,并将其设置为DataGridView的

0

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

这意味着你正在访问一个位置或指数,这是不存在的集合 当你点击删除按钮,验证任何单元格是否被选中

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"); 
} 
+0

我显示datagridview中的数据像这样... OleDbDataAdapter da = new OleDbDataAdapter(“select * from tb1”,con); DataTable dt = new DataTable(); da.Fill(dt); dataGridView1.DataSource = dt; 这是正确的方法吗? – user3138522

+0

我用你的代码..它是说我不存在于当前的情况下 – user3138522

+0

你可以提供更清晰的图片“显示当前上下文中不存在”的消息吗? –

1

。探索DataGridView手动填充,然后访问数据(我的意思是从单元格中获取值),以及忽略一次性使用的using,以及使用字符串连接而不是参数化查询,是直接下地狱的方式。我强烈建议您使用数据绑定和参数化查询。
声明实体类型,其实例将显示在DGV

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

配置DGV列是数据绑定(用于样品,设置DataPropertyName属性为“ID”和“名”分别),并设置DGV数据来源:

 // your application fills this collection using data from database 
     var source = new List<MyEntity> 
     { 
      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<MyEntity>(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<MyEntity>)dataGridView1.DataSource; 
       dataSource.Remove(itemToDelete); 
      } 
     } 
    } 
+0

ok lemme试试这个.. – user3138522

+1

注意,如果你使用'DataTable'作为数据源(我读过你的评论),那么'DataBoundItem'就是'DataRow',并且解决方案更简单你不需要任何实体类型)。只需从DataRow实例中获取id值即可。如果你使用'DataAdapter',那么你甚至不需要'DataBoundItem'。只需从数据表中删除行,然后调用'DataAdapter.Update(DataTable)'。 – Dennis

相关问题