【问题标题】:How to delete multiple rows from a datagridview by selecting the checkboxes in C#?如何通过选择 C# 中的复选框从 datagridview 中删除多行?
【发布时间】:2018-02-03 19:08:25
【问题描述】:

我有 datagridview 和标题复选框来检查复选框列中行中的所有复选框(所有复选框的列索引 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 不断增加。因此,它不会删除所有选中的行,而是仅删除其中一些。当我在代码中增加时,它不会删除行索引为 0、1、2 等的行索引以及 datagridview 中的新数据。

【问题讨论】:

  • 因为当你 removeat(i) 时,它在第一次迭代时为 0,它下面的行向上移动到索引 0,但 i 现在为 1。反向删除它们。

标签: c# button checkbox datagridview delete-row


【解决方案1】:

问题在于,通过不断增加删除索引,您会跳过列表中的下一项:

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

在第 0 次迭代...我们删除索引 0 上的 Item 0 OK

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

在第 1 次迭代中...我们删除了索引 1 上的 Item 2 但我们跳过了现在位于索引 0 上的 Item 1

因此,您应该以相反的顺序迭代列表,这样当您删除一个项目时,下一个前一个项目的索引仍然是相同的:

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

【讨论】:

  • 我认为你的意思是“现在在索引 0 上”
【解决方案2】:

我在得到查尔斯的提示后解决了这个问题,如下所示。谢谢!

 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;
                }
            }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-18
    • 2013-01-06
    • 1970-01-01
    • 2016-10-02
    • 2019-10-13
    相关资源
    最近更新 更多