首页 文章

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

提问于
浏览
-1
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帮我代码......

4 回答

  • 0

    手动探索 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<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

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

  • 0

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

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

    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");
    }
    
  • 1
    private void btn_Click(object sender, EventArgs e)
        {
            foreach (DataGridViewRow item in this.dataGridView1.SelectedRows)
            {
                using (MySqlConnection con = new MySqlConnection(cs))
                {
                    MySqlCommand cmd = con.CreateCommand();
                    int id =Convert.ToInt32(dataGridView1.SelectedRows[0].Cells[0].Value);
                    cmd.CommandText = "Delete from user where id='" + id+ "'";
    
                    dataGridView1.Rows.RemoveAt(this.dataGridView1.SelectedRows[0].Index);
                    con.Open();
                    cmd.ExecuteNonQuery();
    
                }
    
            }
        }
    

相关问题