2017-08-25 57 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; 
       } 
      } 
相关问题