关闭窗体后更新 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 子列表。
有人对此有一些优雅的解决方案吗?
"I also cannot maintain my own list of MDI children, because of complexity of classes design."
这是因为 class 类型不同吗?
持有一个基数 classes 的列表怎么样?喜欢:List<Form>
当有 FormClosed
事件时,只需从列表中删除该表单。
我使用这种方法组合取得了成功:
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
集合始终了解打开的表单,并随心所欲地使用它们。
我使用 DevExpress NavBar 作为我的 MDI 应用程序的主菜单,其中一个 NavBar 组包含代表打开的 MDI 子窗体的项目。当 MDI 子窗体关闭时,我无法更新菜单。
我必须使用 Form.MdiChildren 集合来生成菜单组,但问题是,当使用 Form.FormClosing 事件,那个关闭的表格仍在 Form.MdiChildren 集合中。我尝试使用 System.Timers.Timer 等待 1 秒然后更新菜单,但由于异步行为(当用户非常快速地关闭几个表单时)我得到了各种异常。
由于 类 设计的复杂性,我也无法维护自己的 MDI 子列表。
有人对此有一些优雅的解决方案吗?
"I also cannot maintain my own list of MDI children, because of complexity of classes design."
这是因为 class 类型不同吗?
持有一个基数 classes 的列表怎么样?喜欢:List<Form>
当有 FormClosed
事件时,只需从列表中删除该表单。
我使用这种方法组合取得了成功:
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
集合始终了解打开的表单,并随心所欲地使用它们。