フォームが所有しているフォームを取得する [C#]

Windowsフォームアプリケーションでは、フォーム(ウィンドウ)が他のフォームを所有することができます。

他のフォームを所有しているフォームは親フォームとなります。また、所有されているフォームは子フォームとなります。
子フォームは親フォームに所有されているので、子フォームのウィンドウを閉じてフォームを終了しても、親フォームは閉じませんが、親フォームは子フォームを所有しているので、親フォームのウィンドウを閉じてフォームを終了すると、親フォームの所有している子フォームは、すべて閉じられます。

今回は、C#でフォーム(親フォーム)が所有しているフォーム(子フォーム)を取得する方法と、フォーム(子フォーム)を所有しているフォーム(親フォーム)を取得する方法を紹介します。

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

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

フォームが所有している子フォームを取得する

フォームが所有している子フォームを取得するには、System.Windows.Forms名前空間にあるFormクラスのOwnedFormsプロパティを使用します。
OwnedFormsプロパティは所有している子フォームをフォームの配列(Form[])として返します。
以下の例では、親フォームとなるフォームのインスタンスと、子フォームとなる3つのフォームのインスタンスを生成し、子フォームのShowメソッドのパラメーター(引数)に親フォームを指定して表示しています。

Showメソッドのパラメーター(引数)にフォームを指定することで、Showメソッドで表示されるフォームの親フォームがパラメーターに指定したフォームになります。
上記の例ではparentFormがchildForm1、childForm2、childForm3の親フォームになります。親フォームのparentFormのOwnedFormsプロパティで子フォームを取得することができるので、上記のコードを実行すると、「ChildForm1」「ChildForm2」「ChildForm3」の3行がコンソールに出力されます。

フォームを所有している親フォームを取得する

フォームを所有している親フォームを取得するには、FormクラスのOwnerプロパティを使用します。

上記の例では、form1の親フォームにform0を指定してShowメソッドで表示しています。同様に、form2の親フォームにはform1を、form3の親フォームにはform2を指定して表示しています。上記のコードを実行すると、「Form0」「Form1」「Form2」の3行がコンソールに出力されます。

子フォームを所有する親フォームを設定する

フォームを所有する親となるフォームは、Ownerプロパティで設定することもできます。
以下に、Showメソッドでフォームを表示せずに、Ownerプロパティで親フォームを指定する例を示します。

Showメソッドのパラメーターに親フォームを指定した時と同様に、コンソールには「Form0」「Form1」「Form2」の3行が出力されます。

サンプルプログラム

ここではサンプルプログラムとして、子フォームのインスタンスを生成して表示するフォームのParentFormクラスを作成します。
ParentFormクラスはボタンをクリックすると子フォームを表示します。
画面には、親となるフォームの名前(自分を所有しているフォームの名前)と、子となるフォームの名前(自分が所有しているフォームの名前)を表示します。

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

フォームには、ユーザーID(アカウント)の表題ラベル(label1)とユーザーIDを入力するテキストボックス(textBox1)とパスワードの表題ラベル(label2)とパスワードを入力するテキストボックス(textBox2)を配置し、ログインを実行するボタン(button1)と、ログインをキャンセルするボタンを配置します。

子フォームを表示するサンプルフォームデザイン

ソースコード

ParentFormクラスのコードは以下のようになります。
ボタン(button1)がクリックされた時に、ParentFormクラスの新しいインスタンスを生成して表示します。

ここで作成するフォームのParentFormクラスは、フォームのロード時に自分の親となるフォームがあれば、フォームの名前をテキストボックス(textBox1)に表示します。ボタン(button1)をクリックして、子フォームを表示した後は、子フォームの名前をテキストボックス(textBox2)に表示します。

上記のParentFormクラスをVisual StudioでWindowsフォームアプリケーションを作成した際に自動生成されるProgram.csファイルのメインエントリポイントのMainメソッドで起動します。

プログラムの実行

プロジェクトをビルドして実行(デバッグ)すると、フォームが表示されます。

子フォームを表示するフォーム起動

ボタンをクリックすると子フォームが表示されます。
表示された子フォームのテキストボックスには、親フォームが表示されます。

子フォームを表示するフォーム起動

子フォームを表示したフォームのテキストボックスには、子フォームが表示されます。

子フォームを表示するフォーム起動

ボタンをクリックする度に、子フォームが表示され、親フォームと子フォームがテキストボックスに表示されます。

子フォームを表示するフォーム起動