防止WinForm AcceptButton处理返回键

我有一个表单,其中一个按钮连接到AcceptButton属性,以便在用户按下Return键时发生逻辑并关闭表单。

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

TextBox具有焦点时,如果用户按下Return键,如何防止表单处理按键?

我试图通过KeyEventArgs.HandledTextBox.KeyDown事件处理程序中处理按键,但我的接受按钮的Button.Click事件首先被触发…

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

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

如果你设置

 myTextBox.AcceptsReturn = true; 

按下RETURN时表单不会接受,但您的TextBox可以自行处理。

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

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

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

要获得完整的工作示例,请使用TextBox的AcceptReturn = true作为NobodysNightmare建议 ,并将SuppressKeyPress设置为true以避免将事件冒泡到Form。 要使用AcceptButton,您需要在FredrikMörk建议进入/离开texbox时设置/重置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; };