如何在C#中从数据网格视图中删除选定的行,并从数据库中删除该记录
本文关键字:删除 记录 数据库 视图 数据 数据网 网格 | 更新日期: 2023-09-27 18:28:53
大家好,我想通过在C#窗体的datagridview中选择一行来删除一行,但我也希望这个记录也应该从数据库中删除。我已经尝试了以下代码,但它不起作用。请帮忙解决这个问题。
代码:
using (SqlConnection con = new SqlConnection(ConfigurationManager.ConnectionStrings["CS"].ConnectionString))
{
SqlCommand delcmd = new SqlCommand();
foreach (DataGridViewRow row in dg.Rows)
{
if (row.Selected)
{
dg.Rows.RemoveAt(row.Index);
try
{
delcmd.CommandText = "Delete From ITEM_DETAILS Where ITEM_MODEL=" + row + "";
con.Open();
delcmd.Connection = con;
delcmd.ExecuteNonQuery();
}
catch(Exception ex)
{
MessageBox.Show(ex.ToString());
}
}
}
}
}
您的SQL字符串可能是错误的。我假设您不想为ITEM_MODEL调用row.ToString()
,其中row is DataGridViewRow
例如,如果要与其进行比较的ITEM_MODEL位于该行的Tag
中,则可以使用row.Tag
而不是row
。
您应该为ITEM_MODEL传递一个值,从您的行中提取它
不能使用整行。在任何情况下,您都应该使用参数化查询。
假设ITEM_MODEL的值由网格显示在名为"ITEM_MODEL"的列中
try
{
delcmd.CommandText = "Delete From ITEM_DETAILS Where ITEM_MODEL=@item";
con.Open();
delcmd.Connection = con;
delcmd.Parameters.AddWithValue("@item", row.Cells["ITEM_MODEL"].Value.ToString());
delcmd.ExecuteNonQuery();
}
请注意,我不知道数据库表中列ITEM_MODEL的数据类型。我假设它是一个字符串,所以创建了一个字符串类型的参数。如果该假设不成立,则应使用存储在网格列中的值的适当转换来创建参数
我还建议更改网格行上的循环。您正在从"行"集合中删除项目,无法使用该行。使用foreach以安全的方式索引值。更好地使用从末端向后移动到第一行的传统循环
for(int x = dg.Rows.Count - 1; x >= 0; x--)
{
DataGridRow row = dg.Rows[x];
if (row.Selected)
{
dg.Rows.RemoveAt(row.Index);
.....