2014-11-02 92 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

相關問題