5

我有一个设置为 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 之前触发。关于可能有什么区别的任何想法?

4

3 回答 3

2

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

于 2009-04-21T21:12:41.193 回答
0

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

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

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

于 2012-01-17T21:23:38.163 回答
0

首先,你是绝对正确的,KeyPreview不会工作。起初,我认为我可以通过覆盖表单的IsInputKey方法来解决这个问题。这种技术在其他一些我无法抓住我需要抓住的钥匙的情况下对我有用。那也不起作用,所以我尝试在那里继承DataGridView和覆盖IsInputKey。那也没有用。在对我可以覆盖的其他方法进行了一些挖掘之后,我了解到我需要拦截另一类称为命令键的键。为此,请覆盖您的ProcessCmdKeyDataGridView(您需要对其进行子类化)。

这是我的代码:

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

希望这能给你你所需要的。

于 2010-06-10T13:58:26.940 回答