使用按钮动态创建表单,并在单击按钮时关闭此表单

本文关键字:按钮 表单 单击 动态 创建 | 更新日期: 2023-09-27 18:28:38

form1上,我有registerButton,它创建了带有acceptButton的新registerForm。两者都是动态创建的:

private void registerButton_Click(object sender, EventArgs e)
{
    registerButton.Enabled = false;
    Form registrationForm = new Form();
    registrationForm.Text = "Register new account";
    registrationForm.Visible = true;
    Button createButton = new Button();
    createButton.Text = "Accept";
    registrationForm.Controls.Add(createButton);
    createButton.Click+= new EventHandler(createButton_Click);        
}

单击acceptButton后如何关闭registerForm而不关闭form1

使用按钮动态创建表单,并在单击按钮时关闭此表单

您丢失了对注册表单实例的引用。但是,您总是可以从传递给Click事件处理程序的sender参数中获取它。像这样:

    private void registrationButton_Click(object sender, EventArgs e) {
        var btn = (Control)sender;
        btn.FindForm().Close();
    }

对于您的代码(我不建议使用),修复将是

createButton.Click += (s,e) => registrationForm.Close();

当您将此lambda附加为事件处理程序时,您有机会在闭包中捕获registrationForm实例。因此,当点击事件发生时,表单实例将可用,您将能够关闭此表单。


更好的方法是:不要动态地将按钮添加到表单中,而是将此按钮静态地放置在设计器中,并附加将关闭表单的点击事件处理程序:

private void acceptButton_Click(object sender, EventArgs e)
{
    Close();
}    

注册表格的使用将很简单:

private void registerButton_Click(object sender, EventArgs e)
{
    Form registrationForm = new Form();
    registrationForm.Show();
}

acceptButton的点击事件中添加this.Close()。您可以动态地将事件附加到它。创建按钮时,执行acceptButton.Click += new System.EventHandler(accepButton_click);并创建匹配功能,或在执行+=后按Tab键两次。