none
AutoPostBack=TrueのDropDownLISTとFalseのDropDownListが一画面に配置されているときの動作について確認 RRS feed

  • 質問

  • 初歩的な質問ですが、教えて下さい。

    AというDropDownListはAutoPostBack=Falseの設定。BというDropDownListはAutoPostBack=Trueだったとします。

    画面を実行して、

    ①Aに関し、選択アイテムを変更(何も起きない)

    ②Bに関し、選択アイテムを変更(⇒ポストバック発生。VB内のIsPostBack=Trueの際の記述が動作、適合アイテムの名称がDBを参照してラベルに表示される)

    ③予想外に、①で選択したはずのAのアイテムが無効になってしまう。(画面呼び出し時の初期状態の様子)

    期待しているのは、②のオペレーション後でも、Aが①の操作結果を維持していることです。

    AのDropDownListは、ViewStateItem=Trueの設定です。ラジオボタン・テキストボックス同様、ポストバック前の内容を維持するために、皆様はこういった場合どうしておられるのでしょうか?何かの設定ミスで私だけが起きていることでしょうか??

    ネット上で検索すると、非同期、UpdatePanelというキーワードが飛び交っていますが、今私が必要な対策はこれらにあたるのでしょうか?

    お手透きの方ございましたらご見解下さい。


    • 編集済み マブ 2014年1月30日 12:10 誤記
    2014年1月30日 12:09

回答

  • HTML では disabled 状態になっているフォーム要素の値は POSTされないようになっているので、自らを無効化してしまった後の PostBack では選択状態が復元されないですね。

    なので、以下の記事のように JavaScript で submit される前に disabled を解除するか、hidden で値を渡す方法が考えられるかと思います。

    http://www.artsnet.jp/archives/452

    • 回答の候補に設定 星 睦美 2014年2月10日 6:45
    • 回答としてマーク 星 睦美 2014年2月20日 5:22
    2014年2月7日 12:47

