大家好, 我想通过在C#windows窗体中的datagridview中选择一行来删除一行,但我也希望这条记录也应该从数据库中删除。我已经尝试过以下代码,但它无法正常工作。请帮助解决这个问题。< / p>
代码:
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());
}
}
}
}
}
答案 0 :(得分:1)
您应该为ITEM_MODEL传递一个值,从您的行中提取它 你不能使用整行。在任何情况下,您都应该使用参数化查询。
假设您的网格在名为&#34; ITEM_MODEL&#34;
的列中显示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列的数据类型。我假设它是一个字符串,所以创建一个字符串类型的参数。如果此假设不成立,则应使用存储在网格列
中的值的适当转换来创建参数我还建议在Grid行上更改循环。您正在从Rows集合中删除项目,并且您不能使用foreach以安全的方式使用row.Index值。更好地使用从末尾向后移动的传统循环
for(int x = dg.Rows.Count - 1; x >= 0; x--)
{
DataGridRow row = dg.Rows[x];
if (row.Selected)
{
dg.Rows.RemoveAt(row.Index);
.....
答案 1 :(得分:1)
您的SQL字符串可能有误。我假设您不想为row.ToString()
所在的ITEM_MODEL致电row is DataGridViewRow
。
如果要与其进行比较的ITEM_MODEL位于行的Tag
中,则可以使用row.Tag
代替row
。