按下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&的新手。净

按下Enter-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);
    }
}

移除该处理程序,并将FormAcceptButton设置为button1AcceptButton是一个可以在设计器中简单设置的属性。

您不能从静态成员访问实例成员

要么你必须

  • 使该方法成为实例方法(删除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);
    }
}