如果表格已經打開,是否有辦法阻止在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