如何从C#中的datagridview中删除选定的行,并从数据库中删除该记录?

时间:2014-11-02 20:56:51

标签: c# winforms datagridview ado.net

大家好,             我想通过在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());
                        }
                    }

                }
            }
        }

2 个答案:

答案 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