我在Visual Studio中制作了一个基本的计算器表单,该表单可以使用鼠标单击事件来完全正常运行。我正在尝试添加键盘按下事件,以便您可以使用键盘或鼠标,但是在弄清楚它时遇到了麻烦。
我为按键事件添加了一些代码,但是如果我先单击按钮,则仅有效。如果我选择其他数字,键盘事件将停止工作。
//Code that handles click events
private void number_Click(object sender, EventArgs e)
{
if((txtResult.Text == "0")||(operation))
{
txtResult.Clear();
}
//Cast button to the object sender
operation = false;
Button button = (Button)sender;
//If the button pressed is a "." then check if the txtResult already contains
//a ".", if it does contain a "." then do nothing
if (button.Text == ".")
{
if (!txtResult.Text.Contains("."))
{
txtResult.Text = txtResult.Text + button.Text;
}
}else
txtResult.Text = txtResult.Text + button.Text;
}
//Keyboard press event code
private void num1_key(object sender, KeyPressEventArgs e)
{
if (e.KeyChar == '1')
{
//If keyboard '1' pressed perform number_click()
btn1.PerformClick();
e.Handled = true;
}
}
我有什么明显的失踪或我走错了路吗?
答案 0 :(得分:2)
更新后的答案
如果您仍然遇到问题,您需要做的是删除前面的代码,并使用下面的代码。
//Have your form's KeyPress event like this, replace textBox1 with the name of your textbox
private void Form1_KeyPress(object sender, KeyPressEventArgs e)
{
switch (e.KeyChar)
{
case '0':
textBox1.Text += "0";
break;
case '1':
textBox1.Text += "1";
break;
case '2':
textBox1.Text += "2";
break;
case '3':
textBox1.Text += "3";
break;
case '4':
textBox1.Text += "4";
break;
case '5':
textBox1.Text += "5";
break;
case '6':
textBox1.Text += "6";
break;
case '7':
textBox1.Text += "7";
break;
case '8':
textBox1.Text += "8";
break;
case '9':
textBox1.Text += "9";
break;
case '.':
textBox1.Text += ".";
break;
}
e.Handled = true;
}
具有这样的表单加载事件。
private void Form1_Load(object sender, EventArgs e)
{
this.KeyPreview = true;
}
旧答案
您需要做的就是在窗体上创建KeyPress事件,如下所示。
private void Form1_KeyPress(object sender, KeyPressEventArgs e)
{
if (e.KeyChar == '1')
{
btn1_Click(null, null);
}
else if (e.KeyChar == '2')
{
btn2_Click(null, null);
}
//Go write your code with else if.........
}
然后,如您想在窗体中的焦点处捕获KeyPress事件,下面的代码将上述KeyPress事件添加到窗体上的所有控件,以便您可以在窗体中的焦点处捕获KeyPress事件。表格。
private void Form1_Load(object sender, EventArgs e)
{
foreach (Control ctrl in Controls)
{
ctrl.KeyPress += Form1_KeyPress;
}
}
如@Rufus L在回答中所提到的,您可以只使用KeyPreview属性,该属性将在实际控件收到以下代码之前捕获其他控件的KeyPress事件。
private void Form1_Load(object sender, EventArgs e)
{
this.KeyPreview = true;
}