在窗体关闭时布局剩余的窗体

本文关键字:窗体 布局 | 更新日期: 2023-09-27 18:16:58

我有一个MdiParent,它打开一个表单的多个实例作为它的mdichild。当每个表单打开时,我调用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);
    }