2009-10-12 6 views

답변

32
이미 지정된 형태의 한 형태가 있는지 확인하기 위해 OpenForms 수집을 통해 interate 수

:

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

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

대신 form.Activate()를 사용한다. 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

스레드 안전은 문제가되지 않습니다 vb.net에서 나를 위해이 코드가 작동 . – 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

당신은 단지 하나의 스레드에서 GUI 컨트롤에 액세스하기 때문에

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

관련 문제