2017-08-25 84 views
0

我有datagridview和標題複選框,以檢查複選框列中所有複選框(所有複選框0的列的索引)。 我有以下的刪除按鈕事件代碼:如何通過選擇C#中的複選框從datagridview中刪除多行?

for (int i = 0; i < datagridview.Rows.Count; i++) { 
      if (Convert.ToBoolean(datagridview.Rows[i].Cells[0].Value) == true) { 
       datagridview.Rows.RemoveAt(i); 
      } 
     } 

datagridview.rows.count持續下降作爲行刪除,但是我在循環不斷增加。因此,不是刪除所有選中的行,而只是刪除其中的一部分。它不會刪除行索引爲0,1,2等等的行,並隨着代碼中的增加而刪除datagridview中的新數據。

+0

因爲當你刪除(i)它在第一次迭代時爲0,並且它下面的行移動到索引0,但是我現在在1.反向刪除它們。 –

回答

0

的問題是,通過不斷增加對刪除索引,則跳過下一個項目在列表中:

0: [X] Item 0 
1: [X] Item 1 
2: [X] Item 2 

迭代的0 ...我們對指數0 OK刪除Item 0

0: [X] Item 1 
1: [X] Item 2 

迭代的1 ...我們刪除索引1 Item 2但我們跳過Item 1這是現在的指數0

因此,你應該遍歷列表中以相反的順序,這樣,當你刪除一個項目時,未來上一個項目的指數仍然是相同的:

for (int i = datagridview.Rows.Count; i >= 0 ; i--) 
{ 
    // .... 
} 
+1

我想你的意思是「現在在索引0」 –

+0

@CharlesMay啊,是的。經典的一個錯誤。 – Xiaoy312

+0

這也適用。謝謝@ Xiaoy312! – Krish

0

我從Charles那裏得到提示後解決了這個問題,如下所示。謝謝!

for (int i = 0; i < dgvBaleDisposition.Rows.Count; i++) 
      { 
       if (Convert.ToBoolean(dgvBaleDisposition.Rows[i] 
             .Cells[0].Value) == true) 
       { 
        dgvBaleDisposition.Rows.RemoveAt(i); 
       } 

       i = i - 1; 
       j = j + 1; 

       if (j == countRows) 
       { 
        break; 
       } 
      } 
相關問題