如何通过选中 C# 中的复选框从 datagridview 中删除多行?
How to delete multiple rows from a datagridview by selecting the checkboxes in C#?
我有 datagridview 和 header 复选框来选中复选框列中行中的所有复选框(所有复选框的列索引为 0) .
我在删除的按钮事件中有以下代码:
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不断减少,但循环中的I不断增加。因此,它不会删除所有选中的行,而是只删除其中的一些。当我在代码中增加时,它不会使用 datagridview 中的新数据删除行索引为 0、1、2 等的行。
问题在于,通过在删除时不断增加索引,您会跳过列表中的下一项:
0: [X] Item 0
1: [X] Item 1
2: [X] Item 2
on iteration 0 ... we delete Item 0
on index 0 OK
0: [X] Item 1
1: [X] Item 2
on iteration 1 ... we delete Item 2
on index 1 BUT we skipped Item 1
which is now on index 0
因此,您应该以相反的顺序迭代列表,这样当您删除一个项目时,下一个 前一个项目的索引仍然相同:
for (int i = datagridview.Rows.Count; i >= 0 ; i--)
{
// ....
}
我在得到 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;
}
}
我有 datagridview 和 header 复选框来选中复选框列中行中的所有复选框(所有复选框的列索引为 0) . 我在删除的按钮事件中有以下代码:
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不断减少,但循环中的I不断增加。因此,它不会删除所有选中的行,而是只删除其中的一些。当我在代码中增加时,它不会使用 datagridview 中的新数据删除行索引为 0、1、2 等的行。
问题在于,通过在删除时不断增加索引,您会跳过列表中的下一项:
0: [X] Item 0
1: [X] Item 1
2: [X] Item 2
on iteration 0 ... we delete
Item 0
on index 0 OK
0: [X] Item 1
1: [X] Item 2
on iteration 1 ... we delete
Item 2
on index 1 BUT we skippedItem 1
which is now on index 0
因此,您应该以相反的顺序迭代列表,这样当您删除一个项目时,下一个 前一个项目的索引仍然相同:
for (int i = datagridview.Rows.Count; i >= 0 ; i--)
{
// ....
}
我在得到 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;
}
}