如果用户单击"X"按钮,则从子窗体关闭父窗体

taj*_*i01 4 .net c# winforms

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

错误

System.Windows.Forms.dll中发生了未处理的"System.StackOverflowException"类型异常

在此输入图像描述

表格1

    private void btn_Open_Form2_Click(object sender, EventArgs e)
    {
        Form2 frm2 = new Form2();
        frm2.Owner = this;
        frm2.Show();
        this.Hide();
    }
Run Code Online (Sandbox Code Playgroud)

窗体2

    private void Form2_FormClosing(object sender, FormClosingEventArgs e)
    {
        this.Owner.Close();
    }
Run Code Online (Sandbox Code Playgroud)

Rez*_*aei 6

当你调用Close所有者的方法时,它会提升自有表单的关闭事件处理程序,这样代码就会产生一个循环,导致堆栈溢出.您需要以这种方式更正代码:

void Form2_FormClosing(object sender, FormClosingEventArgs e)
{
    if(e.CloseReason!= CloseReason.FormOwnerClosing)
        this.Owner.Close();
}
Run Code Online (Sandbox Code Playgroud)

如果要在关闭拥有的表单后关闭应用程序,可以使用:

Application.Exit()
Run Code Online (Sandbox Code Playgroud)


Ser*_*kiy 5

Form2您应该从其所有者拥有的表单(即 Form1)中删除。然后就可以关闭Form1而不会无限循环

private void Form2_FormClosing(object sender, FormClosingEventArgs e)
{
    var form1 = Owner;
    form1.RemoveOwnedForm(this);
    form1.Close();
}
Run Code Online (Sandbox Code Playgroud)