4

每当用户通常在控件的 TextBox 列中结束编辑模式时(无论用户是否实际修改了值;但当用户通过按 ESC 取消编辑模式时),我都需要执行一项任务DataGridView

我尝试了控件本身以及编辑控件的几个事件DataGridView,但没有一个完全符合我的要求:

DataGridView.CellValidatingDataGridView.CellValidated

每当用户选择另一个单元格时,都会触发这些事件,即使该单元格未处于编辑模式。我试图检查事件IsCurrentCellDirty内部的属性CellValidating。这几乎是我需要的,但IsCurrentCellDirty仅在用户实际更改值时才设置。但是当用户通常在没有更改任何内容的情况下结束编辑模式时,我还需要执行该任务。当用户取消编辑模式时,不会触发这些事件,这很好。

DataGridView.CellValueChanged

这个事件也经常被触发(当单元格的值以编程方式设置时它也会被触发)。

DataGridView.CellEndEdit

这个活动几乎是我想要的。但是当用户通过按 ESC 取消编辑模式时也会触发它。有没有办法检查CellEndEdit事件内部是否取消了编辑模式?

DataGridView.CellParsing

这个活动几乎是我想要的。但是当用户结束编辑模式而没有更改任何内容时,它不会被触发。

ValidatingValidated编辑控件的事件

我在事件里面注册了这些DataGridView.EditingControlShowing事件。它们几乎可以满足我的要求,但是当用户通过按 ESC 取消编辑模式时它们也会被触发。有没有办法检查这些事件中是否取消了编辑模式?

关于我可以注册的事件和/或我可以检查以实现所需行为的标志的任何其他建议?

4

2 回答 2

4

你可以做的是注册到PreviewKeyDown事件EditingControl里面的EditingControlShowing事件DataGridView。从那里可以检测是否在编辑控件中按下了转义键,并设置一个将由CellEndEdit事件读取的标志。

您可以从方法名称推断注册所需的事件。这假设您的类中有一个名为的 bool 字段escapePressed(不足为奇)是按下转义的标志。

private void dataGridView1_EditingControlShowing(object sender, DataGridViewEditingControlShowingEventArgs e)
{
    e.Control.PreviewKeyDown -= Control_PreviewKeyDown; //avoid attaching multiple handlers in case control is cached
    e.Control.PreviewKeyDown += new PreviewKeyDownEventHandler(Control_PreviewKeyDown);
}

void Control_PreviewKeyDown(object sender, PreviewKeyDownEventArgs e)
{
    if (e.KeyCode == Keys.Escape)
    {
        Console.WriteLine("escape pressed");
        escapePressed = true;
    }
}

private void dataGridView1_CellEndEdit(object sender, DataGridViewCellEventArgs e)
{
    if (!escapePressed)
    {
        Console.WriteLine("do your stuff"); //escape was not pressed.
    }
    else escapePressed = false; //reset the flag
}
于 2012-01-09T08:52:02.790 回答
1

这是我的解决方法:

介绍一个

private DataGridViewCell cellBeingEdited = null;

DataGridView.EditingControlShowing

cellBeingEdited = DataGridView.CurrentCell;

DataGridView.CellEndEdit

cellBeingEdited = null;

然后我可以使用DataGridView.CellValidating取消编辑时不会触发的事件并检查我的cellBeingEdited字段:

if (DataGridView.CurrentCell != cellBeingEdited) return;
于 2012-01-09T08:54:25.933 回答