0

我有一个 MdiParent,它打开一个表单的多个实例作为它的 MdiChildren。打开每个表格时,我都会调用this.LayoutMdi(MdiLayout.TileHorizontal);以布置所有表格。

我想要做的是在表单关闭时做同样的事情,但我不能在 MdiChildren 的 FormClosing 或 FormClosed 事件处理程序中这样做,因为它在布置表单时仍然包括关闭的表单(即使它没有显示)

关于如何完成这项工作的任何想法,也许在 MdiParent 中?

4

2 回答 2

1

跟踪 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);
}
于 2013-06-04T17:09:01.817 回答
1

我喜欢@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);
    }
于 2013-06-04T17:17:19.670 回答