- - PR -
(WEBアプリ)Javaで設定したDropDownListのSelectedValueが取得できない
1
投稿者 | 投稿内容 | ||||||||
---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2004-07-12 11:22
VisualStudio .Net2003にて、WEBアプリの開発をしています。
Javaのクライアントスクリプトにて、 TgtCtl.options[i] = new Option('TEXT', '111'); というようにして、DropDownListの中身をセットしているのですが、 これが、DotNetから、ポストバック時にSelectedValueを参照すると、 どこの行を選択していても 一番上の行が選択されているように見えます。 デバッカーで見ても一番上の行が選択されている状態になっています。 何か原因として考えれれることはないでしょうか。 因みに、smartnavigation="False"にしています。 [ メッセージ編集済み 編集者: NYA 編集日時 2004-07-12 11:25 ] | ||||||||
|
投稿日時: 2004-07-12 11:54
データの設定を、どこで、どのようにしていますか?例えば、次のようにしていると×です。
まず、クライアントがページをリクエストした後、サーバでどのようなメソッドが、どの順番で実行されるか、理解してください。 コントロール実行の有効期間を、図化 [重要部分だけ抜き出し] リクエスト発生 →コントロール生成 →initイベントハンドラ →ページ初期データの取り込み →サブミットデータの取り込み →loadイベントハンドラ →その他 [/重要部分だけ抜き出し] つまり、pageクラスのloadイベントハンドラは、最初の読み込みでも、ポストバックの読み込みでも、必ず実行されます。なので、ここでコンボボックスの初期化をしていると、せっかく取り込んだユーザ入力データを上書きし、必ず初期化されてしまう、というわけです。これは、「“ここで初期化処理を”と書いてあるコメントがバグっている」と、私は考えています。 loadイベントハンドラで初期化するには、Page.IsPostBackプロパティで、ポストバックなのかどうかを判別します。 | ||||||||
|
投稿日時: 2004-07-12 12:32
早速のご回答有難うございます。
初期化のコードは、If Not IsPostBack Then の中に書いていますので、 誤って初期化はしていないと思います。 説明不足で申し訳ございませんが、Javaのコードは DropDownListのAttributes("onChange") にセットしています。 onChangeを発生させないで、ポストバックを行うと、正常に SelectedValueが取得できます。 でも、onChangeを発生させて、JavaのコードでDropDownListの 設定を行うと、なぜか取得できません。 ですから、Javaのコードでの設定に問題があるのではないかと 考えています。 お忙しいところ、大変申し訳ございませんが、なにかヒントが ありましたら、ご教授下さい。 よろしくお願いします。 | ||||||||
|
投稿日時: 2004-07-12 13:33
[ポストバック処理]
ms-help://MS.VSCC.2003/MS.MSDNQTR.2003FEB.1041/vbcon/html/vbconWebFormsPageProcessingStages.htm とか サーバーサイドの処理、クライアントサイドの処理の問題かな? 後、JavaとJavaScriptは全く違うものですよ。 | ||||||||
|
投稿日時: 2004-07-12 15:02
項目をnewして、そのnewした項目を選択、サーバ側に送ろうとしていますか?もしそうなら、LoadViewStateメソッド、LoadPostDataメソッドをオーバーライドしてブレークさせ、送られている値を確認してみてください。
スクリプトでnewしたということは、ViewStateにはないですよね。LoadPostDataで、選択できないのではないかと思います。 | ||||||||
|
投稿日時: 2004-07-14 01:45
すみません、 LoadViewStateメソッド、LoadPostDataメソッドをオーバーライドしてブレークの 方法がわかりませんでした。 new するのをやめて、textとvalueの値を変えるだけにしてみたのですが、 それでも、結果は同じでした。 画面上では1番名以降の項目が選択されているのに、ブレークして見ると0番目が選択状態です。なにかよい方法はないでしょうか? [ メッセージ編集済み 編集者: NYA 編集日時 2004-07-14 01:47 ] | ||||||||
|
投稿日時: 2004-07-14 09:55
推測が含まれます。詳しい方、フォロー願います。
クライアントからページの要求が発生すると、ページのインスタンスが作られ、クライアントに送信されてから、破棄されます。このとき、“ポストバック”を実現する為に、ViewStateというhiddenなinput要素に、画面上の値をすべて吐き出します。表示されたページの「ソースを表示」をすると、ViewStateを確認できます。 ここで、サーバからクライアントには、 <select id="s1"> <option id="o1" value="1">値1</option> <option id="o2" value="2">値2</option> <option id="o3" value="3">値3</option> </select> という、3つの値を送ったとします。ユーザはo2を選択したとします。そして、JavaScriptでvalue, textを書き換えたとします。 <option id="o2" value="-2">選択した2</option> ところが、ここが推測ですが、送信されるのは「-2」という値だけです。 サーバ側は、クライアントから送られてきたリクエストを元に、ページインスタンスを作成します。ポストバックであることがマークされているので、LoadViewStateメソッドでViewStateから値を復元します。ここで復元される値は、 <option id="o1" value="1">値1</option> <option id="o2" value="2">値2</option> <option id="o3" value="3">値3</option> です。そして、LoadPostBackメソッドで、s1の値を取り込みます。その値は-2です。valueを対象に、-2を探しますが、見つかりません。 こういうことが発生しているように思います。 テストしてみました。3つの値を持ったDropDownListを用意し、2番目の要素だけ、サブミット前にvalueを変更します。すると、1番目、3番目はリクエスト前後で値を保持しますが、2番目だけ保持できません。 値を変えて送信するのではなく、hiddenなどに、「n番目をstrに変更する」などの情報として送信し、サーバサイドでその情報を元に入れ替えを行う、というようなことをしなければならないと思います。 |
1