2011-08-02 80 views
0

我想從DataGridView中刪除多個選定的行。當我嘗試下面的代碼時,它只會刪除幾個選定的行。例如,我有七行,我選擇了5個連續的行並按下刪除,只有三行被刪除。如何刪除DataGridView中的多行

IEnumerable<DataGridViewRow> dgvrs = from dgvrws in dgvChemicalInv.Rows.Cast<DataGridViewRow>() 
               where dgvrws.Selected.Equals(true) 
               select dgvrws; 

      foreach (DataGridViewRow dgr in dgvrs) 
      { 
       dctchemri = dgr.Cells["DCT_CHEMRI"].Value.ToString(); 
       index = dgvChemicalInv.CurrentRow.Index; 

       var chemObj = (from chmObj in DCTProjectNodeObj.Chemicals 
           where chmObj.DCTChemRI.Equals(dctchemri) 
           select chmObj).Single(); 

       if (sqlCmd.Delete_Chems(this.projID, (csDCTChemicalObj)chemObj)) 
       { 
        dgvChemicalInv.Rows.Remove(dgr); 
       } 
       if (dgvChemicalInv.RowCount > 0) 
       { 
        DCTProjectNodeObj.Chemicals.Remove((csDCTChemicalObj)chemObj); 
       } 
       else 
       { 
        DCTProjectNodeObj.Chemicals = new List<csDCTChemicalObj>(); 
        DO_BtnSaveClickEvent(); 
       } 
      } 

謝謝

比爾O.

回答

0

你的代碼有點難以閱讀,但我認爲你使這個過於複雜。我會推薦使用類似BindingSource對象的東西。它使桌子管理更容易。將BindingSourcedatasource設置爲表,將DataGridView設置爲BindingSource對象,並且在調用SubmitChanges()後,對該表所做的任何更改都將反映在DataContext中。

例子:

MyDataContext dataContext = new MyDataContext(); 
BindingSource bindingSource = new BindingSource(); 

bindingSource.DataSource = dataContext.MyTable; 
dataContext.DataSource = bindingSource; 

這已經有一段時間,因爲我已經做到了這一點,但我認爲這是做最簡單的方法。這樣可以避免任何混亂的操作,但是這會導致外鍵關係的複雜化。

只是一種可能使事情變得更簡單的方法。

+0

我一直在尋找這種可能性,但它似乎不適用於SqlCE數據庫。 –

+0

不知道你在工作SqlCE。沒有太多的經驗,但什麼不適用於SqlCE? – krs1

+0

連接並設置dataContext類。我正在跟着這個博客[鏈接](http://blogs.msdn.com/b/charlie/archive/2007/12/10/understanding-the-datacontext.aspx) –

2

你的代碼是非常難以閱讀。無論如何,我確定問題出在foreach。一般而言,您無法從正在循環的集合中刪除foreach循環中的項目。 無論如何,我認爲最好的選擇將從數據源中刪除該項目(也許從中繼器獲得的ID)和DataBind再次中繼器

+0

我正在對所選行的datagridview做一個Linq查詢,並試圖在foreach循環中刪除它們。在調試過程中,我可以觀察Enumerable dgvrs的結果視圖中的索引更改,並且這些索引在行被刪除時對應於行索引。當我現在通過它時,我可以刪除除最後一行以外的所有內容。 –

+0

這裏是代碼'code' IEnumerable dgvrs = from dgvChemicalInv.Rows.Cast () 其中dgvrws.Selected.Equals(true) select dgvrws; (DataGridViewRow dgr in dgvrs) dgvChemicalInv.Rows.Remove(dgr); } –

0

我同意@Massimiliano Peluso;一般情況下,我會一次性獲得所有的ID,並且只進行一次數據庫調用,傳遞一個以逗號分隔的ID列表,而不是每行調用一個ID,除非有其他有效的理由不這樣做但只要調用一次數據庫並調用數據庫200次對我來說似乎沒有必要。然後,我會重新綁定數據並完成它。