如果表格已经打开,是否有办法阻止在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. 将表单添加到MDI儿童
- 5. MDI儿童表格上方的图片框
- 6. 在儿童表中重复的ID
- 7. 儿童的OnClickListener防止Android ViewPager滑动
- 8. MDI儿童表格没有自由空间
- 9. 防止李父李+携带儿童
- 10. Flash。防止鼠标拖动儿童
- 11. 防止儿童和Ajax请求执行
- 12. 防止儿童事件发生
- 13. jQuery防止悬停儿童闪烁
- 14. 如何防止更新儿童属性?
- 15. NHibernate流畅防止儿童更新
- 16. 如何防止儿童被移走?
- 17. 在MDI之上的VB.NET Picturebox儿童
- 18. vb.net mdi儿童标题栏不隐藏
- 19. 合并工具条MDI儿童 - 家长
- 20. Qt - MDI儿童不能正常关闭
- 21. Mdi儿童在.Net中改变
- 22. 在MDI父项中MDI儿童的分布
- 23. 德尔福MDI应用程序和MDI儿童的标题栏
- 24. 防止重复表格插入
- 25. 复杂列表儿童
- 26. 防止阿卡片演员重新启动儿童演员
- 27. 将数据从MDI儿童传递给MDI家长
- 28. 显示MDI孩子始终位于其他MDI儿童之上
- 29. 防止在MVVM/MDI应用程序中几乎重复的RelayCommands
- 30. 如何显示(Bringtofront)已从另一个Mdi儿童窗体打开的Mdi儿童窗体?
而不是form.Activate()使用form.WindowState = FormWindowState.Normal;与前者不同,即使窗口最小化,后者也可以工作。 – docesam 2014-08-13 18:12:34