- - PR -
SmartNavigation = True について
投稿者 | 投稿内容 | ||||
---|---|---|---|---|---|
|
投稿日時: 2004-02-23 15:58
初めて投稿させて頂きます。
ASP.NET初心者です。 現在、長い画面で下のほうにドロップダウンリストを2つ設定しております。 1つ目を選択されると、その内容によってもう一つのドロップダウンリストに セットされるようになっています。 SmartNavigation = True として、PostBack時にスクロールバーを動かさないように しているのですが、始めの1回目だけは先頭に戻ってしまいます。 1回動作を行えば、あとは何回動作してもスクロールバーは固定されています。 何か分かる方がいらっしゃいましたら、ご教授願います。 宜しくお願い致します。 | ||||
|
投稿日時: 2004-02-23 17:58
最初の1回目と、2回目以降の違いは何ですか?最初の表示では、ドロップダウンは空とか?
| ||||
|
投稿日時: 2004-02-23 18:30
特に違いは思い当たらないのですが、
Jittaさんのおっしゃる通り、2つ目のドロップダウンの初期表示は空です。 しかし2回目以降、1つ目を空白にセットすると2つ目はクリアする作りになっています。 この時には、先頭には戻りませんし、これ以降も先頭には戻りません。 1つ目のドロップダウンの中は、空白・A・B・C となっており 2つ目のドロップダウンの中は、1つ目によって変化し 空白ならクリア、Aなら「あ・い・う」、Bなら「か・き・く」、Cなら「さ・し・す」 と表示されます。 説明不足で申し訳ありません。 | ||||
|
投稿日時: 2004-02-23 20:17
似た現象は経験あります。
1回目のポストバックに限り、Page.Loadが2回発生しませんか?
再現するコードを掲示すると、回答しやすい。 | ||||
|
投稿日時: 2004-02-24 09:55
デバッグしてみたのですが、ポストバックは1回しか行われていません。
一応ソースも書いておきます。 Private Sub Page_Load(ByVal sender As System.Object, ByVal e As stem.EventArgs) Handles MyBase.Load Dim blnReturn As Boolean Me.SmartNavigation = True If Not IsPostBack Then '画面初期化処理 blnReturn = fncFormInitialize() If blnReturn = False Then 'エラー処理 End If End If End Sub Private Sub DropDownList1_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles DropDownList1.SelectedIndexChanged Dim strShozoku As String Dim aryGroup() As String Dim blnReturn As Boolean Dim intCnt As Integer '内容を取得 strShozoku = DropDownList1.SelectedValue '内容消去 DropDownList2.Items.Clear() '空白時 If strShozoku = "" Then Exit Sub End If 'データ取得 blnReturn = gfncGroupConnect(aryGroup, strShozoku) If blnReturn = False Then 'エラー処理 End If 'セットする For intCnt = 0 To UBound(aryGroup) DropDownList2.Items.Add(aryGroup(intCnt)) Next End Sub ちなみに、ドロップダウンリストに値をセットする時に、DBと連結をさせず 自分で取得してから、値をセットしているのですが関係ありますかね? | ||||
|
投稿日時: 2004-02-24 11:21
私もSmartNavigationを使っていて、何らかの理由で「使え〜ん!」と、
『onscrollでhiddenなinputにスクロール位置を蓄えておき、onloadでスクロールする』 というスクリプトを仕込んだのですが、なぜ「使え〜ん!」となったのか、忘れてしまいましたm(__)m #理由の1つはresponse.writeを誤用していたための誤解だったのですが。。。 スクリプトは http://www.kawabata.com/Forums/ShowPost.aspx?PostID=432 これがいいです。 | ||||
|
投稿日時: 2004-02-24 12:09
Jittaさん、サンプル有難うございます。
サンプルのように動けば良いのですが、私VBしか分からないもので いまいち理解が出来ていません。 FORMの下部のHTMLで表示させて</FONT>と</FORM>の間に<script language="javascript">の行を2行追加したのですが、1回目の動きとしましては変化無しでした。 2回目以降の動きとしては、押されたコントロールが最下部になって表示されました。 他にしなければならないことはあるのでしょうか? 勉強不足で誠に申し訳ありません。ご教授お願い致します。 | ||||
|
投稿日時: 2004-02-24 13:48
まず、<input type=hidden>を2つ用意し、名前を付けます。これはForm要素の内側に付けます。
<input type=hidden id=scrollManager> <input type=hidden id=scrollManager.Top> 次にイベント関数を用意します・・・が、これは実行時に作っているんですね^^; <script language=javascript> if (window.document.body.onload != null) { c = window.document.body.onload.toString(); c = c.replace(/^[^{]*{/, '{'); c = c.replace(/}$/, '}'); } else { c = ''; } c = new Function(c.toString() + 'window.scrollTo(0,0);'); window.document.body.onload=c; </script> 元々設定されているイベントが無いか調べ、それを整形します(ifブロック内)。そして、整形した後の文字列に、指定位置までスクロールする関数を追加して、body要素のonload属性として指定します。 同じように、onscrool属性も変更します。 <script language=javascript> if (window.document.body.onscroll != null) { c = window.document.body.onscroll.toString(); c = c.replace(/^[^{]*{/, '{'); c = c.replace(/}$/, '}'); } else { c = ''; } c = new Function(c.toString() + 'document.all("scrollManager").value=window.document.body.scrollLeft; document.all("scrollManager.Top").value=window.document.body.scrollTop;'); window.document.body.onscroll=c; </script> あ・・・これ、サーバサイドで作って吐き出していますね。上のスクリプトの window.scrollTo(0,0) を、 window.scrollTo( document.all("scrollManager").value, document.all("scrollManager.Top").value) にします。これで望み通りの動きになると思います。 ただ、このままだとIE専用になると思います。 |