我有一个 MdiParent,它打开一个表单的多个实例作为它的 MdiChildren。打开每个表格时,我都会调用this.LayoutMdi(MdiLayout.TileHorizontal);
以布置所有表格。
我想要做的是在表单关闭时做同样的事情,但我不能在 MdiChildren 的 FormClosing 或 FormClosed 事件处理程序中这样做,因为它在布置表单时仍然包括关闭的表单(即使它没有显示)
关于如何完成这项工作的任何想法,也许在 MdiParent 中?
跟踪 MdiParent 表单中的子项,然后连接一个Disposed
处理程序:
private List<Form> _childForms = new List<Form>();
protected override void OnMdiChildActivate(EventArgs e)
{
base.OnMdiChildActivate(e);
Form f = ActiveMdiChild;
if (f == null)
return;
else
{
if (!_childForms.Contains(f))
{
_childForms.Add(f);
f.Disposed += new EventHandler(childForm_Disposed);
}
}
}
private void childForm_Disposed(Object sender, EventArgs e)
{
_childForms.Remove((Form)sender);
this.LayoutMdi(MdiLayout.TileHorizontal);
}
我喜欢@DonBoitnott 的回答。但是,如果您想坚持使用 FormClosed() 事件,那么只需在调用 LayoutMdi() 之前对表单进行 Dispose():
void frm_FormClosed(object sender, FormClosedEventArgs e)
{
Form frm = (Form)sender;
// ... possibly do something with "frm" BEFORE it's disposed of ...
frm.Dispose();
this.LayoutMdi(MdiLayout.TileHorizontal);
}