2009-08-04 15 views
15

コンボボックスがアクティブなときに、WindowsフォームのコンボボックスでEnterキーを取得するにはどうすればよいですか?WindowsフォームのコンボボックスでEnterキーをキャプチャする方法

私はKeyDownとKeyPressを聞こうとしましたが、サブクラスを作成してProcessDialogKeyをオーバーライドしましたが、何も動作していないようです。

アイデア?

/P

+1

AcceptButtonが定義されていますか? –

答えて

18

このような方法にKeyPressイベントをフックアップ:

protected void myCombo_OnKeyPress(object sender, KeyPressEventArgs e) 
{ 
    if (e.KeyChar == 13) 
    { 
     MessageBox.Show("Enter pressed", "Attention");     
    } 
} 

私はVS2008でのWinFormsアプリケーションでこれをテストしてみたし、それが動作します。

あなたにとって問題が解決しない場合は、コードを投稿してください。

+0

私はすでに試してみました。それは動作しません。あなた自身を試してみてください。 なぜ私は質問を投稿したのですか? – Presidenten

+0

私はそれを試して、それはうまく動作します。あなたのコードを投稿してください... –

+0

可能性のある理由の1つは、他のイベントハンドラが最初に入力をキャッチし、ハンドラの残りの部分を停止させることです。たとえば、メニューまたはフォーム自体。 – Petros

9

またはaltertativelyあなたはKeyDownイベントをフックすることができます:

private void comboBox1_KeyDown(object sender, KeyEventArgs e) 
{ 
    if (e.KeyCode == Keys.Enter) 
    { 
     MessageBox.Show("Enter pressed."); 
    } 
} 
+0

これはVS2010E、thxで動作します:) –

17

あなたは、フォーム上のAcceptButtonを定義する場合は、あなたがKeyDownイベント/ keyUpイベント/ KeyPressイベントでキーを入力して聞くことができません。コンボボックス上にあり、それが他のすべてのコントロールのために前と同じように動作するかどうか、あなたにメッセージボックスを与えるだろう。この例では

protected override bool ProcessCmdKey(ref Message msg, Keys keyData) { 
    if ((this.ActiveControl == myComboBox) && (keyData == Keys.Return)) { 
     MessageBox.Show("Combo Enter"); 
     return true; 
    } else { 
     return base.ProcessCmdKey(ref msg, keyData); 
    } 
} 

それをチェックするために、フォーム上のProcessCmdKeyをオーバーライドする必要があります。

0

フォームプロパティでAcceptButtonに設定されているため、ダイアログにEnterキーを入力するボタンがある可能性があります。
それは場合は、あなたがコントロールがフォーカスを失った後、制御が戻ってそれをリセットし、次にフォーカスを取得したAcceptButtonプロパティ設定を解除することにより、このようなこれを解決なら

private void comboBox1_Enter(object sender, EventArgs e) 
{ 
    this.AcceptButton = null; 
} 

private void comboBox1_Leave(object sender, EventArgs e) 
{ 
    this.AcceptButton = button1; 
} 

private void comboBox1_KeyDown(object sender, KeyEventArgs e) 
    { 
     if (e.KeyData == Keys.Enter) 
     { 
      MessageBox.Show("Hello"); 
     } 
    } 

I(私のコードでは、ボタン1が受け入れボタンがあります)

protected override bool ProcessCmdKey(ref Message msg, Keys k) 
{ 
    if (k == Keys.Enter || k == Keys.Return) 
    { 
     this.Text = null; 
     return true; 
    } 

    return base.ProcessCmdKey(ref msg, k); 
} 
012:誰もがよりよい解決策を持っているならば、私はこれを試してみてください
1
private void comboBox1_KeyDown(object sender, EventArgs e) 
{ 
    if(e.KeyCode == Keys.Enter) 
    { 
     // Do something here... 
    } else Application.DoEvents(); 
} 
1

興味があると思いますので、/ AcceptButtonプロパティを設定解除に少しハックようだと私自身のソリューションを好きではない認めざるを得ません
0
protected void Form_KeyPress(object sender, KeyPressEventArgs e) 
{ 
    if (e.KeyChar == 13) // or Key.Enter or Key.Return 
    { 
     MessageBox.Show("Enter pressed", "KeyPress Event");     
    } 
} 

フォームでKeyPreviewをtrueに設定することを忘れないでください。

関連する問題