@IT会議室は、ITエンジニアに特化した質問・回答コミュニティ「QA@IT」に生まれ変わりました。ぜひご利用ください。
- PR -

マスターページのドロップダウンリストをコンテンツページで変更すると。

1
投稿者投稿内容
なんとか
常連さん
会議室デビュー日: 2007/02/21
投稿数: 20
投稿日時: 2007-03-13 13:04
いつも参考にさせていただいております。

VS.NET2005 ASP.NET(VB) SQL-SEVER2003 で開発しているのですが

マスターページにドロップダウンリストを1つ置き
これをメニューリストとして活用したいと思っています。

ドロップダウンリストよりメニューを選択すると各コンテンツページに飛ぶのはいいのですが
別システムより直接コンテンツページのほうを呼び出すことがあり
呼びだされた場合はコンテンツページのほうからマスタページのメニューを該当する項目にしています。

この際にコンテンツページのPage_SaveStateCompleteに処理を書きマスターページの
ドロップダウンリストをセットするようにしたのですが
--------------------------------------
Protected Sub Page_SaveStateComplete(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.SaveStateComplete

'DBよりMenuNo取得
Dim MenuNo As String = GetMenuNO("Default1.aspx") ←ページ名を渡すとメニューNOを返します。

'ドロップダウンメニューの選択位置セット
Master.Menu1SelectedValue = MenuNo ←マスターページのDoropDaownList.SelectedValueをプロパティ化して使用

End Sub
--------------------------------------
この処理後、マスターページのメニューは該当メニュー項目をセットして見た目は完成するのですが
次に別のイベント処理(コンテンツページのボタンクリック等)をすると、
まずはDropDownList_SelectedIndexChangedのイベントが発生してから
該当処理(コンテンツページのボタンクリック等)が走ります。

DropDownList_SelectedIndexChangedの処理を通らず該当処理をするような
何かよい対処方法はありませんでしょうか?
よろしくご教授のほどよろしくお願いします。
EMMS
会議室デビュー日: 2007/03/10
投稿数: 3
投稿日時: 2007-03-13 17:06
マスターページとコンテンツページというのが良く分かりませんが、
Sessionに最後に表示したページ情報を記憶させておいて、
マスターページとやらのPage_Loadで、Sessionの値見て
ドロップダウンの値をセットすればいいんじゃないでしょうか。
なんとか
常連さん
会議室デビュー日: 2007/02/21
投稿数: 20
投稿日時: 2007-03-13 17:54
わかりにくくてすいません。
CommonMaster.masterと言うマスターページを使用して
Default.aspxというコンテンツページを作成と言う意味で書いてます。

このDefault1.aspxのページに遷移した場合に
このページに対するメニューをCommonMaster.masterのドロップダウンリストに指定したいんです。

そこで上記のようにDefault1.aspxのDefault1.aspx.vbのコード内に
CommonMaster.masterのドロップダウンリストのセットを記述したのですが
ページが表示され、メニューがセットされているのは確認したのですが
次に何かボタンクリック等をしてイベントが発生すると
DropDownList_SelectedIndexChangedイベントが最初に発生してしまうのです。

最後に表示したページとは違うのでSessionは使用できず
"Default1.aspx"この情報からメニューNOを取得して
DoropDaownList.SelectedValueの値としてセットしています。
He
大ベテラン
会議室デビュー日: 2002/12/18
投稿数: 141
投稿日時: 2007-03-13 18:15
SaveStateCompleteイベントですか。
ヘルプによると、
引用:
SaveStateComplete イベントは、ページおよびページに含まれているコントロールのビューステートとコントロールの状態が永続媒体に保存された後で発生します。

とのことですから、ここでコントロールの値を変えると、その次のリクエストでChanged系のイベントが動くのでしょう。
(ビューステートで覚えている値と、リクエストでの値がちがうので。)

これって、マスターページ使用の有無に関わらず再現するのでは?

<追記>
試してみました。マスターページを使用していなくても再現しますね。
SaveStateCompleteイベントで処理を行っている理由が分からないので何ともいえませんが、 PreRenderCompleteイベントとかじゃダメなんでしょうか?
</追記>

[ メッセージ編集済み 編集者: He 編集日時 2007-03-13 18:27 ]
ちょっと修正 「内部で覚えている値」→「ビューステートで覚えている値」

[ メッセージ編集済み 編集者: He 編集日時 2007-03-13 18:29 ]
なんとか
常連さん
会議室デビュー日: 2007/02/21
投稿数: 20
投稿日時: 2007-03-13 19:06
なるほど・・・

SaveStateCompleteだとコントロールのビューステートと
コントロールの状態が永続媒体に保存された後なのでこういう動きになるのですね。

なぜSaveStateCompleteでやっているかというと
DoropDaownList.SelectedValueでメニュー位置をセットしたいので
DoropDaownListのバインドが終了している状態でセットしたかったのです。

PreRenderCompleteで試してみます。
He
大ベテラン
会議室デビュー日: 2002/12/18
投稿数: 141
投稿日時: 2007-03-13 20:43
そういうことでしたら、
Master.Menu1SelectedValueプロパティのsetterでは値を覚えるのみにして、
MasterのDropDownList_PreRenderで、実際にリストの設定をすれば、
コンテンツページ側ではタイミングを意識せず値の設定ができるようになり
便利なような気がします。

それともいっそ、
MasterのPage_PreRenderCompleteで、
ContentPlaceHolder1.Pageあたりから情報を取り出してリストの設定をすれば、
コンテンツページ側では何もしなくてよくなり
便利なような気がします。

と、ここまで来ると設計まで踏み込んだ話になってしまうのですが。

以上、お役に立てれば幸いです。

# なんて言いつつ、実はASP.NET 2.0での実務って経験ないんです。
# ヘルプ見ながら、「こんなイベント増えたんだー」とか思ってました。
# 頓珍漢なことを言っていたらツッコミ願います。 > 識者の方
なんとか
常連さん
会議室デビュー日: 2007/02/21
投稿数: 20
投稿日時: 2007-03-14 09:57
Heさんいろいろとありがとうございました。
PreRenderCompleteのほうに処理を書き写したところ正常に動作しました。

MasterのPage_PreRenderCompleteで、ContentPlaceHolder1.Pageの情報を取り出してリストの設定をする方法を少しやってみようかなと思っております。
イベント多くて大変ですね。
がんばらねば。
1

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