2

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

实现此行为的最佳方法是什么?我努力了:

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

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

4

3 回答 3

2

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

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);
            }));
        }
    }
}
于 2015-09-02T07:47:00.153 回答
0

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

于 2013-05-30T14:48:11.737 回答
0

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

于 2013-05-30T16:13:43.887 回答