1

我有一个表单 myForm,它的 KeyPreview 设置为 true。

这个想法是我想捕获 CTRL-Enter 并触发表单的提交按钮,无论哪个文本框(或其他控件)可能具有焦点。

所以我设置了这个方法:

private void myForm_KeyUp(object sender, KeyEventArgs e)
{
    if (e.Control && e.KeyCode == Keys.Enter)
    {
        btnCommit_Click(sender, new EventArgs()); 
    }
}

这正是它所说的。问题是,在具有焦点的文本框中也会触发回车键击,因此文本框现在在单词中间或光标所在的任何位置都有一个换行符。根据 MSDN 文档:

当此属性设置为 true 时,表单将接收所有 KeyPress、KeyDown 和 KeyUp 事件。在窗体的事件处理程序完成对击键的处理之后,击键被分配给具有焦点的控件。

不幸的是,这不是真的,我已经通过单步执行代码验证了文本框确实在 myForm_KeyUp 代码被触发之前显示了新的换行符。

我试过同时添加

e.Handled = true;

e.SuppressKeyPress = true;

无效,因为文本框已经显示了换行符。

有任何想法吗?我错过了什么吗?

4

2 回答 2

2

您应该改写 OnProcessCmdKey()。它提前运行,确保没有控制可以窃取击键。

于 2010-07-23T18:05:12.990 回答
1

所以这应该是没有道理的。我把所有这些都打了出来,才意识到我应该处理的是KeyDown而不是 KeyUp。KeyUp 显然在 TextBox 的 KeyDown 之后触发,即使它在 TextBox 的 KeyUp 之前触发。

于 2010-07-23T17:46:44.383 回答