【问题标题】:How can I capture the keystroke that triggers "CellEndEdit" on a DataGridView in C#?如何在 C# 中捕获触发 DataGridView 上的“CellEndEdit”的击键?
【发布时间】:2009-04-21 21:05:04
【问题描述】:

我有一个设置为 EditOnF2 的 DataGridView。我在设置单元格值的 CellEndEdit 事件处理程序中对数据进行了一些特殊处理。我仍然希望 EditOnKeystrokeOrF2 在按下 Esc 键时恢复到原始值的功能。不幸的是,在 CellEndEdit 事件处理程序中,我看不到一种方法来判断导致 CellEndEdit 事件被触发的原因。如果未按下 Esc 键,我只想更改单元格的值。如何判断是不是?

编辑:值得注意的是,在编辑单元格时不会触发 KeyDown 事件,也不会触发最后的结束击键。

Edit2:我已经尝试过 KeyPreview 建议,但表单仍然无法捕获按下的 Escape 键。

Edit3:我一直在尝试让它发挥作用。我最初将以下一些内容作为单独的帖子发布,但觉得将其包含在此处可能更相关。

我在 DataGridView 中有一个单元格,现在设置为 EditProgrammatically。为了捕获开始编辑的击键,我将 cell.Value 设置为等于击键。但是,这会破坏单元格的“转义”功能 - 当您按下转义键时,它不会恢复为原始值,而是恢复为我以编程方式插入到单元格中的击键。

我相信如果我可以在一个单元格上设置“EditedFormattedValue”,这将是我想要放置我的击键值的地方,但是这似乎是只读的。我怎样才能完成我正在尝试的事情?

一个澄清的例子:如果单元格中的值是“54.3”,我按下“9”键,它开始编辑单元格并在那里放置一个“9”。如果我点击 Escape,它不会恢复为“54.3”,而是恢复为“9”。我想要的是让它恢复到原来的“54.3”值。

所以,我试图从头到尾都解决这个问题。我认为真正的问题是我正在覆盖原始值并且无法确定是否应该恢复它。

Edit4:看起来 CellValidating 可能值得使用,但是当我尝试它时,我看到了奇怪的行为。在一个新项目中,我创建了 DataGridView 并注册了各种事件,并看到 CellValidating 在 CellEndEdit 之前被触发。但是,在我试图让它工作的项目中,CellEndEdit 在 CellValidating 之前触发。有什么不同的想法吗?

【问题讨论】:

    标签: c# .net datagridview keydown


    【解决方案1】:

    将表单上的KeyPrevew property 设置为true;这将防止控件首先吞噬它。 :)

    【讨论】:

    • 谢谢,但是在尝试了这个之后,看起来转义键仍然只被单元格识别为编辑的结束,而不是表单上的实际 KeyDown 或 KeyPress 事件。跨度>
    【解决方案2】:

    首先,你说得对,KeyPreview 不起作用。起初,我认为我可以通过覆盖表单的 IsInputKey 方法来解决这个问题。这种技术在其他一些我无法抓住我需要抓住的钥匙的情况下对我有用。那也不起作用,所以我尝试将DataGridView 子类化并在那里覆盖IsInputKey。那也没用。在深入研究了我可以覆盖的其他方法之后,我了解到还有一类称为命令键的键,我需要拦截它们。为此,请在 DataGridView 上覆盖 ProcessCmdKey(您需要对其进行子类化)。

    这是我的代码:

    public class CommandKeyInterceptingDataGridView : DataGridView
    {
        protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
        {
            Debug.WriteLine(keyData);
            return base.ProcessCmdKey(ref msg, keyData);
        }
    }
    

    以及使用 F2 进入编辑模式、修改单元格以说“Hello”并使用 Escape 取消编辑的输出。

    F2
    ShiftKey, Shift
    H, Shift
    E
    L
    L
    O
    Escape
    

    希望这能满足您的需求。

    【讨论】:

      【解决方案3】:

      我的问题类似,这是我的解决方法:

      Problem: 当用户开始编辑 DGV 中的单元格值并在提交值之前按下 ESC 键 EndEdit 被调用,它将所有 DGV 字段重新写入数据库,从而更新更新日期和时间字段,我只想要 DGV .EndEdit 在用户实际更改值且未按 ESC 时运行。

      Solution: 在单元格验证中,我使用this 之类的标志来检查值是否已更改,如果标志值为 false,则只需在 EndEdit 上执行 if(!flag)return;

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-05-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-02-16
        • 1970-01-01
        • 2012-02-12
        相关资源
        最近更新 更多