- PR -

(WEBアプリ)Javaで設定したDropDownListのSelectedValueが取得できない

1
投稿者投稿内容
NYA
会議室デビュー日: 2004/05/16
投稿数: 12
投稿日時: 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 ]
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2004-07-12 11:54
引用:

NYAさんの書き込み (2004-07-12 11:22) より:

Javaのクライアントスクリプトにて、
TgtCtl.options[i] = new Option('TEXT', '111');
というようにして、DropDownListの中身をセットしているのですが、
これが、DotNetから、ポストバック時にSelectedValueを参照すると、
どこの行を選択していても
一番上の行が選択されているように見えます。


 データの設定を、どこで、どのようにしていますか?例えば、次のようにしていると×です。
コード:
Page_Load() {
  // ページのロードイベント
  // 「初期化する処理を記入してください」と、コメントが入っている
  dropdown.items.add(itemsArray);
}



 まず、クライアントがページをリクエストした後、サーバでどのようなメソッドが、どの順番で実行されるか、理解してください。
コントロール実行の有効期間を、図化
[重要部分だけ抜き出し]
リクエスト発生
→コントロール生成
→initイベントハンドラ
→ページ初期データの取り込み
→サブミットデータの取り込み
→loadイベントハンドラ
→その他
[/重要部分だけ抜き出し]
つまり、pageクラスのloadイベントハンドラは、最初の読み込みでも、ポストバックの読み込みでも、必ず実行されます。なので、ここでコンボボックスの初期化をしていると、せっかく取り込んだユーザ入力データを上書きし、必ず初期化されてしまう、というわけです。これは、「“ここで初期化処理を”と書いてあるコメントがバグっている」と、私は考えています。

 loadイベントハンドラで初期化するには、Page.IsPostBackプロパティで、ポストバックなのかどうかを判別します。
NYA
会議室デビュー日: 2004/05/16
投稿数: 12
投稿日時: 2004-07-12 12:32
早速のご回答有難うございます。

初期化のコードは、If Not IsPostBack Then の中に書いていますので、
誤って初期化はしていないと思います。

説明不足で申し訳ございませんが、Javaのコードは
DropDownListのAttributes("onChange") にセットしています。
onChangeを発生させないで、ポストバックを行うと、正常に
SelectedValueが取得できます。
でも、onChangeを発生させて、JavaのコードでDropDownListの
設定を行うと、なぜか取得できません。
ですから、Javaのコードでの設定に問題があるのではないかと
考えています。
お忙しいところ、大変申し訳ございませんが、なにかヒントが
ありましたら、ご教授下さい。
よろしくお願いします。
soluna
ベテラン
会議室デビュー日: 2004/06/15
投稿数: 59
投稿日時: 2004-07-12 13:33
[ポストバック処理]
ms-help://MS.VSCC.2003/MS.MSDNQTR.2003FEB.1041/vbcon/html/vbconWebFormsPageProcessingStages.htm
とか
サーバーサイドの処理、クライアントサイドの処理の問題かな?

後、JavaとJavaScriptは全く違うものですよ。
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2004-07-12 15:02
 項目をnewして、そのnewした項目を選択、サーバ側に送ろうとしていますか?もしそうなら、LoadViewStateメソッド、LoadPostDataメソッドをオーバーライドしてブレークさせ、送られている値を確認してみてください。

 スクリプトでnewしたということは、ViewStateにはないですよね。LoadPostDataで、選択できないのではないかと思います。
NYA
会議室デビュー日: 2004/05/16
投稿数: 12
投稿日時: 2004-07-14 01:45
引用:

Jittaさんの書き込み (2004-07-12 15:02) より:
 項目をnewして、そのnewした項目を選択、サーバ側に送ろうとしていますか?もしそうなら、LoadViewStateメソッド、LoadPostDataメソッドをオーバーライドしてブレークさせ、送られている値を確認してみてください。

 スクリプトでnewしたということは、ViewStateにはないですよね。LoadPostDataで、選択できないのではないかと思います。



すみません、
LoadViewStateメソッド、LoadPostDataメソッドをオーバーライドしてブレークの
方法がわかりませんでした。

new するのをやめて、textとvalueの値を変えるだけにしてみたのですが、
それでも、結果は同じでした。
画面上では1番名以降の項目が選択されているのに、ブレークして見ると0番目が選択状態です。なにかよい方法はないでしょうか?

[ メッセージ編集済み 編集者: NYA 編集日時 2004-07-14 01:47 ]
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 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

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