0

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

私は次の機能を使用していました、

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

しかし、フォームを開く必要があるときはいつでも、このコードを何度も書かなければなりません。しかし、この仕事を行うことができる単一の再利用可能な関数が必要です。

私は次のような関数を書きました、

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

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

前もって感謝します。

4

2 に答える 2

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

また、このようなメソッドはすばやく簡単に使用できますが、ほとんどの場合、適切な設計ではないことにも触れておきたいと思います。これにより、フォームが相互に通信する必要がある場合に、適切なスコープを通じて適切な情報を公開することにより、フォームにグローバルにアクセスするだけで済むようになります。これにより、プログラムの保守、理解、拡張が容易になり、再利用性が向上します。フォームへの public static 参照に頼らずに 2 つ以上のフォームがどのように通信するのが最善かを判断するのに問題がある場合 (これがまさにApplication.OpenFormsそれです)、次のように感じる必要があります。その質問をここに自由に投稿して、解決に役立ててください。

于 2012-05-10T05:36:38.670 に答える
0

あなたは探しているSingleton

このC#でのシングルトンの実装を確認してください

于 2012-05-10T05:18:54.800 に答える