【发布时间】:2010-11-07 07:33:21
【问题描述】:
我在表单上有一个带有自动完成功能的 .NET 文本框。该表单还定义了 AcceptButton 和 CancelButton。如果我尝试使用 Enter 键提交建议或使用 Esc 关闭下拉菜单,我的表单将关闭。 如何防止这种行为?
【问题讨论】:
标签: c# .net winforms textbox autocomplete
我在表单上有一个带有自动完成功能的 .NET 文本框。该表单还定义了 AcceptButton 和 CancelButton。如果我尝试使用 Enter 键提交建议或使用 Esc 关闭下拉菜单,我的表单将关闭。 如何防止这种行为?
【问题讨论】:
标签: c# .net winforms textbox autocomplete
另一种选择是派生您自己的自定义 TextBox 类,该类在按下 Enture/Return 时执行验证:
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;
}
}
【讨论】:
简单的方法是在自动完成文本框中删除 AcceptButton 和 CancelButton 属性:
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;
}
【讨论】:
您可以采用以下方法,而不是接受和取消按钮:
处理表单的KeyDown事件,在handler方法中你可以有类似下面代码的东西
switch (e.KeyCode)
{
case Keys.Enter:
{
if (!txtAuto.Focused)
{
Save();
}
break;
}
case Keys.Escape:
{
if (!txtAuto.Focused)
{
Close();
}
break;
}
}
【讨论】:
不要分配 AcceptButton 和 CancelButton 表单属性。在按钮的 OnClick 事件中设置 DialogResult。
【讨论】: