2014-11-02 91 views
0

嗨大家好, 我想通过在C#窗体中的datagridview中选择一行来删除一行,但我也希望这个记录也应该从数据库中删除。我已经尝试了下面的代码,但它不工作。善良的帮助解决这个问题。如何从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()); 
         } 
        } 

       } 
      } 
     } 
+0

不回答你的问题,但你最好在你的commandtext中使用参数。 – Sybren 2014-11-02 21:01:41

回答

1

你应该通过为ITEM_MODEL从行提取它的值。
你不能使用整行。无论如何,你应该使用参数化查询。

假设为ITEM_MODEL值由网格中的一个名为“ITEM_MODEL”

try 
{ 
    delcmd.CommandText = "Delete From ITEM_DETAILS Where [email protected]"; 
    con.Open(); 
    delcmd.Connection = con; 
    delcmd.Parameters.AddWithValue("@item", row.Cells["ITEM_MODEL"].Value.ToString()); 
    delcmd.ExecuteNonQuery(); 
} 

请注意,我不知道该列ITEM_MODEL在你的数据库表中的数据类型列中显示。我假设它是一个字符串,所以创建了一个字符串类型的参数。如果这个假设不成立,那么参数应该使用存储在网格列中的值进行适当的转换来创建。我还建议在网格行上更改循环。您正在从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); 
     ..... 
+0

我跟着你,它给了我一个新的错误:'无法找到名为ITEM_MODEL的列'。 – Sapper 2014-11-02 21:35:17

+1

正如我所说。我假设你有一个名为ITEM_MODEL的列。如果这不是名称,那么您需要将名称替换为列的实际值。什么是用于填充datagridview的选择? – Steve 2014-11-02 21:44:12

+0

我的专栏名称是ITEM_MODEL。 – Sapper 2014-11-03 09:25:43

1

您的SQL字符串可能是错误的。我假设你不想为ITEM_MODEL调用row.ToString(),其中row is DataGridViewRow
如果您要比较的ITEM_MODEL位于该行的Tag中,则可以使用row.Tag而不是row

相关问题