コンボボックスがアクティブなときに、WindowsフォームコンボボックスでEnterキーをキャプチャするにはどうすればよいですか?
KeyDownとKeyPressをリッスンしようとしましたが、サブクラスを作成してProcessDialogKeyをオーバーライドしましたが、何も機能しないようです。
何か案は?
/ P
KeyPressイベントを次のようなメソッドに接続します。
protected void myCombo_OnKeyPress(object sender, KeyPressEventArgs e)
{
if (e.KeyChar == 13)
{
MessageBox.Show("Enter pressed", "Attention");
}
}
VS2008を使用したWinFormsアプリケーションでこれをテストしましたが、機能します。
それがうまくいかない場合は、コードを投稿してください。
フォームでAcceptButtonを定義した場合、KeyDown/KeyUp/KeyPressでEnterキーを聞くことはできません。
これを確認するには、FORMでProcessCmdKeyをオーバーライドする必要があります。
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);
}
}
この例では、コンボボックスを使用している場合にメッセージボックスが表示され、他のすべてのコントロールに対して以前と同じように機能します。
または、代わりに、KeyDownイベントをフックすることもできます。
private void comboBox1_KeyDown(object sender, KeyEventArgs e)
{
if (e.KeyCode == Keys.Enter)
{
MessageBox.Show("Enter pressed.");
}
}
これを試して:
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);
}
private void comboBox1_KeyDown( object sender, EventArgs e )
{
if( e.KeyCode == Keys.Enter )
{
// Do something here...
} else Application.DoEvents();
}
フォームプロパティでAcceptButtonに設定されているため、ダイアログにEnterキーを使用しているボタンがある可能性があります。
その場合は、コントロールがフォーカスを取得したときにAcceptButtonプロパティを設定解除し、コントロールがフォーカスを失ったときにリセットすることで、このように解決します(私のコードでは、button1は受け入れボタンです)
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");
}
}
AcceptButtonプロパティを設定解除/設定するのは少しハッキーだと思われるので、自分のソリューションが気に入らないことを認めなければなりません。誰かがより良いソリューションを持っているなら、私は興味があるでしょう
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に設定することを忘れないでください。