按下Enter-c#时调用按钮单击事件
本文关键字:单击 事件 按钮 调用 Enter-c# 按下 | 更新日期: 2023-09-27 18:24:21
我是c#的新手-我想在按下回车键时触发按钮点击事件。我的代码工作不正常-
问题是,当我在提交某个值时按enter键,它会显示它应该显示的消息框,但当按下messagebox的OK按钮时,它会自动再次触发按钮点击事件,即使我没有按enter键或输入任何其他值。
public partial class Form1 : Form
{
int n1, n2 = 0;
private static readonly Random getrandom = new Random();
private static readonly object syncLock = new object();
public int GetRandomNumber(int min, int max)
{
lock (syncLock)
{ // synchronize
return getrandom.Next(min, max);
}
}
public int tQuestion()
{
n1 = GetRandomNumber(2, 11);
n2 = GetRandomNumber(2, 11);
string tQues = n1 + " x " + n2 + " = ";
label1.Text = tQues;
return 0;
}
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
tQuestion();
}
private void label1_Click(object sender, EventArgs e)
{
}
private void textBox1_TextChanged(object sender, EventArgs e)
{
textBox1.KeyDown += new KeyEventHandler(tb_KeyDown);
}
public void button1_Click(object sender, EventArgs e)
{
string tAns = textBox1.Text;
int answer = n1 * n2;
string tOrgAns = answer.ToString();
if (tAns == tOrgAns)
MessageBox.Show("Your answer is Corect", "Result", MessageBoxButtons.OK,MessageBoxIcon.Exclamation );
else
MessageBox.Show("Your answer is WRONG", "Result", MessageBoxButtons.OK, MessageBoxIcon.Stop);
textBox1.Text = "";
textBox1.Focus();
tQuestion();
}
static void tb_KeyDown(object sender, KeyEventArgs e)
{
if (e.KeyCode == Keys.Enter)
{
button1_Click(sender, e);
}
}
此外,只有当我从static void tb_KeyDown(object sender, KeyEventArgs e)
中删除static
时,代码才能工作,否则会出现错误:
非静态字段、方法或属性
请帮帮我,我是c&的新手。净
将按钮点击事件处理程序提取到单独的方法(例如VerifyAnswer
)中,并从两个位置调用它:
public void button1_Click(object sender, EventArgs e)
{
VerifyAnswer();
}
// NOTE: static modifier removed
private void tb_KeyDown(object sender, KeyEventArgs e)
{
if (e.KeyCode == Keys.Enter)
VerifyAnswer();
}
private void VerifyAnswer()
string tAns = textBox1.Text;
int answer = n1 * n2;
string tOrgAns = answer.ToString();
if (tAns == tOrgAns)
MessageBox.Show("Your answer is Corect", "Result", MessageBoxButtons.OK,MessageBoxIcon.Exclamation );
else
MessageBox.Show("Your answer is WRONG", "Result", MessageBoxButtons.OK, MessageBoxIcon.Stop);
textBox1.Text = "";
textBox1.Focus();
tQuestion();
}
不要试图手动执行事件处理程序——它们的目的只是处理事件。
当文本框处于焦点时进行调用。更好的选择是创建一个单独的函数并从两者调用。
我已对您的代码进行了更改。它对我有效。您需要将tb_keyDown
事件与Textbox Properties中的keyDown
属性链接起来。
试试这个代码:
public partial class Form1 : Form
{
int n1, n2 = 0;
private static readonly Random getrandom = new Random();
private static readonly object syncLock = new object();
public int GetRandomNumber(int min, int max)
{
lock (syncLock)
{ // synchronize
return getrandom.Next(min, max);
}
}
public int tQuestion()
{
n1 = GetRandomNumber(2, 11);
n2 = GetRandomNumber(2, 11);
string tQues = n1 + " x " + n2 + " = ";
label1.Text = tQues;
return 0;
}
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
tQuestion();
}
private void label1_Click(object sender, EventArgs e)
{
}
private void textBox1_TextChanged(object sender, EventArgs e)
{
//make it empty. You need to attach tb_KeyDown event in properties
}
public void button1_Click(object sender, EventArgs e)
{
CheckAnswer();
}
void tb_KeyDown(object sender, KeyEventArgs e)
{
if (e.KeyCode == Keys.Enter)
{
CheckAnswer();
}
}
private void CheckAnswer()
{
string tAns = textBox1.Text;
int answer = n1 * n2;
string tOrgAns = answer.ToString();
if (tAns == tOrgAns)
MessageBox.Show("Your answer is Corect", "Result", MessageBoxButtons.OK,MessageBoxIcon.Exclamation );
else
MessageBox.Show("Your answer is WRONG", "Result", MessageBoxButtons.OK, MessageBoxIcon.Stop);
textBox1.Text = "";
textBox1.Focus();
tQuestion();
}
}
您可能想要使用一个静态的无参数keylistener,您可以在静态方法中单独运行它来检查键输入。然后解析那里的关键输入
这是因为这个代码:
static void tb_KeyDown(object sender, KeyEventArgs e)
{
if (e.KeyCode == Keys.Enter)
{
button1_Click(sender, e);
}
}
移除该处理程序,并将Form
的AcceptButton
设置为button1
。AcceptButton
是一个可以在设计器中简单设置的属性。
您不能从静态成员访问实例成员
要么你必须
- 使该方法成为实例方法(删除static关键字)
- 使字段/方法为static(添加static关键字)
您选择的字段将取决于是否应在所有实例中共享该字段。
希望它能帮助
你在找吗
button1.PerformClick()
不要试图触发按钮点击。本质上,您应该做的是重构代码,以便将事件处理程序与实际实现分离。例如
ButtonClick(...)
{
ExecuteMethod();
}
KeyDown(...)
{
ExecuteMethod();
}
ExecuteMethod()
{
// Actual implementation.
}
这将解除您正在订阅的事件与实现的关联。这样,在将来,如果您希望添加新按钮或围绕事件处理程序进行更改,那么实际的逻辑实现将保持不变。
请检查以下选项:
(1) 您可以不在中使用AcceptButton作为窗体属性窗口吗?这设置了按下"Enter"键的默认行为,但您仍然可以使用其他快捷方式。(2)
static void tb_KeyDown(object sender, KeyEventArgs e)
{
if (e.KeyCode == (char)13)
{
button1_Click(sender, e);
}
}