- - PR -
TabControlのSelectedIndecChangedイベントでアクティブになったTabPageを再読み込みしたい
1
投稿者 | 投稿内容 | ||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2007-01-18 17:23
こんにちは。
現在VisualStudio2005 C#で開発を行っています。 一つのフォームにTabControlがあり、それぞれのTabPageにはユーザコントロールがあります。 TabPageが切り替わるたびに、その中にあるユーザーコントロールのLoadイベントを実行したいと思っています。 private void Tab_Master_SelectedIndexChanged(object sender, EventArgs e) { TabControl tb = (TabControl)sender; TabPage tp = tb.SelectedTab; tp.Refresh(); } このやり方ではLoadイベントは実行されませんでした。 ユーザーコントロールのLoadイベントをパブリックにし、Findでそのユーザーコントロールを探してイベントを実行すれば解決するのですが、もっとスマートなやり方があるのではないかと思い質問しました。 皆様のお知恵を貸して頂きたく思います。 よろしくお願いします。 | ||||||||||||
|
投稿日時: 2007-01-18 17:35
何のために、でしょうか? 私の経験からだと、そのようなことをするシナリオが思いつかないです。
Load イベントは、そのコントロールが初めて表示される直前に実行されるイベントです。
Load イベントに何か必要な処理が記述されているのであれば、 Public メソッドに追い出して、そちらを実行すれば良いと思いますが... (構造化レベルの設計の問題ですね) _________________ C# と VB.NET の入門サイト じゃんぬねっと日誌 | ||||||||||||
|
投稿日時: 2007-01-18 17:37
どうしても Load イベントじゃなければダメですか?
Load イベントは文字通りロードされたときに起きるイベントだと思うので、それ以外のと ころで呼び出されることは(意図的に呼び出さない限りは)ないと思うのです。 また、逆に言えば呼び出すようなものではないと思うのです。 こうしたいというのはわかるのですが、背景にある理由も(差し支えない範囲で)説明して いただけるともう少し有効な回答が得られるかもしれません。 弊害がなければ、ユーザコントロールの VisibleChanged イベントにでも処理を書 けば何かできそうな気もしますが、それではいけないんでしょうか。 (タブが切り替わるとその中のコントロールの表示状態が変更されるからね) # ってあら、じゃんぬさんに先を越されちゃっただわさ _________________ ぽぴ王子@わんくま同盟 ぽぴ王子の人生プログラミング中 / ぽぴンち。 | ||||||||||||
|
投稿日時: 2007-01-18 18:02
>じゃんぬねっとさん
>ぽぴ王子さん 早速の回答ありがとうございます。 今回このような状況になったのは、TabControlにTabPageが複数あり、AというTabPageでデータを登録した際、BというTabPageのコンボボックスのデータが更新されない状況になっています。 Aが更新されたらBのコンボボックスも更新したいので、TabPageが切り替わったタイミングでLoad処理を呼べば良いのでは?と考えました。 LoadイベントではなくてもTabPageにいるユーザーコントロールにアクセスできれば良いのですが、 TabControl tb = (TabControl)sender; TabPage tp = tb.SelectedTab; switch (tp.Name) { case "タブの名前": ((UserControl)tp.Controls.Find("名前", true)[0]).パブリック処理(); break; } このようにアクティブになったタブに対して各処理を記述していくのも良いのですが、TabPageの中にもTabControlがいたり複雑になっているので、このような記述はよくないと思い質問させて頂きました。 >ユーザコントロールの VisibleChanged イベントにでも処理を書けば何かできそうな気もしますが そのようなやり方もあるんですね。試してみます。 | ||||||||||||
|
投稿日時: 2007-01-18 22:03
Load の中に ComboBox の内容を変更する処理を書いているのが間違いです。Document & View アーキテクチャとか、Model View Control とか、そういう話になります。
仮に、Load と VisibleChanged の2箇所に書いたとして、ComboBox を構成する方法が変わったら、どうしますか?2箇所とも直すのですか? あるいは、構成し直すタイミングが増えたらどうしますか?3つ目を書くのですか? データバインドを使う方法が、一番スマートかと思います。 あるいは、「データが変わった」というイベントを作成し、関連するデータを構成し直すというメソッドを結びつけてあげても良いでしょう。 _________________ | ||||||||||||
|
投稿日時: 2007-01-19 11:06
この場合、参照を配列か何かに確保しておいて、TabControl の SelectedIndex にあたる要素の、 Pubic なメソッドを実行した方がまだスマートでしょう。
よって、こういったことは、インスタンスさえわかっていれば普通にできますよね。 _________________ C# と VB.NET の入門サイト じゃんぬねっと日誌 |
1