【发布时间】:2015-05-02 21:20:16
【问题描述】:
我在 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,为什么会有问题
【问题讨论】:
-
你有一个死循环:如果表单被任何事件关闭,它会告诉表单关闭,这会再次触发事件,并再次尝试关闭。
-
如果我不使用 MDIParent 为什么它会起作用??
-
也许当您调用
this.Close()时,它会在所有子窗体上调用close,而后者又调用childForm_FormClosed,这就是您的无限递归?我几乎可以肯定 Memphy 的解释是正确的。 -
如果关闭父级,子级不也被关闭吗?这可以解释你的无限循环
标签: c# winforms stack-overflow