关闭表单后更新MDI子表单列表

时间:2015-06-24 11:49:05

标签: c# winforms mdi mdichild

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

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

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

有没有人对此有一些优雅的解决方案?

2 个答案:

答案 0 :(得分:1)

我使用这种方法组合取得了成功:

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集合来始终了解打开的表单,并随意使用它们。

答案 1 :(得分:0)

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

这是因为不同的班级类型? 拿一个基类列表怎么样?例如:List<Form>当有FormClosed事件时,只需从列表中删除该表单。