繁体   English   中英

如何捕获在C#中的DataGridView上触发“CellEndEdit”的击键?

[英]How can I capture the keystroke that triggers “CellEndEdit” on a DataGridView in C#?

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

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

Edit2:我尝试过KeyPreview建议,但表单仍然没有捕获按下的Escape键。

编辑3:我一直在尝试尝试让这个工作。 我最初发布了以下一些作为单独的帖子,但觉得将它包含在这里可能更相关。

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

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

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

所以,我试图从开始到结束来解决这个问题。 我认为真正的问题是我覆盖了原始值,无法确定是否应该还原它。

Edit4:看起来CellValidating可能值得使用,但是当我试验它时,我看到了奇怪的行为。 在一个新项目中,我创建了DataGridView并注册了各种事件,并看到在CellEndEdit之前触发了CellValidating。 但是,在我试图让它工作的项目中,CellEndEdit正在触发CellFalidating。 关于差异可能是什么的任何想法?

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

首先,你是绝对正确的, KeyPreview将无法正常工作。 起初,我以为我可以通过覆盖表单的IsInputKey方法来解决这个问题。 在其他一些我无法抓住我需要抓住的钥匙的情况下,这种技术对我有用。 这也IsInputKey ,所以我尝试了IsInputKey DataGridViewIsInputKey那里重写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

希望这能满足您的需求。

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

Problem:当用户开始在DGV中编辑单元格值并在提交值EndEdit之前按ESC键,这会将所有DGV字段重新写入数据库,从而更新更新日期和时间字段,我只希望DGV.EndEdit运行当用户实际更改了值并且在执行此操作时未按下ESC。

Solution:在单元格验证我曾经就像一面旗帜检查,如果值被改变,如果标志值是假的只是做一个if(!flag)return; 在EndEdit上

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM