2009-10-12 2 views

ответ

32

Вы можете 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(); 
+0

вместо формы.Activate() use form.WindowState = FormWindowState.Normal; в отличие от первого, последний будет работать, даже если это окно будет сведено к минимуму. – docesam

3

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 с.

+0

безопасность Тема не должна быть проблемой, поскольку вы получаете доступ только элементы управления GUI из одного потока , – Groo

+0

, вы могли бы добавить, что это реализация одноэлементного шаблона. Я предпочитаю решение Fredrik Mörk, оно не нарушает SOC –

1

этот код работает

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

Хотя этот пост очень старый, я думал это добавит помощь.

Необходимо обработать, если форма также минимизирована. Вот полный пример:

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

Этот код работа для меня в 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() 

 Смежные вопросы

  • Нет связанных вопросов^_^