2009-07-10 6 views
5

이 기능을 사용하여 기존 양식을 닫고 새 양식을 엽니 다.C# Windows 응용 프로그램에서 열린 양식 찾기

exixting 양식이 없으면 오류가 발생합니다.

오류 :

대상 :은 System.Object MarshaledInvoke (System.Windows.Forms.Control, System.Delegate,은 System.Object []을, 부울)

메시지 : 호출 또는 BeginInvoke는에 호출 할 수 없습니다 윈도우 핸들이 생성 될 때까지 컨트롤.

스택 : System.Windows.Forms.Control.MarshaledInvoke에서

가되도록 않도록 형태를 닫기 전에 열려 임의의 형태를 확인하기 위해 필요한 (컨트롤 호출자 위임 방법, [] args를 부울 동기 개체) 오류. 방법?

static public void NewMainForm(Form main, bool ClosePreviousMain) 
    { 
      if (main != null) 
      { 
       Global.ActiveForm = main.Text; 
       if (ClosePreviousMain & MyContext.curMain != null) 
       { 
        MyContext.curMain.FormClosed -= new FormClosedEventHandler(main_FormClosed); 
        //Need to check for any form active and then close the form. 
        MyContext.curMain.Invoke(new Action(MyContext.curMain.Dispose)); 
       } 
       MyContext.curMain = main; 
       MyContext.curMain.FormClosed += new FormClosedEventHandler(main_FormClosed); 
       MyContext.curMain.ShowDialog(); 
      } 
    } 

답변

5
if (ApplicationFormStatus.CheckIfFormIsOpen("FormName")) 
{ 
// It means it exists, so close the form 
} 

public bool CheckIfFormIsOpen(string formname) 
     { 

      //FormCollection fc = Application.OpenForms; 
      //foreach (Form frm in fc) 
      //{ 
      // if (frm.Name == formname) 
      // { 
      //  return true; 
      // } 
      //} 
      //return false; 

      bool formOpen= Application.OpenForms.Cast<Form>().Any(form => form.Name == formname); 

      return formOpen; 
     } 

두 가지 방법을 하나의 간단한 방법으로 붙여 넣었습니다. 두 번째 방법은 LINQ입니다.

1

당신은 당신이이 같이 할 수있는 형태의 이름을 알고있는 경우 : 단지 존재를 보여줍니다, 그리고이를 만드는 경우 경우 형태 의 기존 인스턴스에 대한 코드 검색

var frm = Application.OpenForms.Cast<Form>().Where(x => x.Name == "MyForm").FirstOrDefault(); 
if (null != frm) 
{ 
    frm.Close(); 
    frm = null; 
} 
2

이 부분을 그것의 인스턴스

 `foreach (Form form in Application.OpenForms) 
     { 
      if (form.GetType() == typeof(myMainform)) 
      { 
       form.Activate(); 
       form.Show(); 
       this.Close(); 
       return; 
      } 
     } 

     myMainform m = new myMainform(); 
     m.Show();` 
관련 문제