すべての返信

  • ご自分の環境(OS, .NET, Visual Studio, IIS のバージョン、使っているブラウザが何かなど)ぐらいは最初に書けませんか?

    また、ASP.NET 標準の DropDownList には ViewStateItem というプロパティはないはずです。間違いかと思いますが、正確に書いてください。

    問題が起きたのときの原因の調査には、コードを問題を再現するのに必要最小限に絞って試してみるのがいいと思います(今回の例では DropDownList  2 つのみをページに配置するなど。② で何をしているのか分かりませんが、そのあたりの影響を受けないように)。

    DropDownList  2 つのみをページに配置した場合、書かれているようなことは起こりません。期待通りにポストバック後の再描画では選択結果が反映されるはずです。

    何かの影響を受けていると思います。コードを絞ることによって、何の影響を受けているか、何故そうなるかの原因が分かって、自己解決できるかもしれません。人に聞く前に是非そうすることをお勧めします。


    • 編集済み SurferOnWww 2014年1月30日 12:57 誤記訂正
    2014年1月30日 12:56
  • 失礼しました。まず以下が私の環境です。

    開発環境OS:Win7/想定本番環境OS:2008R2、VS=2012、IIS=7、ブラウザ=IE8.0

    >ViewStateItem...間違いかと思いますが、正確に書いてください。

    EnableViewStateの間違いでした、重ねてお詫び申し上げます。

    >DropDownList  2 つのみをページに配置した場合、書かれているようなことは起こりません。期待通りにポストバック後の再描画では選択結果が反映されるはずです。

    新規フォームに2つのDropDownListだけを配置してテストしました。すると仰られるとおり、しっかりAutoPostBack設定FalseのDropDownList(A)は、ポスト後も前変更操作が維持されています。

    何かが弊害になっていることは確かなので、AutoPostBack=Falseの設定のDropDownList(A)に関し、動作させているJavaScriptを無効にして確認してみました。すると...

    AのDropDownListはポスト後も前変更操作が維持されるようになりました。

    当該DropDownListへJavascriptを仕込んでいる部分、及び当該Javascriptは以下のとおりです。ちなみに、このDropDownListの左にチェックボックスを配置しており(DropDownListのID=TAXDDL1・チェックボックスのID=CBTAX1)、Javascriptでは「このチェックボックスがOnの際でないと、右のDropDownListを変更できない」、「当該DropDownListに変更が加わったら、自身をEnable=Falseにする」、ということを対応しています。

    【VB.NET(JavaScript仕込み)】

    Me.TaxDDL1.Attributes.Add("onchange", String.Format("onDDLChange('{0}','{1}')", TaxDDL1.ClientID, CBTAX1.ClientID))

    Me.CBTAX1.Attributes.Add("onclick", String.Format("onCBCheck('{0}', '{1}')", TaxDDL1.ClientID, CBTAX1.ClientID))

    【JavaScript本体】

    function onCBCheck(ddlid, cbid) {
        var ddl = document.getElementById(ddlid);
        var cb = document.getElementById(cbid);

        if (cb.checked) {
            // チェックされているとき
            ddl.disabled = false;
        } else {
            //チェックされていないとき
           ddl.disabled = true;
        }
    }

    function onDDLChange(ddlid, cbid) {
        var ddl = document.getElementById(ddlid);
        var cb = document.getElementById(cbid);
        ddl.disabled = true;
        cb.checked = false;
    }

    もはや、JavaScriptの方向の問い合わせになっているかも知れませんが、原因は やはりこれらJavaScriptにあるのでしょうか?

    2014年1月31日 4:31
  • 相変わらず情報が小出し・後出しですね。

    以前何度か改善するようお願いしたと思いますが、もう一回書きます。

    掲示板に書いてあること以外に何も知りえない回答者に、どういう情報を提供すれば回答者が質問者さんの状況を的確に理解でき、タイムリーに的を得た回答ができるかよく考えて質問を書いていただければと思います。

    デバッグ作業まで他人にまる投げしているように思えますが、まずは自分でデバッガや Fiddler などを使って調べてください。

    特に JavaScript 有効/無効で POST されるデータがどう違うか。

    2014年1月31日 5:47
  • 例えばなんですが、AのDropDownList、サーバサイドでEnableをFalseにしたりしていませんか?



    きよくらならみ

    2014年2月7日 9:01
  • > AのDropDownList、サーバサイドでEnableをFalseにしたりしていませんか?

    MVP とかのタイトルを持っている人の回答は、それなりに影響が大きいです。回答する際は、そのことを考えていただくようお願いします。

    2014年2月7日 9:25
  • HTML では disabled 状態になっているフォーム要素の値は POSTされないようになっているので、自らを無効化してしまった後の PostBack では選択状態が復元されないですね。

    なので、以下の記事のように JavaScript で submit される前に disabled を解除するか、hidden で値を渡す方法が考えられるかと思います。

    http://www.artsnet.jp/archives/452

    • 回答の候補に設定 星 睦美 2014年2月10日 6:45
    • 回答としてマーク 星 睦美 2014年2月20日 5:22
    2014年2月7日 12:47
  • > JavaScript で submit される前に disabled を解除するか、hidden で値を渡す方法が考えられるかと思います。

    質問者さんは、自分で(あくまで自分で) JavaScript のコードを書いて disable しているようです。なので、そのあたりを自分でよく考えてもらって、どうするのが適当か考えていただくのがいいと思います。

    2014年2月7日 13:28
  • フォーラム オペレーターの星 睦美です。

    SuferOnWww さん、回答を引き出すポイントをアドバイスいただきありがとうございます。

    マブさん、
    shiba-yan さんからの返信が参考になりそうだと思いましたので、[回答の候補に設定] させていただきました。(引き続き質問がありましたら、[回答の候補の設定解除] をして返信できます。)

    ※役立つ回答には、投稿者からの[回答としてマーク] をお願いします。


    フォーラム オペレーター 星 睦美 - MSDN Community Support

    2014年2月10日 6:58
  • きよくらならみ様

    >AのDropDownList、サーバサイドでEnableをFalseにしたりしていませんか?

    AでなくBのDropDownListをFalseにしていましたね。但し、ヒントになりました。

    ありがとうございました。また長らくの放置申し訳ございませんでした。


    • 編集済み マブ 2014年2月12日 0:28
    2014年2月11日 23:54
  • shiba-yan様

    長らくの放置申し訳ございませんでした。

    >HTML では disabled 状態になっているフォーム要素の値は POSTされないようになっているので、自らを無効化してしまった後の PostBack では選択状態が復元されないですね。

    そういうことでしたか、貴重な情報をありがとうございました。確かにBのDropDownListを事前に、Disableにしているのでまさにこの問題と理解できました。

    また何かの場面でご支援頂けましたら幸いでございます。ありがとうございました。


    • 編集済み マブ 2014年2月12日 0:29
    2014年2月11日 23:58
  • SuferOnWww様

    いつもご支援をありがとうございます、また長らくの放置申し訳ございませんでした。

    それと、ご指摘の件、反省し以後気をつけて参りますので何卒ご容赦下さい。

     

    当該ページを実行し、表示メニューのソースを暫く確認しておりましたが、そもそもdisabled 状態になっているフォーム要素がPOSTされないことを認識していませんでしたので、ソースから問題を捉えることはできませんでした。(皆様が想像する以上に私は低レベルだと思います)

    最終的には、function onDDLChangeの中の、ddl.disabled = true;部分をコメントアウトすることで、回避するように致しました。(よくよく考えてみれば、この動作はいらない気がしたので。そしてとってみれば期待どおり、AのDDLの変化が維持されたので良しとしてしまいました。)

    しかし、今回皆様から学びましたことは今後非常に役に立つことと思います。ありがとうございました。

    2014年2月12日 0:39