防止WinForm AcceptButton处理回车键

12

我有一个含有按钮的表单,已经将该按钮与 AcceptButton 属性绑定,这样当用户按下回车键时,逻辑就会执行并关闭该表单。

在该表单中,我显示了一个动态创建的 TextBox,当用户双击某个区域时它会出现,然后当用户按下回车键时它会隐藏。

当用户按下回车键并且 TextBox 获得焦点时,我如何防止表单处理该按键事件?

我曾尝试在 TextBox.KeyDown 事件处理程序中通过 KeyEventArgs.Handled 来处理按键事件,但我的接受按钮的 Button.Click 事件优先触发了……

4个回答

18
当重置表单时,如果文本框具有焦点,则重置表单的“AcceptButton”将起作用,但我认为更合适的解决方案是使用文本框的“AcceptsReturn”属性。
如果您设置
myTextBox.AcceptsReturn = true;

表单不会在按下回车键时接受,但您的文本框可以自行处理。
这将避免在代码中的多个位置重置AcceptButton的需要。

3
更好更优雅的解决方案,加1! - Cyril Gandon
2
只有当 TextBox 的“Multiline”属性为真时,该解决方案才能起作用。 - fusi

13

使用TextBoxEnterLeave事件来将AcceptButton属性设置为null(在Enter事件中),并重新分配给该按钮(在Leave事件中)。


1
这是显而易见的,但我们总是处于这样一种情况下,不确定这是否是解决问题的正确方法。 - Samuel
@Samuel:因为你在我下面发布了我的答案之后发表了评论:在我看来,这不是必须要做的事情,因为没有必要使用任何解决方法。在我看来,这是一种方法,但不是唯一的方法^^ - NobodysNightmare

5

在创建文本框时,将AcceptButton属性设置为null,并在失去焦点时将其恢复到正常值:

var myTextBox = new TextBox ... ;
AcceptButton = null;

myTextBox.Leave += (s, e) => { AcceptButton = btnOK; };

1

要获得一个完整的工作示例,请使用TextBox的AcceptReturn=true,如NobodysNightmare建议,并将SuppressKeyPress设置为true,以避免将事件冒泡到表单中。 要使用AcceptButton,您需要在进入/离开文本框时设置/重置AcceptButton属性,如Fredrik Mörk建议

var tb = new TextBox ...;  
IButtonControl _oldAcceptButton = null;  
tb.AcceptReturn=true;
tb.KeyDown += (s,e) => {
  if(e.KeyCode==Keys.Enter) {
    e.Handled=true;
    //will not inform any parent controls about the event.
    e.SuppressKeyPress=true;

    //do your own logic
    ....
  }
};
tb.Enter+=(s,e)=> {
  _oldAcceptButton = AcceptButton;
  AcceptButton = null;
};
tb.Leave+=(s,e)=>{
  AcceptButton = _oldAcceptButton;
};

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接