- PR -

TabControlのSelectedIndecChangedイベントでアクティブになったTabPageを再読み込みしたい

1
投稿者投稿内容
莉華
会議室デビュー日: 2004/11/18
投稿数: 5
投稿日時: 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でそのユーザーコントロールを探してイベントを実行すれば解決するのですが、もっとスマートなやり方があるのではないかと思い質問しました。

皆様のお知恵を貸して頂きたく思います。
よろしくお願いします。
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2007-01-18 17:35
引用:

莉華さんの書き込み (2007-01-18 17:23) より:

一つのフォームにTabControlがあり、それぞれのTabPageにはユーザコントロールがあります。
TabPageが切り替わるたびに、その中にあるユーザーコントロールのLoadイベントを実行したいと思っています。


何のために、でしょうか?
私の経験からだと、そのようなことをするシナリオが思いつかないです。

引用:

このやり方ではLoadイベントは実行されませんでした。


Load イベントは、そのコントロールが初めて表示される直前に実行されるイベントです。

引用:

ユーザーコントロールのLoadイベントをパブリックにし、Findでそのユーザーコントロールを探してイベントを実行すれば解決するのですが、もっとスマートなやり方があるのではないかと思い質問しました。


Load イベントに何か必要な処理が記述されているのであれば、
Public メソッドに追い出して、そちらを実行すれば良いと思いますが...
(構造化レベルの設計の問題ですね)

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
ぽぴ王子
ぬし
会議室デビュー日: 2006/03/24
投稿数: 475
お住まい・勤務地: お住まい:城・勤務地:城
投稿日時: 2007-01-18 17:37
どうしても Load イベントじゃなければダメですか?
Load イベントは文字通りロードされたときに起きるイベントだと思うので、それ以外のと
ころで呼び出されることは(意図的に呼び出さない限りは)ないと思うのです。
また、逆に言えば呼び出すようなものではないと思うのです。
こうしたいというのはわかるのですが、背景にある理由も(差し支えない範囲で)説明して
いただけるともう少し有効な回答が得られるかもしれません。

弊害がなければ、ユーザコントロールの VisibleChanged イベントにでも処理を書
けば何かできそうな気もしますが、それではいけないんでしょうか。
(タブが切り替わるとその中のコントロールの表示状態が変更されるからね)

# ってあら、じゃんぬさんに先を越されちゃっただわさ
_________________
ぽぴ王子@わんくま同盟
ぽぴ王子の人生プログラミング中 / ぽぴンち。
莉華
会議室デビュー日: 2004/11/18
投稿数: 5
投稿日時: 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 イベントにでも処理を書けば何かできそうな気もしますが
そのようなやり方もあるんですね。試してみます。
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2007-01-18 22:03
 Load の中に ComboBox の内容を変更する処理を書いているのが間違いです。Document & View アーキテクチャとか、Model View Control とか、そういう話になります。

 仮に、Load と VisibleChanged の2箇所に書いたとして、ComboBox を構成する方法が変わったら、どうしますか?2箇所とも直すのですか?
 あるいは、構成し直すタイミングが増えたらどうしますか?3つ目を書くのですか?

 データバインドを使う方法が、一番スマートかと思います。
 あるいは、「データが変わった」というイベントを作成し、関連するデータを構成し直すというメソッドを結びつけてあげても良いでしょう。

_________________
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2007-01-19 11:06
引用:

莉華さんの書き込み (2007-01-18 18:02) より:

今回このような状況になったのは、TabControlにTabPageが複数あり、AというTabPageでデータを登録した際、BというTabPageのコンボボックスのデータが更新されない状況になっています。
Aが更新されたらBのコンボボックスも更新したいので、TabPageが切り替わったタイミングでLoad処理を呼べば良いのでは?と考えました。


この場合、参照を配列か何かに確保しておいて、TabControl の SelectedIndex にあたる要素の、
Pubic なメソッドを実行した方がまだスマートでしょう。

引用:

LoadイベントではなくてもTabPageにいるユーザーコントロールにアクセスできれば良いのですが、


よって、こういったことは、インスタンスさえわかっていれば普通にできますよね。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
1

スキルアップ/キャリアアップ(JOB@IT)