C# 親フォームが閉じられた時に子フォームも自動的に閉じる

フォームAが開いている。

FormA

 

この状態で、フォームAからフォームBを開く。

FormAB

 

さらにフォームBからフォームCを開く。

FormABC

 

フォームA → フォームB → フォームC

と開いている状態で、フォームBが閉じられたらフォームCが自動的に閉じられる、またはフォームAが閉じられたらフォームBとフォームCが自動的に閉じられる、という仕組みをシンプルに実装したいだって?

 
 

そんな時には、AddOwnedFormメソッドを使うといい。

AddOwnedFormメソッドを使ったフォームの親子関係の登録

フォームAで作成したformBインスタンスを、AddOwnedForm(formB)として、OwnedFormに登録。

 

フォームBでも同様に、作成したformCインスタンスを、AddOwnedForm(formC)として、OwnedFormに登録。

 

子フォームを開かないフォームCは、普通のフォーム。

 

このように、AddOwnedFormで登録しておくと、登録した側のフォーム(親フォーム)が閉じられると、子フォームも自動的に閉じられるようになる。

さらにそれだけではなく、親フォームが最小化されると、子フォームも自動的に最小化されたりと、親子で連動するようになる。

AddOwnedForとVisitorパターンの組み合わせが最適

さて、AddOwnedFormメソッドでフォームに親子関係を登録すれば、親フォームが閉じられたら自動的に子フォームも閉じられるという仕組み自体は理解頂けたと思う。

しかしこれだと、FormBクラスやFormCクラスを他から再利用したい時に、AddOwnedFormの登録を忘れる可能性がある。

 

そこで、AddOwnedFormメソッドの呼び出しを忘れないようなパーツとしてのフォーム作りをするために、Visitorパターンを使って作り直した。

 

今度は呼び出し元であるFormAが、何の変哲もない(AddOwnedFormが登場しない)内容になる。

 

呼び出される側のFormBのコンストラクタで、呼び出し元フォームのAddOwnedFormメソッドを呼び出して、みずからを子フォームとして登録する。

 

FormCでも同様に、AddOwnedFormメソッドで呼び出し元のFormBをFormCの親フォームに指定している。

 

こうしておけば、一度FormBを作成したら、どこから呼び出す時でも、Formインスタンスを引数にとるコンストラクタを使用すれば、自動的にフォームの親子関係が関連付けられる。

(FormCも同様)

コメントを残す

トラックバック: http://pgnote.net/wp-trackback.php?p=1109