サブフォームを開く
Windows 10 / Visual Stadio Community 2019 / .NET Framework 4.7.2
この章では、メインウィンドウからサブウィンドウを開く方法について説明する。
メインウィンドウは、サブウィンドウを作成し保持する。ウィンドウは Formクラスのオブジェクトである。ShowDialogメソッドまたは、Showメソッドによりサブウィンドウを開く。メソッドの引数に自身のオブジェクトを渡すことにより、サブフォームはメインフォームのプロパティやメソッドにアクセスすることが可能となる。
ウィンドウには、モーダルなウィンドウと、モードレスなウィンドウの2種類ある。ShowDialoメソッドはモーダルなサブウィンドウを開く。
モーダルなサブウィンドウを開くと、イベントループの制御はメインウィンドウからサブウィンドウに移り、その間メインウィンドウはイベントを受け付けることができない。サブウィンドウを閉じるとメインウィンドウに制御が戻ってくるが、このときメインウィンドウはサブウィンドウから終了コード()を受け取ることができる。
Showメソッドはモードレスなサブウィンドウを開く。このモードではサブウィンドウはイベントループを占有しない。サブウィンドウが開いている間もメインウィンドウはイベントを受け付けることができる。例のようにサブウィンドウを複数開くことも可能となる。
ただし、二つのウィンドウの動きは非同期となるので、メインウィンドウはサブウィンドウが閉じたことを知ることができない。したがって、サブウィンドウの終了コードをは受け取れない。
モーダルなサブウィンドウを開く
メインウィンドウ(Form1)の Openボタンをクリックすると、サブウィンドウ(Form2)が開く。メインウィンドウはイベントを受け付けることができない。
![[image2]](/dot_net/28/image2.png)
サブウィンドウ(Form2)の OKボタンをクリックするとウィンドウが閉じる。
メインウィンドウ(Form1)はサブウィンドウから受け取った終了コードをテキストボックスに表示する。
![[imageimage3]](/dot_net/28/image3.png)
モードレスなサブウィンドウを開く
メインウィンドウ(Form1)の Openボタンをクリックすると、サブウィンドウ(Form2)が開く。メインウィンドウはイベントを受け付けることができるので、全部で3個のサブウィンドウを開いてみた。
![[image4]](/dot_net/28/image4.png)
メインフォーム(Form1.cs)/ モーダルなサブウィンドウを開く
ShowDialogメソッドは、戻り値に終了コード(DialogResultクラスのオブジェクト)を返す。
モーダルなウィンドウのオブジェクトは不要になったら Disposeメソッドで破棄する必要がある。
(これちょっと疑問で、フォームオブジェクトは Closeメソッドにより解放されるはずだと思うので、モーダルな場合も Disposeメソッドの実行は必要ないのではなかろうか?)
メインフォーム(Form1.cs)/ モードレスなサブウィンドウを開く
サブフォーム(Form2.cs)
フォームロード時に、ウィンドウをメインウィンドウの右隣に表示するよう Locationプロパティを変更している。Ownerプロパティからメインウィンドウのオブジェクトを参照できるので、そこからメインウィンドウの Locationと Sizeを取得する。
OKボタン、キャンセルボタンによりウィンドウを閉じる。ウィンドウがモーダルで開かれた場合、DialogResultプロパティに終了コードを設定すると、メインフォームが呼んだ ShowDialogメソッドの戻り値として返すことができる。ウィンドウがモードレスで開かれた場合、この操作は無効であるがエラーにはならない。