Rvd*_*vdK 2 c# stack-overflow exception winforms
我正在尝试关闭子表单时关闭我的主(父)表单.但是这给了我一个StackOverflow异常.
但是,如果我在FormClosed事件上调用_child.Dispose,它将按预期工作.我应该这样做吗?我为什么要打电话给Dispose?(因为.Show()它不应该是neceserry对吗?
一个小演示:
public partial class frmChild : Form
{
public frmChild()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
this.Close();
}
}
public partial class frmParent : Form
{
private frmChild _child;
public frmParent()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
_child = new frmChild();
_child.FormClosed += child_FormClosed;
_child.Show(this);
}
void child_FormClosed(object sender, FormClosedEventArgs e)
{
//_child.Dispose(); <-- uncomment and it works
this.Close(); // <-- StackOverflow exception
}
}
Run Code Online (Sandbox Code Playgroud)
解决方案,由Teoman Soygul评论(供将来参考):
用this.Close()关闭主窗体; 表示所有子窗口按顺序关闭,以便创建无限循环
在父母中调用this.Close()后,它会向所有孩子发出关闭aswel的信号,这将发送另一个FormClosed事件......我通过不指定所有者来解决它,_child.Show();我没有使用所有者.
由于每次通话时间this.Close();的FormClosed事件被炒鱿鱼,然后调用this.Close();再次,创建一个无限循环.另一方面,如果表单已经处理好(如取消注释处理行),则FormClosed事件不会再次被触发,因为对象已经被处理掉了.因此,在事件中处理表单是正确的,或者如果您不想这样做,您可以使用私有bool字段添加额外的检查,例如:
if (!formClosed)
{
this.formClosed = true;
this.Close();
}
Run Code Online (Sandbox Code Playgroud)