我在 WinForms 中遇到问题。我创建了一个 MDIParent-Form,并从 MDIParent 的负载中调用了一个 ChildForm。我希望如果 ChildForm 关闭,则 MDIParent 必须关闭并且应用程序退出。这就是为什么我在 MDIParent 中为 childForm 编写了一个事件,这样如果 ChildForm 关闭,FormClosed-Event 将在 MDIParent 中被触发,但它会抛出堆栈溢出异常。我知道有一个无限循环,但我不知道为什么...
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 事件触发的有点太早了。所以当你关闭父级时,它会再次尝试关闭子级。这再次触发 child 的 FormClosed 事件。再次关闭 parent 。等等。事件触发顺序从来都不是问题。好吧,让我们称之为错误 :)
解决方法是改用 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
}
关于c# - Stackoverflow 异常关闭表单,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30007624/