Windowsフォームアプリケーションでは、フォーム(ウィンドウ)が他のフォームを所有することができます。
他のフォームを所有しているフォームは親フォームとなります。また、所有されているフォームは子フォームとなります。
子フォームは親フォームに所有されているので、子フォームのウィンドウを閉じてフォームを終了しても、親フォームは閉じませんが、親フォームは子フォームを所有しているので、親フォームのウィンドウを閉じてフォームを終了すると、親フォームの所有している子フォームは、すべて閉じられます。
今回は、C#でフォーム(親フォーム)が所有しているフォーム(子フォーム)を取得する方法と、フォーム(子フォーム)を所有しているフォーム(親フォーム)を取得する方法を紹介します。
本記事ではVisual Studioで作成した、Windowsフォームアプリケーションのプロジェクトに記述するコードを記載します。
Windowsフォームアプリケーションのプロジェクトを作成する方法については、以下の記事を参照してください。
目次
フォームが所有している子フォームを取得する
フォームが所有している子フォームを取得するには、System.Windows.Forms名前空間にあるFormクラスのOwnedFormsプロパティを使用します。
OwnedFormsプロパティは所有している子フォームをフォームの配列(Form[])として返します。
以下の例では、親フォームとなるフォームのインスタンスと、子フォームとなる3つのフォームのインスタンスを生成し、子フォームのShowメソッドのパラメーター(引数)に親フォームを指定して表示しています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
// 親フォーム Form parentForm = new Form(); parentForm.Name = "ParentForm"; parentForm.Show(); // 子フォーム1 Form childForm1 = new Form(); childForm1.Name = "ChildForm1"; childForm1.Show(parentForm); // 子フォーム2 Form childForm2 = new Form(); childForm2.Name = "ChildForm2"; childForm2.Show(parentForm); // 子フォーム3 Form childForm3 = new Form(); childForm3.Name = "ChildForm3"; childForm3.Show(parentForm); Form[] forms = parentForm.OwnedForms; foreach (Form form in forms) { Console.WriteLine($"{form.Name}"); } |
Showメソッドのパラメーター(引数)にフォームを指定することで、Showメソッドで表示されるフォームの親フォームがパラメーターに指定したフォームになります。
上記の例ではparentFormがchildForm1、childForm2、childForm3の親フォームになります。親フォームのparentFormのOwnedFormsプロパティで子フォームを取得することができるので、上記のコードを実行すると、「ChildForm1」「ChildForm2」「ChildForm3」の3行がコンソールに出力されます。
フォームを所有している親フォームを取得する
フォームを所有している親フォームを取得するには、FormクラスのOwnerプロパティを使用します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
// フォーム0 Form form0 = new Form(); form0.Name = "Form0"; form0.Show(); // フォーム1 Form form1 = new Form(); form1.Name = "Form1"; form1.Show(form0); // フォーム2 Form form2 = new Form(); form2.Name = "Form2"; form2.Show(form1); // フォーム3 Form form3 = new Form(); form3.Name = "Form3"; form3.Show(form2); Console.WriteLine(form1.Owner.Name); Console.WriteLine(form2.Owner.Name); Console.WriteLine(form3.Owner.Name); |
上記の例では、form1の親フォームにform0を指定してShowメソッドで表示しています。同様に、form2の親フォームにはform1を、form3の親フォームにはform2を指定して表示しています。上記のコードを実行すると、「Form0」「Form1」「Form2」の3行がコンソールに出力されます。
子フォームを所有する親フォームを設定する
フォームを所有する親となるフォームは、Ownerプロパティで設定することもできます。
以下に、Showメソッドでフォームを表示せずに、Ownerプロパティで親フォームを指定する例を示します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
// フォーム0 Form form0 = new Form(); form0.Name = "Form0"; // フォーム1 Form form1 = new Form(); form1.Name = "Form1"; form1.Owner = form0; // フォーム2 Form form2 = new Form(); form2.Name = "Form2"; form2.Owner = form1; // フォーム3 Form form3 = new Form(); form3.Name = "Form3"; form3.Owner = form2; Console.WriteLine(form1.Owner.Name); Console.WriteLine(form2.Owner.Name); Console.WriteLine(form3.Owner.Name); |
Showメソッドのパラメーターに親フォームを指定した時と同様に、コンソールには「Form0」「Form1」「Form2」の3行が出力されます。
サンプルプログラム
ここではサンプルプログラムとして、子フォームのインスタンスを生成して表示するフォームのParentFormクラスを作成します。
ParentFormクラスはボタンをクリックすると子フォームを表示します。
画面には、親となるフォームの名前(自分を所有しているフォームの名前)と、子となるフォームの名前(自分が所有しているフォームの名前)を表示します。
ユーザーインターフェース
フォームには、ユーザーID(アカウント)の表題ラベル(label1)とユーザーIDを入力するテキストボックス(textBox1)とパスワードの表題ラベル(label2)とパスワードを入力するテキストボックス(textBox2)を配置し、ログインを実行するボタン(button1)と、ログインをキャンセルするボタンを配置します。
ソースコード
ParentFormクラスのコードは以下のようになります。
ボタン(button1)がクリックされた時に、ParentFormクラスの新しいインスタンスを生成して表示します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 |
using System; using System.Data; using System.Linq; using System.Windows.Forms; namespace WindowsFormsApp1 { public partial class ParentForm : Form { // コンストラクタ public ParentForm() { InitializeComponent(); string name = "Form0"; this.Text = name; } // Textプロパティのオーバーライド public override string Text { get => base.Text; set { base.Text = value; // TextプロパティをもとにNameプロパティを設定 base.Name = base.Text; } } // フォームロード時のイベントメソッド private void ParentForm_Load(object sender, EventArgs e) { try { // 親フォームを取得する Form form = this.Owner; if (form != null) { // 親フォームをテキストボックスに表示 this.textBox1.Text = form.Name; } } catch (Exception ex) { MessageBox.Show(ex.Message); } } // ボタンクリック時のイベントメソッド private void button1_Click(object sender, EventArgs e) { try { // ParentFormクラス(フォーム)のインスタンスを生成 ParentForm form = new ParentForm(); // フォームの名前を設定 string name = (this.Name.Replace("Form", "")); int number = Convert.ToInt32(name); int newNumber = number + 1; string formName = $"Form{newNumber}"; form.Text = formName; form.Owner = this; // フォームを表示する form.StartPosition = FormStartPosition.CenterParent; form.Show(); // 子フォームを取得 string ownedForms = string.Join("", this.OwnedForms.Select(f => f.Name)); // 子フォームをテキストボックスに表示 this.textBox2.Text = ownedForms; } catch (Exception ex) { MessageBox.Show(ex.Message); } } } } |
ここで作成するフォームのParentFormクラスは、フォームのロード時に自分の親となるフォームがあれば、フォームの名前をテキストボックス(textBox1)に表示します。ボタン(button1)をクリックして、子フォームを表示した後は、子フォームの名前をテキストボックス(textBox2)に表示します。
上記のParentFormクラスをVisual StudioでWindowsフォームアプリケーションを作成した際に自動生成されるProgram.csファイルのメインエントリポイントのMainメソッドで起動します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using System.Windows.Forms; namespace WindowsFormsApp1 { static class Program { /// <summary> /// アプリケーションのメイン エントリ ポイントです。 /// </summary> [STAThread] static void Main() { Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); Application.Run(new ParentForm()); } } } |
プログラムの実行
プロジェクトをビルドして実行(デバッグ)すると、フォームが表示されます。
ボタンをクリックすると子フォームが表示されます。
表示された子フォームのテキストボックスには、親フォームが表示されます。
子フォームを表示したフォームのテキストボックスには、子フォームが表示されます。
ボタンをクリックする度に、子フォームが表示され、親フォームと子フォームがテキストボックスに表示されます。