【问题标题】:Best way to remove a row from a DataGridView when it becomes blank当 DataGridView 变为空白时,从该行中删除行的最佳方法
【发布时间】:2013-05-26 04:48:05
【问题描述】:

我的应用程序中有一个单列 DataGridView。如果/当用户将它们呈现为空白时(通过编辑单元格),我希望应用程序立即从网格中删除行。问题是我尝试的每一种方法都会陷入死胡同。

实现此行为的最佳方式是什么?我试过了:

  1. 使用 CellValidated 事件,然后检查该值现在是否为空。
    • 引发“无法执行操作”异常,因为显然 C# 不允许您在 CellValidated 事件中从 DataGridView 中删除一行。
  2. 使用 CellEndEdit 事件,然后检查该值现在是否为空
    • 如果结束单元格编辑的事件是用户单击同一网格中的另一个单元格,则当我尝试删除该行时会引发“无法执行操作”异常;否则,这似乎可行。
  3. 使用 CellValueChanged 事件,然后检查该值现在是否为空。
    • 需要检查网格当前是否正在以编程方式填充,但这只是一种不便。
    • 错过了用户开始在新行中输入,然后不进行验证,立即使用 BACKSPACE 删除文本的情况。这会将单元格留空,并且不会触发 CellValueChanged 事件。

我认为我不能使用 CellLeave 事件,因为用户可以通过按 ENTER 键锁定一个值而无需离开单元格。

【问题讨论】:

    标签: c#


    【解决方案1】:

    我知道我来晚了,但我是这样做的

    private void dataGridView1_CellEndEdit(object sender, DataGridViewCellEventArgs e)
    {
        if (!dataGridView1.Rows[e.RowIndex].IsNewRow)
        {
            if (dataGridView.Rows[e.RowIndex].Cells[0].Value == null)
            {
                BeginInvoke(new MethodInvoker(delegate
                {
                    dataGridView1.Rows.RemoveAt(e.RowIndex);
                }));
            }
        }
    }
    

    【讨论】:

    • 忘记了几个字符。 ));否则为我工作。 BeginInvoke(new MethodInvoker(delegate { dataGridView1.Rows.RemoveAt(e.RowIndex); }));
    【解决方案2】:

    我会使用 CellStateChanged 事件。然后,当一个单元格在某个点失去焦点时(即用户选择其他单元格),您可以检查它是否为空。此时,您可以删除该行。这也会稍微快一些,因为您不需要持续检查单元格值何时被修改。否则,如果您监听单元格值的变化,事件检查将一直触发。

    【讨论】:

    • 不错的尝试。但这也会导致“无法执行操作”异常。
    • 嗯,是的,这些事件略有限制。你试过 RowValidated 吗?这是一个类似的帖子:stackoverflow.com/questions/4960232/…
    • 我没有,没有。不过,我刚刚做了,它也抛出了相同类型的异常。太糟糕了,我对那个感觉很好。
    • 好的。试试这个方法。在 OnCellStateChanged 事件中,设置类似 row_needs_deleted = row# 的标志。然后,在事件之外,如果 row_needs_deleted > 0 则删除该行,并将其设置回 -1。
    • 我已经想到了。但除非在活动之外有我们可以使用的地方,否则这是行不通的。如果“事件之外的地方”不是另一个事件,那么我不知道这将如何运作。排队删除可能会导致竞争条件。
    【解决方案3】:

    创建表单时,设置一个标志,rowNumToDelete = -1。 OnCellValidated,如果单元格现在为空,rowNumToDelete = row#。 OnKeyDown,如果键是(制表符/箭头/回车)(或用户可以用来在网格中的单元格之间切换的任何键),并且如果标志大于 0,则删除 rowNumToDelete 处的行并将标志设置回 -1 .对 OnClick 执行相同操作。我仍然不确定在 DataGridView 事件处理程序中是否有更好的方法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-05-30
      • 2022-01-03
      • 2023-03-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-15
      相关资源
      最近更新 更多