C# で Windows フォームに検索機能を実装しています。フォームで true に設定KeyPreview
し、 のイベント ハンドラーを追加して、 、 、 などKeyDown
をキャッチできるようctrl+f
にesc
しenter
ました。
私はこれらのキーを問題なくキャッチしており、テキスト ボックスを表示することはできますが、ボックスに入力することはできません。すべてのキーが移動しますがPortsTraceForm_KeyDown(...)
、テキスト ボックスには到達しません。についてのmsdnページによると、KeyPreview
e.Handledをfalseに設定すると、イベントがフォーカスのあるビュー(テキストボックス)に渡されるはずですが、これは起こっていません。KeyDown
テキスト ボックスのイベントを登録していないので、既定の動作を使用する必要があります。私は何かを逃しましたか?
KeyDown イベント:
private void PortsTraceForm_KeyDown(object sender, KeyEventArgs e)
{
e.SuppressKeyPress = true;
e.Handled = false;
if (e.KeyData == (Keys.F | Keys.Control)) // ctrl+f
{
e.Handled = true;
ShowSearchBar();
}
else if (e.KeyCode == Keys.Escape) // esc
{
e.Handled = true;
HideSearchBar();
}
else if (e.KeyCode == Keys.Enter) // enter
{
if (searchPanel.Visible)
{
e.Handled = true;
if (searchShouldClear)
SearchStart();
else
SearchNext();
}
}
}
検索バーを表示:
private void ShowSearchBar()
{
FindBox.Visible = true;
FindBox.Focus(); // focus on text box
}
検索バーを非表示:
private void HideSearchBar()
{
this.Focus(); // focus on form
FindBox.Visible = false;
}