gpt4 book ai didi

c# - Stackoverflow 异常关闭表单

转载 作者:太空狗 更新时间:2023-10-30 01:03:16 26 4
gpt4 key购买 nike

我在 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com