防止WinForm AcceptButton处理返回键

时间:2010-09-21 14:04:21

标签: c# winforms

我有一个带有连接到AcceptButton属性的按钮的表单,以便在用户按下Return键时出现逻辑并关闭表单。

在该表单上,我显示了当用户双击某个区域时出现的动态创建的TextBox,然后在用户按下Return时隐藏。

当用户在TextBox有焦点时按下Return键时,如何阻止表单处理按键操作?

我试图通过TextBox.KeyDownKeyEventArgs.Handled事件处理程序中处理按键操作,但我的接受按钮的Button.Click事件首先被触发...

4 个答案:

答案 0 :(得分:14)

在TextBox具有焦点时重置表单AcceptButton会起作用,我相信更合适的解决方案是使用TextBox AcceptsReturn属性。

如果您设置

myTextBox.AcceptsReturn = true;

表格在按RETURN时不接受,但你的TextBox可以自己处理。

这样可以避免在代码中的多个位置重置AcceptButton。

答案 1 :(得分:11)

使用Enter的{​​{1}}和Leave个事件将TextBox属性设置为AcceptButton(在null上)并重新将按钮分配给它(在Enter上)。

答案 2 :(得分:4)

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

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

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

答案 3 :(得分:1)

要获得完整的工作示例,请将TextBox的AcceptReturn = true用作NobodysNightmare suggested,并将SuppressKeyPress设置为true,以避免将事件冒泡到Form。 要使用AcceptButton,当您输入/离开texbox为Fredrik Mörk suggested时,需要设置/重置AcceptButton属性。

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;
};