2011-09-12 6 views
1

私はC#のウィンドウフォームで検索機能を実装しています。フォーム上でKeyPreviewをtrueに設定し、、escenterのようなものを捕まえることができるように、KeyDownのイベントハンドラを追加しました。C#:フォームでTextPreviewを使用しているときにTextBoxがキーを受け取らない

これらのキーをうまくキャッチしていて、テキストボックスを表示させることはできますが、ボックスに入力することはできません。すべてのキーは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; 
    } 
+0

最初にTextBoxのfcusイベントをロストし、FindBox.Focus()の後にチェックを入れます。何とかTextBoxを呼び出すと、フォーカスが失われます。 – Tigran

+0

カーソルがまだ表示され、点滅していることを除いて、これは良い提案です。フォーカスが失われていないことはかなりポジティブです。 – mtmurdock

答えて

1

あなたのTextBoxは、おそらくあなたがFocus()を呼び出しているにもかかわらず、フォーカスを持っていません。 〜からthe documentation:

フォーカスは、主にカスタムコントロールの作者を対象とした低レベルのメソッドです。代わりに、アプリケーションプログラマは、子コントロールにはSelectメソッドまたはActiveControlプロパティを使用し、フォームにはActivateメソッドを使用する必要があります。

Focus()の戻り値を確認することはできますが、そのメソッドを使用して任意のコントロールにフォーカスを設定することはほとんどできませんでした。代わりに、ドキュメントで示唆している方法、つまりSelect()を使用してみてください。

EDIT:

ネヴァーマインド(それがまだ有効なアドバイスですが)、私はあなたの問題を参照してくださいと思う:

e.SuppressKeyPress = true 

は、なぜあなたはこれをやっていますか?ここでも、[SuppressKeyPress] the docs:

からすると、キーイベントはあなたが意図的にキーイベントを取得からのTextBoxを妨げている根本的な制御

に渡されるべきかどうかを示す値を取得または設定します。イベントを渡す場合は、そのプロパティをfalseに設定しないでください。

+0

私は答えを感謝しますが、それは私の問題とは無関係です。テキストフィールドをクリックして入力を開始しても、それは機能しません。イベントはまだテキストフィールドには表示されません。 – mtmurdock

+0

@mtmurdock:あなたの問題が表示され、編集が追加されました。 –

+0

ああああ...私は 'ding'ノイズを抑えようとしていて、間違ったコード行をコピーしたに違いありません。あなたは、どのようにして鼎を抑圧するか知っていますか? – mtmurdock

0

このメソッドをオーバーライドしてみてください。

protected override bool ProcessCmdKey(ref Message msg, Keys keyData) 
    { 
     // your code here 

     // this is message example 
     MessageBox.Show(keyData.ToString()); 
     return base.ProcessCmdKey(ref msg, keyData); 
    } 

よろしくお願いいたします。

関連する問題