C# 防止WinForm AcceptButton处理返回键

C# 防止WinForm AcceptButton处理返回键,c#,winforms,C#,Winforms,我有一个表单,它有一个连接到AcceptButton属性的按钮,这样当用户按下Return键时,就会出现逻辑并关闭表单 在该表单上,我显示了一个动态创建的文本框,当用户双击某个区域时显示该文本框,然后在用户按Return时隐藏该文本框 当文本框有焦点时,当用户按下Return键时,如何防止表单处理按键 我试图说按键是在文本框中处理的。KeyDown事件处理程序通过KeyEventArgs.handled但是按钮被处理。单击我的accept按钮的事件首先被触发…使用文本框的Enter和Leave事

我有一个表单,它有一个连接到
AcceptButton
属性的按钮,这样当用户按下Return键时,就会出现逻辑并关闭表单

在该表单上,我显示了一个动态创建的
文本框
,当用户双击某个区域时显示该文本框,然后在用户按Return时隐藏该文本框

文本框有焦点时,当用户按下Return键时,如何防止表单处理按键


我试图说按键是在
文本框中处理的。KeyDown
事件处理程序通过
KeyEventArgs.handled
但是
按钮被处理。单击我的accept按钮的事件首先被触发…

使用
文本框的
Enter
Leave
事件来设置
AcceptButton
属性设置为
null
(在
输入
)并将按钮重新分配给它(在
离开
)。

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

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

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

在文本框有焦点时重置表单
AcceptButton
会起作用,我认为更合适的解决方案是使用textboxs
AcceptsReturn
属性

如果你设定

myTextBox.AcceptsReturn = true;
按RETURN键时表单将不接受,但您的文本框可以自行处理


这将避免在代码中的多个位置重置AcceptButton。

要获得完整的工作示例,请使用文本框a的AcceptReturn=true,并将SuppressKeyPress设置为true,以避免将事件冒泡到表单中。 要使用AcceptButton,您需要在输入/离开文本框时设置/重置AcceptButton属性


这么多更好、更优雅的解决方案,+1!只有当文本框的“Multiline”属性为真时,此解决方案才会起作用。这是显而易见的,但我们总是不确定这是否是解决方法。@Samuel:因为你在我发布我的以下内容后发表了评论:这不是要做的,因为不需要解决方法。我知道这是一种方法,但不是方法^^
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;
};