Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/277.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
我如何捕捉触发的击键;CellEndEdit“;关于C#中的DataGridView?_C#_.net_Datagridview_Keydown - Fatal编程技术网

我如何捕捉触发的击键;CellEndEdit“;关于C#中的DataGridView?

我如何捕捉触发的击键;CellEndEdit“;关于C#中的DataGridView?,c#,.net,datagridview,keydown,C#,.net,Datagridview,Keydown,我有一个设置为EditOnF2的DataGridView。我在设置单元格值的CellEndEdit eventhandler中对数据进行了一些特殊处理。我仍然想要EditOnKeystrokeOrF2在按下Esc键时恢复到原始值的功能。不幸的是,在CellEndEdit事件处理程序中,我看不到一种方法来判断是什么导致了CellEndEdit事件被触发。我只想在未按下Esc键的情况下更改单元格的值。我怎么知道是不是 编辑:值得注意的是,编辑单元格时不会触发KeyDown事件,最后结束的击键也不会触

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

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

Edit2:我尝试了KeyPreview建议,但是表单仍然没有捕获正在按下的Escape键

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

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

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

举例说明:如果单元格中的值为“54.3”,并且我按了“9”键,它将开始编辑单元格并在其中放置一个“9”。如果我点击Escape,它将返回到“9”,而不是返回到“54.3”。我想让它恢复到原来的“54.3”值

因此,我正试图从一开始就解决这个问题,并从最后解决这个问题。我认为真正的问题是,我正在覆盖原始值,无法确定是否应该恢复它


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

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

首先,你完全正确,
KeyPreview
不起作用。起初,我认为可以通过重写表单的方法来解决这个问题。这项技术在其他一些情况下对我有效,因为我抓不到需要抓的钥匙。这也不起作用,所以我尝试对
DataGridView
进行子类化,并在那里重写
IsInputKey
。那也没用。在深入研究了我可以覆盖的其他方法之后,我了解到我需要截取另一类键,称为命令键。要做到这一点,请覆盖
DataGridView
(需要对其进行子类化)

这是我的密码:

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

希望这能满足您的需要。

我的问题与此类似,以下是我的解决方法:

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


解决方案:
在单元格验证中,我使用了一个类似于检查值是否更改的标志,如果标志值为false,只需执行
如果(!flag)返回谢谢,但尝试此操作后,单元格似乎仍仅将escape键识别为编辑结束,而不是表单上的实际按键或按键事件。