TextBox自动完成和默认按钮

我在表单上有一个带有自动完成function的.NET TextBox。 表单还定义了AcceptButton和CancelButton。 如果我尝试使用Enter键提交建议或使用Esc关闭下拉菜单,我的表单将关闭。 我该如何防止这种行为?

不要分配AcceptButton和CancelButton表单属性。 在按钮OnClick事件中设置DialogResult。

简单的方法是在自动完成文本框中删除AcceptButtonCancelButton属性:

public Form1() { InitializeComponent(); txtAuto.Enter +=txtAuto_Enter; txtAuto.Leave +=txtAuto_Leave; } private void txtAC_Enter(object sender, EventArgs e) { AcceptButton = null; CancelButton = null; } private void txtAC_Leave(object sender, EventArgs e) { AcceptButton = btnOk; CancelButton = btnCancel; } 

而不是接受和取消按钮,您可以采取以下方法:

  1. 将表单的KeyPreview属性设置为true。
  2. 处理表单的KeyDown事件,在处理程序方法中,您可以使用类似于下面的代码

     switch (e.KeyCode) { case Keys.Enter: { if (!txtAuto.Focused) { Save(); } break; } case Keys.Escape: { if (!txtAuto.Focused) { Close(); } break; } } 

另一个选项是派生自己的自定义TextBox类,在按下Enture / Return时执行validation:

 public class MyTextBox : TextBox { protected override bool ProcessCmdKey(ref Message msg, Keys keyData) { if (keyData == Keys.Enter || keyData == Keys.Return) { // Perform validation here return true; } else return false; } }