[英]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.