C# 如何在C中从DataGridView和数据库中删除选定行
这是我从datagridview和database中删除所选行的代码,但当我单击delete按钮时,它会显示此错误 索引超出范围。必须为非负数且小于尺寸 收藏的一部分。参数名称:索引C# 如何在C中从DataGridView和数据库中删除选定行,c#,C#,这是我从datagridview和database中删除所选行的代码,但当我单击delete按钮时,它会显示此错误 索引超出范围。必须为非负数且小于尺寸 收藏的一部分。参数名称:索引 请帮我看一下代码…用这种方法试试,然后按照以下步骤操作 1.从数据库中删除您的行 2.清除DataGridview的数据源 3.从数据库中选择数据并将其设置为DataGridview 索引超出范围。必须为非负数且小于尺寸 收藏的一部分。参数名称:索引 这意味着您正在访问集合中不存在的位置或索引。 单击“删除”按钮时
请帮我看一下代码…用这种方法试试,然后按照以下步骤操作 1.从数据库中删除您的行 2.清除DataGridview的数据源 3.从数据库中选择数据并将其设置为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以填充并访问数据我的意思是从单元格中提取值,忽略对一次性数据的使用,以及使用字符串连接而不是参数化查询,这是一种直接的方法
我强烈建议您使用数据绑定和参数化查询。
声明实体类型,其实例将显示在DGV中:
将DGV列配置为样本的数据绑定,将DataPropertyName属性分别设置为Id和Name,并设置DGV数据源:
public class MyEntity
{
public int Id { get; set; }
public string Name { get; set; }
}
错误在哪里抛出?是否位于i=dataGridView1.SelectedCells[0]?此命令会引发此错误。。。delcmd.CommandText=从tb1中删除,其中ID=+dataGridView1.SelectedRows[i]。单元格[0]。Value.ToString+;你确定吗?因为您刚刚在一分钟前评论说它是i=dataGridView1.SelectedCells[0]行。是的,我确信它在删除命令行上显示错误。我在datagridview中显示的数据如下所示。。。OLEDB数据适配器da=新OLEDB数据适配器从tb1中选择*,con;DataTable dt=新的DataTable;da.Filldt;dataGridView1.DataSource=dt;这是正确的方式吗?我使用了你的代码。这是说我在当前上下文中不存在。你能提供更清晰的图片显示当前上下文消息中不存在的位置吗?注意,如果你使用DataTable作为数据源,我已经读过你的评论,那么DataBoundItem就是DataRow,解决方案更简单,您不需要任何实体类型。只需从DataRow实例获取id值。如果您使用DataAdapter,那么您甚至不需要DataBoundItem。只需从数据表中删除行,并调用DataAdapter.UpdateDataTable.To来改进您的答案,您应该添加一些基本的解释。至少你在代码中改变了什么,最好是你为什么要改变它。
public class MyEntity
{
public int Id { get; set; }
public string Name { get; set; }
}
// 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);
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);
}
}
}
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();
}
}
}