【问题标题】:Updating MDI child forms list after closing a form关闭表单后更新 MDI 子表单列表
【发布时间】:2015-06-24 11:49:04
【问题描述】:

我正在使用 DevExpress NavBar 作为我的 MDI 应用程序的主菜单,并且 NavBar 的组之一包含代表打开的 MDI 子窗体的项目。当 MDI 子窗体关闭时,我无法更新菜单。

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

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

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

【问题讨论】:

    标签: c# winforms mdi mdichild


    【解决方案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 集合来始终了解打开的表单并按照您的喜好使用它们。

    【讨论】:

    • 感谢您的回答,但我确实必须使用 Form.MdiChildren 集合来跟踪打开的表单。这是我可以获取所有打开表单所需数据的唯一对象。我无法控制使用 Form.Show() 打开表单。
    • 那么,您应该详细解释一下这个要求,因为它非常严格,而且非常不寻常。
    • 是的,在更多地探索我的代码之后,我设法调整了这种方法。我只是使用事件而不是受保护的方法,因为我无法扩展 MDI 父表单。谢谢。
    【解决方案2】:

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

    这是因为不同的类类型吗? 持有一个基类列表怎么样? like:List&lt;Form&gt; 当有FormClosed 事件时,只需从列表中删除该表单即可。

    【讨论】:

    • 不是因为这个,而是因为当我调用“启动表单”时,我无法获取该表单的文本值,以显示在菜单中。这是一个基于用户权限生成菜单的复杂系统,有些部分在另一个我无法更改的 dll 中。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-15
    • 1970-01-01
    相关资源
    最近更新 更多