我正在使用WinForms。我有2个表单,Form1 (主表单)和Form2 (子表单)。我希望在用户点击" X"时关闭form1。按钮在form2的顶部。在我的代码中,我试图通过说this.Owner.Close();
来关闭form1,但它会抛出错误。为什么会抛出此错误,以及当用户点击" X"时,如何从子表单中关闭主表单?表格顶部的按钮。
错误
未处理的类型' System.StackOverflowException'发生在System.Windows.Forms.dll
中
表单1
private void btn_Open_Form2_Click(object sender, EventArgs e)
{
Form2 frm2 = new Form2();
frm2.Owner = this;
frm2.Show();
this.Hide();
}
窗体2
private void Form2_FormClosing(object sender, FormClosingEventArgs e)
{
this.Owner.Close();
}
答案 0 :(得分:6)
当你调用所有者的Close
方法时,它会引发拥有表单的关闭事件处理程序,这样代码就会产生一个导致堆栈溢出的循环。您需要以这种方式更正代码:
void Form2_FormClosing(object sender, FormClosingEventArgs e)
{
if(e.CloseReason!= CloseReason.FormOwnerClosing)
this.Owner.Close();
}
如果要在关闭拥有的表单后关闭应用程序,可以使用:
Application.Exit()
答案 1 :(得分:3)
您应该从其所有者的所有权形式(即Form1)中删除Form2
。然后你可以关闭Form1
而不用无限循环
private void Form2_FormClosing(object sender, FormClosingEventArgs e)
{
var form1 = Owner;
form1.RemoveOwnedForm(this);
form1.Close();
}