处理此问题的另一种方法是覆盖表单的 ProcessDialogKey() 方法,您可以在该方法中取消接受和/或取消按钮。例如,我有一个带有过滤器编辑器的应用程序,它根据用户输入过滤网格。当过滤器编辑器控件具有应用过滤器的焦点时,我希望用户能够点击返回键。问题是接受按钮代码运行并关闭表单。下面的代码解决了这个问题。
protected override bool ProcessDialogKey(Keys keyData)
{
// Suppress the accept button when the filter editor has the focus.
// This doesn't work in the KeyDown or KeyPress events.
if (((keyData & Keys.Return) == Keys.Return) && (filterEditor.ContainsFocus))
return false;
return base.ProcessDialogKey(keyData);
}
您可以通过将以下代码放入基本对话框表单中来进一步实现这一点。然后,您可以根据需要取消子类中控件的接受按钮。
private readonly List<Control> _disableAcceptButtonList = new List<Control>();
protected override bool ProcessDialogKey(Keys keyData)
{
if (((keyData & Keys.Return) == Keys.Return) && (_disableAcceptButtonList.Count > 0))
{
foreach (Control control in _disableAcceptButtonList)
if (control.ContainsFocus)
return false;
}
return base.ProcessDialogKey(keyData);
}
protected virtual void DisableAcceptButtonForControl(Control control)
{
if (!_disableAcceptButtonList.Contains(control))
_disableAcceptButtonList.Add(control);
}