C# Stackoverflow异常关闭窗体
我在WinForms中遇到问题。我创建了一个MDIParent表单,并从MDIParent的加载中调用了一个子表单。我想知道,如果子窗体关闭,父窗体必须关闭,应用程序退出。这就是为什么我在MDIParent中为子窗体编写了一个事件,因此,如果子窗体关闭,将在MDIParent中触发FormClosed事件,但它会引发堆栈溢出异常。我知道有一个无限循环,但我不知道为什么C# Stackoverflow异常关闭窗体,c#,winforms,stack-overflow,C#,Winforms,Stack Overflow,我在WinForms中遇到问题。我创建了一个MDIParent表单,并从MDIParent的加载中调用了一个子表单。我想知道,如果子窗体关闭,父窗体必须关闭,应用程序退出。这就是为什么我在MDIParent中为子窗体编写了一个事件,因此,如果子窗体关闭,将在MDIParent中触发FormClosed事件,但它会引发堆栈溢出异常。我知道有一个无限循环,但我不知道为什么 private void MDIParent1_Load(object sender, EventArgs e)
private void MDIParent1_Load(object sender, EventArgs e)
{
Form1 childForm = new Form1();
childForm.MdiParent = this;
childForm.FormClosed += childForm_FormClosed;
childForm.Show();
}
void childForm_FormClosed(object sender, FormClosedEventArgs e)
{
this.Close();
//{Cannot evaluate expression because the current thread is in a stack overflow state.}
}
但是如果我使用
Application.Exit();
而不是this.Close()
。。。一切正常。。。我想知道为什么…有人能解释一下吗
更新:
我在没有MDIParent的情况下尝试过同样的方法,但一切都正常……但是如果我使用MDIParent,为什么会出现问题呢?这是一个小错误,问题是当FormClosed事件触发时,子项仍然存在于
MDIParent1.MdiChildren
集合中。换句话说,FormClosed事件触发得有点太快。因此,当您关闭父对象时,它将再次尝试关闭子对象。再次触发子级的FormClosed事件。这将再次关闭父级。等等。事件触发顺序从来都不是问题。好吧,让我们称之为bug:)
解决方法是使用Disposed事件,它将在以后触发:
private void MDIParent1_Load(object sender, EventArgs e)
{
Form1 childForm = new Form1();
childForm.MdiParent = this;
childForm.Disposed += childForm_Disposed;
childForm.Show();
}
void childForm_Disposed(object sender, EventArgs e)
{
this.Close(); // Fine now
}
您有一个无限循环:如果窗体被任何事件关闭,它将通知窗体关闭,这将再次触发事件,并再次尝试关闭。如果我不使用MDIParent,为什么它会工作?也许当您调用
this.close()
,它会对所有子窗体调用close,依次调用childForm\u FormClosed
,这就是你的无限递归?我几乎可以肯定梅菲的解释是正确的。如果你关闭父母,孩子们不也会关闭吗?这可以解释你的无限循环