これを処理する別の方法は、フォームの 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);
}