在form1
上,我registerButton
创建了新的registerForm
,其中包含acceptButton
。两者都是动态创建的:
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);
}
点击registerForm
而不关闭acceptButton
后如何关闭form1
?
答案 0 :(得分:3)
您已丢失对注册表单实例的引用。但是,您始终可以从传递给Click事件处理程序的 sender 参数中获取它。像这样:
private void registrationButton_Click(object sender, EventArgs e) {
var btn = (Control)sender;
btn.FindForm().Close();
}
答案 1 :(得分:2)
对于您的代码(我不建议使用),修复将是
createButton.Click += (s,e) => registrationForm.Close();
当您将此lambda作为事件处理程序附加时,您有机会在闭包中捕获registrationForm
实例。因此,当点击事件发生时,表单实例将可用,您将能够关闭此表单。
更好的方法:不是动态地向窗体添加按钮,而是将此按钮静态放置在设计器中并附加将关闭窗体的click事件处理程序:
private void acceptButton_Click(object sender, EventArgs e)
{
Close();
}
使用注册表格很简单:
private void registerButton_Click(object sender, EventArgs e)
{
Form registrationForm = new Form();
registrationForm.Show();
}
答案 2 :(得分:1)
在this.Close()
的点击事件中添加acceptButton
。
您可以动态地附加事件。在创建按钮时,执行acceptButton.Click += new System.EventHandler(accepButton_click);
并创建匹配功能或在执行+ =。