簡體   English   中英

關閉表單后更新MDI子表單列表

[英]Updating MDI child forms list after closing a form

我將DevExpress NavBar用作我的MDI應用程序的主菜單,並且NavBar的組之一包含代表打開的MDI子窗體的項目。 MDI子窗體關閉時,我無法更新菜單。

我必須使用Form.MdiChildren集合來生成菜單組,但是問題是,當使用Form.FormClosing事件時,該關閉的窗體仍在Form.MdiChildren集合中。 我嘗試使用System.Timers.Timer等待1秒鍾,然后更新菜單,但是由於異步行為(當用戶非常快地關閉一些表格時),我會遇到各種異常。

由於類設計的復雜性,我也無法維護自己的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事件時,只需從列表中刪除該表單即可。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM