QA@IT

C#のユーザーコントロールについて

6662 PV

System.Windows.Forms.UserControlについて

複数のユーザーコントロールを用意して、ひとつのフォーム上で条件により表示するユーザーコントロールを切り替えるアプリを作成しています。

切り替えの具体的な方法は、予めフォーム上にパネル(System.Windows.Forms.Panel)を配し、
そのパネルのControlsプロパティにユーザーコントロールを複数追加(Add)しておき、
必要に応じて対象となるユーザーコントロールをBringToFront()メソッドにて最前面に表示させています。

この場合に、ユーザーコントロール内から自分自身がアクティブになったこと(最前面に表示されたこと)を知る術はありますでしょうか?
ちなみに、ユーザーコントロールに対するEnterやGotFocusといったイベントでは望んだような動作はしませんでした。

よろしくお願い致します。

回答

BringToFrontするだけでなく
不要なコントロールをVisible=False
ターゲットのコントロールをVisible=True
とすればVisibleChangedで判断がつくかと思います。

配置場所を変更して切り替えるという方法もあります。
不要なコントロールを表示範囲外に移動
ターゲットコントロールを所定位置へ移動
こちらの方法だとタブキーによる移動で切替みたいなことにも
対応が可能になります。

どちらにしろターゲットコントロールにたいするアクションを
行っているのでユーザーコントロールに特定のメソッドを作っておいて
そのメソッドをアクティブにしたタイミングで呼ぶことも可能かと思います。
この方法の場合、インターフェースを用意して各ユーザーコントロールに
そのインターフェースを実装するようにすると処理が行いやすくなります。

編集 履歴 (0)
  • 補足としてBringToFrontでは「コントロールがトップレベル コントロールになることはなく、また、Paint イベントは発生しません。」のでイベントは期待できなさそうです。

    http://msdn.microsoft.com/ja-jp/library/system.windows.forms.control.bringtofront.aspx
    -
  • flied_onionさん、回答ありがとうございます。なるほど、そういう手がありますね。ところで、「コントロールがトップレベル コントロールにならない」とはどういう意味なんでしょうか? -
ウォッチ

この質問への回答やコメントをメールでお知らせします。