如果表格已经打开,是否有办法阻止在MDI容器中打开某个表格?防止重复的MDI儿童表格
回答
可以interate在OpenForms收集,以检查是否已经存在给定类型的一种形式:
foreach (Form form in Application.OpenForms)
{
if (form.GetType() == typeof(MyFormType))
{
form.Activate();
return;
}
}
Form newForm = new MyFormType();
newForm.MdiParent = this;
newForm.Show();
AFAIK是没有标准的方式。你必须自己实现它。我会这样做:
class TheForm: Form
{
private static TheForm Instance;
private TheForm() // Constructor is private
{
}
public static Show(Form mdiParent)
{
if (Instance == null)
{
// Create new form, assign it to Instance
}
else
Instance.Activate(); // Not sure about this line, find the appropriate equivalent yourself.
}
protected override OnFormClose(EventArgs e)
{
Instance = null;
base.OnFormClose(e);
}
}
如果需要考虑线程安全性,请添加相应的lock
s。
线程安全不应该是一个问题,因为你只从单个线程访问GUI控件。 – Groo 2009-10-12 10:18:18
你可以补充说这是一个单例模式的实现。我更喜欢FredrikMörk的解决方案,它不违反SOC – 2009-10-12 12:01:59
此代码工作
private void openToolStripMenuItem_Click(object sender, EventArgs e)
{
foreach (Form form in Application.OpenForms)
{
if (form.GetType() == typeof(Form2))
{
form.Activate();
return;
}
}
Form2 newForm = new Form2();
newForm.MdiParent = this;
newForm.Show();
}
虽然这个职位是很老了,我想这将增加一个帮助。
如果表格最小化也需要处理。下面是完整的例子:
foreach (Form form in this.MdiChildren)
{
if (form.GetType() == typeof(frmMain))
{
if (form.WindowState == FormWindowState.Minimized)
{
form.WindowState = FormWindowState.Normal;
}
form.Activate();
return;
}
}
Form frm = new frmMain();
frm.MdiParent = this;
frm.Show();
在vb.net我这个代码工作
For Each f As Form In Application.OpenForms If TypeOf f Is form_name Then f.Activate() f.WindowState = FormWindowState.Normal f.StartPosition = FormStartPosition.WindowsDefaultLocation f.WindowState = FormWindowState.Maximized
Return
End If
Next
form_name .MdiParent = Me
form_name .Show()
- 1. Winforms + MDI儿童
- 2. 德尔福MDI儿童表格和MainMenu
- 3. GotFocus()和MDI儿童
- 4. jQuery防止悬停儿童闪烁
- 5. 防止儿童和Ajax请求执行
- 6. 如何防止儿童被移走?
- 7. Flash。防止鼠标拖动儿童
- 8. 防止儿童事件发生
- 9. 合并工具条MDI儿童 - 家长
- 10. Mdi儿童在.Net中改变
- 11. 复杂列表儿童
- 12. 德尔福MDI应用程序和MDI儿童的标题栏
- 13. 在MDI父项中MDI儿童的分布
- 14. 显示MDI孩子始终位于其他MDI儿童之上
- 15. 防止在MVVM/MDI应用程序中几乎重复的RelayCommands
- 16. 如何显示(Bringtofront)已从另一个Mdi儿童窗体打开的Mdi儿童窗体?
- 17. 从儿童形式重新加载MDI父母
- 18. 防止儿童根据条件编辑变量表
- 19. 在Expandable中重复儿童listView android
- 20. 儿童元素重复FlipView内
- 21. C#MDI表单容器包装儿童形式
- 22. WordPress的儿童主题装载两个重复的样式表
- 23. 儿童窗体大小设置为MDI窗体的MDI容器的大小
- 24. 如何防止窗格监听专用于儿童节点的鼠标事件
- 25. jQuery的防止儿童onclick事件家长行动
- 26. mobx如何防止可观察组件的儿童重新放弃?
- 27. SQLite:防止重复
- 28. 解析儿童Simplexml儿童
- 29. 儿童内部角儿童
- 30. 防止图表中的数据重复
而不是form.Activate()使用form.WindowState = FormWindowState.Normal;与前者不同,即使窗口最小化,后者也可以工作。 – docesam 2014-08-13 18:12:34