Iss*_*ber 4 c# stack-overflow winforms
我在WinForms中遇到了问题.我创建了一个MDIParent-Form,我从MDIParent的Load中调用了一个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.}
}
Run Code Online (Sandbox Code Playgroud)
但如果我使用
Application.Exit();
Run Code Online (Sandbox Code Playgroud)
而不是this.Close()......一切正常......我想知道为什么......有人可以解释一下吗?
更新: 我在没有MDIParent的情况下尝试了相同的操作并且一切正常......但是如果我使用MDIParent,为什么会出现问题
这有点像bug,问题是MDIParent1.MdiChildren当FormClosed事件触发时,子集仍然存在于集合中.换句话说,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
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1448 次 |
| 最近记录: |