关闭窗体后更新MDI子窗体列表

本文关键字:窗体 列表 MDI 更新 | 更新日期: 2023-09-27 17:59:29

我使用DevExpress NavBar作为MDI应用程序的主菜单,其中一个NavBar组包含表示打开的MDI子窗体的项目。当MDI子窗体关闭时,我在更新菜单时遇到问题。

我必须使用Form.MdiChildren集合来生成菜单组,但问题是,当使用Form.FormClosing事件时,关闭的窗体仍在Form.MdiChildren集合中。我试图使用System.Timers.Timer等待1秒,然后更新菜单,但由于异步行为(当用户很快关闭几个表单时),我遇到了各种异常。

由于类设计的复杂性,我也无法维护自己的MDI子项列表。

有人对此有什么优雅的解决方案吗?

关闭窗体后更新MDI子窗体列表

我成功地使用了以下方法的组合:

private List<Form> _childForms = new List<Form>();
protected override void OnMdiChildActivate(EventArgs e)
{
   base.OnMdiChildActivate(e);
   Form form = ActiveMdiChild;
   if (form == null)
       return;
   else
   {
       if (!_childForms.Contains(form))
       {
           _childForms.Add(form);
           form.FormClosed += mdiChildForm_FormClosed;
       }
   }
}
private void mdiChildForm_FormClosed(Object sender, FormClosedEventArgs e)
{
   var form = (Form)sender;
   if (_childForms.Contains(form))
       _childForms.Remove(form);
   if (_childForms.Count > 0)
       _childForms[_childForms.Count - 1].Activate();
}

注意,Activate方法几乎在用户与子窗体交互的任何时候都会被调用,包括打开和关闭它们。

然后,您可以使用childForms集合来始终了解打开的表单,并对它们执行您喜欢的操作。

"由于类设计的复杂性,我也无法维护自己的MDI子项列表。"

这是因为不同的类类型吗?拿一份基类列表怎么样?比如:List<Form>当出现FormClosed事件时,只需从列表中删除该表单即可。