我有一个窗体,其中有一个文本框和一个按钮。我已经将Form的AcceptButton属性设置为Button,并将TextBox的AcceptsReturn属性设置为false

class Window : Form
{
    private TextBox textBox1;
    private Button btn;
    public Window()
    {
        this.Size = new Size(200, 200);
        this.AcceptButton = this.btn;

        textBox1 = new TextBox();
        textBox1.Location = new Point(10, 10);
        textBox1.Width = 50;
        textBox1.AcceptsReturn = false;
        this.Controls.Add(textBox1);

        btn = new Button();
        btn.Text = "Test";
        btn.Location = new Point(textBox1.Right + 10, 10);
        btn.Click += btn_Click;
        this.Controls.Add(btn);
    }

    void btn_Click(object sender, EventArgs e)
    {
        MessageBox.Show("Works");
    }
}

class Program
{
    static void Main(string[] args)
    {
        Application.EnableVisualStyles();
        Application.Run(new Window());
    }
}


但是,当文本框处于焦点状态时按Enter键时,窗体的AcceptButton不会被激活。我使用TextBox的KeyDown事件来解决它,如下所示:

textBox1.KeyDown += (s,e) => { if (e.KeyCode == Keys.Enter) btn.PerformClick(); } ;


并且尽管它起作用了,但我很好奇为什么使用AcceptButton属性的早期方法失败了。

最佳答案

问题是您在实例化窗体之前将窗体的AcceptButton设置为btn。在this.AcceptButton = this.btn;之后将btn = new Button();移动到任何行。btn指向空引用,直到new Button()。实例化btn后,可以使用它来设置AcceptButton

10-06 01:03