2012-05-10 9 views
0

フォームの単一のインスタンスを開くことができる再利用可能な関数を作成しようとしています。フォームが既に開いていない場合は、新しいフォームを作成して表示し、既に開いている場合は、既存のフォームを前面に表示する必要があります。フォームの単一のインスタンスを開くための単一の再利用可能な関数

私は、次の関数を使用して

if (Application.OpenForms["FPSStorageDemo"] == null) 
      { 
       FPSStorageDemo fp = new FPSStorageDemo(); 
       fp.Name = "FPSStorageDemo"; 
       fp.Show(); 
      } 
      else 
      { 
       ((FPSStorageDemo)Application.OpenForms["FPSStorageDemo"]).BringToFront(); 
      } 

しかし、私は、フォームを開く必要がwhereever何度も何度もこのコードを記述する必要がありました。しかし、私はこの仕事をすることができる単一の再利用可能な機能が必要です。

私は、同様の機能を書いた

void OpenSingleInstanceForm(Type TypeOfControlToOpen) 
     { 
      bool IsFormOpen = false; 
      foreach (Form fm in Application.OpenForms) 
      { 
       if (fm.GetType() == TypeOfControlToOpen) 
       { 
        IsFormOpen = true; 
        fm.BringToFront(); 
        break; 
       } 
      } 

      if (!IsFormOpen) 
      { 
       Object obj = Activator.CreateInstance(TypeOfControlToOpen); 
       //obj.Show(); //Here is the problem 
      } 
     } 

しかし、最後に、私は新しいフォームのインスタンスを表示する方法がわかりません。誰もそれを行う方法を提案することはできますか?これは間違っているのですか、これを行う別の方法がありますか?

ありがとうございます。

+1

((Form)obj).Show();これは私の問題を解決した – Matt

答えて

1
public static class FormUtility 
{ 
public static FormType GetInstance<FormType>() where FormType : Form, new() 
{ 
    FormType output = Application.OpenForms.OfType<FormType>().FirstOrDefault(); 
    if(output == null) 
    { 
    output = new FormType(); 
    } 
    //you could add the show/bring to front here if you wanted to, or have the more general method 
    //that just gives a form that you can do whatever you want with (or have one of each). 
    return output; 
} 
} 

//elsewhere 
FormUtility.GetInstance<Form1>.BringToFront(); 

私はまた、このようなメソッドを持ちながら、ほとんどの場合、使用して迅速かつ簡単であることを言及する時間がかかるしたいのですが彼らは良いデザインではありません。これは、適切な情報を適切な範囲で公開することで、フォームが相互に通信する必要がある場合に備え、フォームにアクセスするだけではなく、フォームにグローバルにアクセスすることにつながります。プログラムの維持、理解、拡張、再利用性の向上などを容易にします.2つ以上のフォームがフォームへのパブリックな静的参照(正確にはApplication.OpenForms)に頼らずに通信する方法を決定する際に問題がある場合は、あなたが解決するのを助けるためにここに質問を投稿してください。

関連する問題