如果用户点击" X"关闭来自子表单的父表单按键

时间:2017-02-13 22:05:01

标签: c# .net winforms

我正在使用WinForms。我有2个表单,Form1 (主表单)和Form2 (子表单)。我希望在用户点击" X"时关闭form1。按钮在form2的顶部。在我的代码中,我试图通过说this.Owner.Close();来关闭form1,但它会抛出错误。为什么会抛出此错误,以及当用户点击" X"时,如何从子表单中关闭主表单?表格顶部的按钮。

错误

  

未处理的类型' System.StackOverflowException'发生在System.Windows.Forms.dll

enter image description here

表单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();
    }

2 个答案:

答案 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();
}