【问题标题】:Stackoverflow Exception closing FormStackoverflow 异常关闭表单
【发布时间】: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


【解决方案1】:

这是一个小错误,问题是当 FormClosed 事件触发时,孩子仍然存在于 MDIParent1.MdiChildren 集合中。换句话说,FormClosed 事件触发得太快了。因此,当您关闭父级时,它将尝试再次关闭子级。这会再次触发孩子的 FormClosed 事件。这再次关闭了父级。等等。事件触发顺序从来都不是问题。好吧,让我们称之为错误:)

解决方法是改用 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
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-01-30
    • 1970-01-01
    • 1970-01-01
    • 2012-06-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-28
    相关资源
    最近更新 更多