フォームを開く(表示する)/閉じる [C#]

C#でWindowsフォームアプリケーションのフォームを開く(表示する)方法と閉じる方法を紹介します。

本記事ではVisual Studioで作成した、Windowsフォームアプリケーションのプロジェクトに記述するコードを記載します。
Windowsフォームアプリケーションのプロジェクトを作成する方法については、以下の記事を参照してください。

Windowsフォームアプリケーションのプロジェクト(ソリューション)を作成する。[C#]
Visual StudioでC#のWindowsフォームアプリケーションのプロジェクト(ソリューション)を作成する方法を記載します。 ...

フォームを開く(表示する)

フォームを開くには、アプリケーションのメインエントリーポイントでApplicationクラスのRun静的メソッドに表示するフォームのインスタンスを渡して表示する方法と、フォームクラスのShowメソッドまたはShowDialogメソッドを使用して表示する方法があります。

メインエントリーポイント(Mainメソッド)から表示

アプリケーションのメインエントリーポイント(Mainメソッド)から表示する場合は、Formクラスのインスタンスを生成して、ApplicationクラスのRun静的メソッドのパラメーターに指定します。Formクラス、Applicationクラスは、System.Windows.Forms名前空間にあります。

上記のサンプルコードはWindowsフォームアプリケーションを作成した際に、自動で生成されるProgram.csファイルのコードです。
Form1クラスはFormクラスを継承したサブクラスになります。
ApplicationクラスのEnableVisualStyles静的メソッドは、アプリケーションで visual スタイルを有効にします。
ApplicationクラスのSetCompatibleTextRenderingDefault静的メソッドは、Windowsフォーム上のコントロールなどにテキストを描画する既定(デフォルト)の方法を切り替えるためのものです。SetCompatibleTextRenderingDefault静的メソッドのパラメーターにfalseを指定して呼び出すことで、よりパフォーマンスに優れたテキストの描画を行ってくれるようになります。

Formクラスを作成して独自に起動する場合の例も以下に記載しておきます。

上記の例ではFormクラスのインスタンスを作成してApplicationクラスのRun静的メソッドのパラメーターに指定しています。

ApplicationクラスのRun静的メソッドのパラメーターにFormクラス(派生クラスを含む)のインスタンスを指定することで、Formを閉じた時にアプリケーションが終了します。

FormクラスのShowメソッドで表示

既に表示されているフォームからモードレスフォームを表示する際は、Showメソッドを使用します。(モードレスフォーム: フォームの表示後も他のフォームの要素を自由に操作できるフォーム)

上記の例ではFormクラスの派生クラスのForm1クラスのインスタンスを生成して、Showメソッドでモードレスフォームを表示しています。

Showメソッドにはパラメーターとしてフォームを所有するオブジェクトを指定できます。

構文

System.Windows.Forms.IWin32Window型のownerには、表示するフォームを所有するトップレベル ウィンドウを表すオブジェクト(通常はオーナーフォーム)を指定します。

以下に既に表示されているフォーム(Form1)から新しいフォーム(Form2)を表示する例を示します。

上記の例のShowメソッドのパラメーターに指定している「this」は、Form2を所有するオーナーフォームのForm1のインスタンスになります。
Showメソッドのパラメーター(owner)にオーナーフォームを指定すると、オーナーフォームを閉じた際に、Showメソッドで表示したフォーム(上記の例ではForm2)も閉じられます。
パラメーターにオーナーフォームを指定すると、表示されたフォームのOwnerプロパティでオーナーフォームを取得できます。

Showメソッドでフォームを表示した場合は、フォームを表示したオーナーフォームを操作することができます。

Showメソッドでフォームを表示することは、Visibleプロパティをtrueに設定することと同じになります。ですので、Showメソッドの代わりにVisibleプロパティにtrueを指定することでフォームを表示することもできます。

Showメソッドで表示したフォームはHideメソッド非表示にすることもできます。

Hideメソッドでフォームを非表示にすることで、Visibleプロパティがfalseになります。従ってVisibleプロパティにfalseを指定することでフォームを非表示にする(隠す)こともできます。

FormクラスのShowDialogメソッドで表示

既に表示されているフォームからモーダルフォームを表示する際は、ShowDialogメソッドを使用します。(モーダルフォーム: フォームの表示後は他のフォームの要素を操作でき内容にロックするフォーム)

ShowDialogメソッドもShowメソッドと同様にパラメーターにオーナーを指定することができます。

構文

以下に既に表示されているフォーム(Form3)から新しいフォーム(Form4)を表示する例を示します。

上記の例のShowDialogメソッドのパラメーターに指定している「this」は、Form4を所有するオーナーフォームのForm3のインスタンスになります。

ShowDialogメソッドでフォームを表示した場合は、フォームを閉じるまでフォームを表示したオーナーフォームを操作することはできません。

フォームを閉じる

フォームを閉じるにはFormクラスのCloseメソッドを使用します。

上記の例のformは表示されているフォームのインスタンス変数です。

フォームを閉じると、オブジェクト内で作成されたすべてのリソースが閉じられ、フォームが破棄されます。ですので次のコードはエラーになります。

Closeメソッドで閉じたフォームをShowメソッドで表示資料とすると「System.ObjectDisposedException: ‘破棄されたオブジェクトにアクセスできません。」という例外が発生します。
表示したフォームを一時的に非表示にする場合は、FormクラスのHideメソッドを使用するか、Visibleプロパティをfalseに設定します。

HideメソッドまたはVisibleプロパティで非表示にしたフォームは、オブジェクトが破棄されないので再度表示することができます。

サンプルプログラム

Windowsフォームアプリケーションを作成してフォームを開く(表示する)、閉じる、非表示にするプログラムを作成します。

ユーザーインターフェース

ユーザーインターフェースのフォームを3つ作成します。

Form1.cs

フォームを開く/閉じる Form1デザイン

Form2.cs

フォームを開く/閉じる Form2デザイン

Form3.cs

フォームを開く/閉じる Form3デザイン

プロジェクト構成

プロジェクトの構成は以下のようになります。

フォームを開く/閉じる サンプルプログラムのプロジェクト構成

ソースコード

Form1.cs

Form2.cs

Form3.cs

プログラムの実行

プロジェクトのデバッグを開始してプログラムを実行します。

フォームを開く/閉じるサンプルプログラムを起動 Form1

Form1のForm2を表示するボタンをクリックするとForm2が表示されます。

フォームを開く/閉じるサンプルプログラム Form2

Fomr2のForm3を表示するボタンをクリックするとForm3が表示されます。

フォームを開く/閉じるサンプルプログラム Form3

パラメーターなしでForm3を表示するとOwnerプロパティがnullになっているメッセージが表示されます。

フォームを開く/閉じるサンプルプログラム Owner is null

パラメーターありでForm3を表示するとOwnerプロパティのフォーム(Form2)の名前が表示されます。

フォームを開く/閉じるサンプルプログラム Owner is not null

フォームをShowメソッドで表示後、Closeメソッドで閉じて、再度表示すると例外が発生します。

フォームを開く/閉じるサンプルプログラム ObjectDisposedException

Hideメソッドで非表示にして、再表示した場合は例外が発生せずフォームが表示されます。

フォームを開く/閉じるサンプルプログラム 再表示