- PR -

SmartNavigation = True について

投稿者投稿内容
TARO
会議室デビュー日: 2004/02/23
投稿数: 15
投稿日時: 2004-02-23 15:58
初めて投稿させて頂きます。
ASP.NET初心者です。

現在、長い画面で下のほうにドロップダウンリストを2つ設定しております。
1つ目を選択されると、その内容によってもう一つのドロップダウンリストに
セットされるようになっています。
SmartNavigation = True として、PostBack時にスクロールバーを動かさないように
しているのですが、始めの1回目だけは先頭に戻ってしまいます。
1回動作を行えば、あとは何回動作してもスクロールバーは固定されています。

何か分かる方がいらっしゃいましたら、ご教授願います。
宜しくお願い致します。
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2004-02-23 17:58
 最初の1回目と、2回目以降の違いは何ですか?最初の表示では、ドロップダウンは空とか?
TARO
会議室デビュー日: 2004/02/23
投稿数: 15
投稿日時: 2004-02-23 18:30
特に違いは思い当たらないのですが、
Jittaさんのおっしゃる通り、2つ目のドロップダウンの初期表示は空です。

しかし2回目以降、1つ目を空白にセットすると2つ目はクリアする作りになっています。
この時には、先頭には戻りませんし、これ以降も先頭には戻りません。
1つ目のドロップダウンの中は、空白・A・B・C となっており
2つ目のドロップダウンの中は、1つ目によって変化し
空白ならクリア、Aなら「あ・い・う」、Bなら「か・き・く」、Cなら「さ・し・す」
と表示されます。

説明不足で申し訳ありません。
todo
ぬし
会議室デビュー日: 2003/07/23
投稿数: 682
投稿日時: 2004-02-23 20:17
似た現象は経験あります。
1回目のポストバックに限り、Page.Loadが2回発生しませんか?

引用:

さとるさんの書き込み (2004-02-23 18:30) より:
1つ目のドロップダウンの中は、空白・A・B・C となっており
2つ目のドロップダウンの中は、1つ目によって変化し
空白ならクリア、Aなら「あ・い・う」、Bなら「か・き・く」、Cなら「さ・し・す」
と表示されます。


再現するコードを掲示すると、回答しやすい。

TARO
会議室デビュー日: 2004/02/23
投稿数: 15
投稿日時: 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と連結をさせず
自分で取得してから、値をセットしているのですが関係ありますかね?
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2004-02-24 11:21
 私もSmartNavigationを使っていて、何らかの理由で「使え〜ん!」と、
『onscrollでhiddenなinputにスクロール位置を蓄えておき、onloadでスクロールする』
というスクリプトを仕込んだのですが、なぜ「使え〜ん!」となったのか、忘れてしまいましたm(__)m
#理由の1つはresponse.writeを誤用していたための誤解だったのですが。。。

 スクリプトは
http://www.kawabata.com/Forums/ShowPost.aspx?PostID=432
これがいいです。
TARO
会議室デビュー日: 2004/02/23
投稿数: 15
投稿日時: 2004-02-24 12:09
Jittaさん、サンプル有難うございます。
サンプルのように動けば良いのですが、私VBしか分からないもので
いまいち理解が出来ていません。

FORMの下部のHTMLで表示させて</FONT>と</FORM>の間に<script language="javascript">の行を2行追加したのですが、1回目の動きとしましては変化無しでした。
2回目以降の動きとしては、押されたコントロールが最下部になって表示されました。
他にしなければならないことはあるのでしょうか?
勉強不足で誠に申し訳ありません。ご教授お願い致します。

Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 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専用になると思います。

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