2009-10-12 12 views

Trả lời

32

Bạn có thể interate qua bộ sưu tập OpenForms để kiểm tra xem đã có một hình thức của loại nhất định:

foreach (Form form in Application.OpenForms) 
{ 
    if (form.GetType() == typeof(MyFormType)) 
    { 
     form.Activate(); 
     return; 
    } 
} 

Form newForm = new MyFormType(); 
newForm.MdiParent = this; 
newForm.Show(); 
+0

thay vì form.Activate() sử dụng form.WindowState = FormWindowState.Normal; không giống như trước đây, sau này sẽ hoạt động ngay cả khi cửa sổ đó được thu nhỏ. – docesam

3

AFAIK không có cách tiêu chuẩn. Bạn sẽ phải tự mình thực hiện nó. Tôi sẽ làm theo cách này:

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); 
    } 
} 

Nếu an toàn chủ đề quan tâm, hãy thêm lock s thích hợp.

+0

an toàn Chủ đề không phải là một vấn đề, vì bạn chỉ truy cập điều khiển GUI từ một chủ đề duy nhất . – Groo

+0

bạn có thể đã thêm rằng đây là việc triển khai mẫu đơn. Tôi thích giải pháp của Fredrik Mörk, nó không vi phạm SOC –

1

mã này làm việc

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(); 
    } 
0

Mặc dù bài này là rất cũ, tôi nghĩ điều này sẽ thêm trợ giúp.

Cần xử lý nếu biểu mẫu được Giảm thiểu quá. Dưới đây là ví dụ hoàn chỉnh:

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(); 
0

Công trình này mã cho tôi trong 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()