2009-07-10 4 views
5

私はこの機能を使用して既存のフォームを閉じ、新しいフォームを開きます。c#windowsアプリケーションでオープンフォームを検索

exixtingフォームがない場合は、エラーが発生します。

エラー:

対象:System.ObjectのMarshaledInvoke(System.Windows.Forms.Control、System.Delegate、System.Objectの[]、Boolean)を

メッセージ:起動またはBeginInvokeメソッドをコールすることはできませんウィンドウハンドルが作成されるまでのコントロール。

スタック:System.Windows.Forms.Control.MarshaledInvokeで(コントロール発信者、委任方法、[]引数、ブール同期オブジェクト)

SO回避するためにフォームを閉じる前に、任意の形式のオープンを確認する必要がありますエラー。どうやって?

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

私は2つの方法を1つ単純なものと2つめのものを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();` 
関連する問題