- ベストアンサー
C#のKeyDownイベントで電卓のEnterキーがクリックされない理由と解決方法
- C#のKeyDownイベントを使用して電卓を作成している初心者が、Enterキーがクリックされない問題に遭遇しています。他のキーボードのキーは正常に動作しているが、Enterキーだけがフォーカスされたボタンがクリックされた状態になってしまいます。この問題を解決する方法について教えてください。
- 質問者が作成したプログラムは、KeyDownイベントでキーボードのキーごとに処理を行っています。数字キー、+、-、*などは正常に動作しているが、Enterキーだけが問題となっています。フォーカスを設定することでEnterキーの動作を正常化する方法を教えてください。
- Enterキーによるフォーカスの移動やボタンのクリックを実現するためには、KeyDownイベントではなくKeyPressイベントを使用する必要があります。KeyPressイベントを使用することで、Enterキーが正しく動作するようになります。具体的なコードの修正方法について教えてください。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
お返事有難うございます。 見事にはずしました。すいません。 >押す時にはその前の3のボタンにフォーカスされてて押された時にその3も押されたと反応しているようなんです この現象が私の元では確認できませんので、未検証の話でスイマセンが ActiveControlで現在のアクティブコントロールが取得できますので、そのコントロールをよければいいのかな~ 別のサンプルです、上記は考慮していません。足し算のみです。 private void Form1_Shown(object sender, EventArgs e) { this.KeyPreview = true; } int ansadd;//足し算の変数 private void Form1_KeyDown(object sender, KeyEventArgs e) { switch (e.KeyCode) { case Keys.D1: case Keys.NumPad1: this.button_1.Focus(); this.button_1.PerformClick(); ansadd += 1;//押されたボタンがD1の時は1を足す break; case Keys.D2: case Keys.NumPad2: this.button_2.Focus(); this.button_2.PerformClick(); ansadd += 2;//押されたボタンがD2の時は2を足す break; case Keys.D3: case Keys.NumPad3: this.button_3.Focus(); this.button_3.PerformClick(); ansadd += 3;//押されたボタンがD3の時は3を足す break; case Keys.D4: case Keys.NumPad4: this.button_4.Focus(); this.button_4.PerformClick(); ansadd += 4;//押されたボタンがD4の時は4を足す break; case Keys.D5: case Keys.NumPad5: this.button_5.Focus(); this.button_5.PerformClick(); ansadd += 5;//押されたボタンがD5の時は5を足す break; case Keys.Add://足し算だけですので、今回は置いてあるだけ this.button_tasu.Focus(); this.button_tasu.PerformClick(); break; } } //Enterキーが押されたとき private void Form1_KeyUp(object sender, KeyEventArgs e) { if (e.KeyData == Keys.Enter) { this.button_kei.Focus(); this.button_kei.PerformClick(); //足し算のみ textBox1.Text = ansadd.ToString(); e.Handled = true; } } //クリア private void button1_Click(object sender, EventArgs e) { textBox1.Text = ""; ansadd = 0; } }
その他の回答 (1)
- 田中 裕之(@bybalsendercase)
- ベストアンサー率88% (56/63)
こんばんは >Enterキーだけは >フォーカスされてるボタンがクリックされた状態になってしまいます。 すいません、上記の意味がわかっていません。 普通EnterキーはKeyDownは使いませんので、Enterキーだけ別のイベントハンドラーに記載したサンプルを作成しました。 private void Form1_Shown(object sender, EventArgs e) { this.KeyPreview = true; } private void Form1_KeyDown(object sender, KeyEventArgs e) { switch (e.KeyCode) { case Keys.D1: case Keys.NumPad1: this.button_1.Focus(); this.button_1.PerformClick(); MessageBox.Show("1"); break; case Keys.D2: case Keys.NumPad2: this.button_2.Focus(); this.button_2.PerformClick(); MessageBox.Show("2"); break; case Keys.Enter: this.button_kei.Focus(); this.button_kei.PerformClick(); break; } } private void Form1_KeyUp(object sender,KeyEventArgs e) { if (e.KeyData ==Keys.Enter ) { this.button_kei.Focus(); this.button_kei.PerformClick(); MessageBox.Show("kei"); e.Handled = true; } } 外してましたらすいません。
お礼
ご回答ありがとうございます! 早速追加させていただきました。 Enterキーは指定のボタンに反応するようになったのですが 例えば、 5+3= というのを入力したとして =をEnterに割り当ててるんですが、押す時にはその前の3のボタンにフォーカスされてて押された時にその3も押されたと反応しているようなんです>< そして答えが38になってしまいます。 Enterじゃなく直接=ボタンをクリックすると正常に8がでます。 Enterでボタンが押されるというのを無効にする事はできないでしょうか?
お礼
また、回答していただきありがとうございます! こちらこそすいません>< やってみましたらEnterを押した時に変な数字が出ますが、話したときにそれが上書きされる感じで正しい表示がでました! ちゃんと見直せばなんとかいけそうなきがします。 お付き合い頂きありがとうございましたー! 見直してみてダメだったら、またお願いするかもわかりませんが、その時はよろしくお願いしますorz