【问题标题】:DataGridView Events数据网格视图事件
【发布时间】:2012-01-09 17:03:24
【问题描述】:

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

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

DataGridView.CellValidatingDataGridView.CellValidated

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

DataGridView.CellValueChanged

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

DataGridView.CellEndEdit

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

DataGridView.CellParsing

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

编辑控件的ValidatingValidated事件

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

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

【问题讨论】:

    标签: c# events datagridview datagridviewtextboxcell


    【解决方案1】:

    您可以在DataGridViewEditingControlShowing 事件中注册EditingControlPreviewKeyDown 事件。从那里可以检测是否在编辑控件中按下了转义键,并设置一个将由CellEndEdit 事件读取的标志。

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

    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
    }
    

    【讨论】:

    • 感谢您的回答。我没有检查它,因为同时我找到了自己的解决方法。只是一件小事:在EditingControlShowing 中,您应该在添加之前删除事件处理程序以避免多次附加事件处理程序(请参阅msdn.microsoft.com/en-us/library/… 上的注释)
    【解决方案2】:

    这是我的解决方法:

    介绍一个

    private DataGridViewCell cellBeingEdited = null;
    

    DataGridView.EditingControlShowing

    cellBeingEdited = DataGridView.CurrentCell;
    

    DataGridView.CellEndEdit

    cellBeingEdited = null;
    

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

    if (DataGridView.CurrentCell != cellBeingEdited) return;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-03
      • 1970-01-01
      相关资源
      最近更新 更多