- - PR -
DropDownListのAutoPostBack処理について
1
投稿者 | 投稿内容 | ||||||||
---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2007-02-21 13:49
いつもお世話になっております。
開発環境 Windows XP SP2 .NET FRAMEWORK 2.0 Visual Studio 2005 C# IIS 5.1 上記の環境でWebアプリケーションの開発を行っています。 要件 ・二つのDropDownList(1)(2)が存在し、 DropDownList(1)を変化させた場合、動的に DropDownList(2)の内容を取得したい。 実装 ・DropDownList(1)のAutoPostBackをTrueにし、 DropDownList(1)のSelectedIndexChangedイベントで DropDownList(2)の内容を取得している。 問題点 ・DropDownList(1)をマウスホイールや↓キー・↑キーなどで連続的に変更すると サーバにPostBack処理が大量に走ってしまい、大きな負荷がかかる。 考えられる解決策 1)LostFocusのような、内容確定後に走るイベントがあれば、そちらを利用する。 (SelectedIndexChangedは一つ変更する毎にPostBack処理が走る) 2)JavascriptでonChangeイベントでそれ以上DropDownList(1)を 変化させられないようにする。 (Disabledにするとそもそもの変更も無効化されてしまうため無理でした。) 3)PostBack処理を1回以上走らせないように出来れば、そちらを利用する。 4)マウスホイール・↓キー・↑キーでの変更を無効化する。 現状は4)の対応を行っておりますが、やはり操作性に支障が出るため、 なにか他の対応をご存知の方がいらっしゃいましたら、 ご教示いただけませんでしょうか? よろしくお願いします。 | ||||||||
|
投稿日時: 2007-02-21 14:31
.NETを使ってないのでJavaScriptからの発想になりますが。
onchangeが必要なのだとしたら、タイマーを仕込んで、前回と異なればpostするというのも考えられますね。 タイマー間隔分のタイムラグは出ますが、何回かのonchangeは無視されると思います。 | ||||||||
|
投稿日時: 2007-02-21 15:11
とあるので、JavaScriptの話になりますが、 onblurで前回の値と何らかの方法で比較し、 違ったらpostなんてのも考えられますね。 [ メッセージ編集済み 編集者: まさる 編集日時 2007-02-21 15:12 ] | ||||||||
|
投稿日時: 2007-02-21 15:22
そもそもPostBackはクライアントからサーバに対しての動作で、SelectedIndexChangedイベントは サーバー側のイベントですから。一つ変更する毎にPostBackが走るのはAutoPostBackをTrueに したことによって自動生成されたjavascriptのonchange(の処理)です。 生成されたHTMLをよくみてAutoPostBackのメカニズムを理解してください。 代替案が思いつくかもしれません。 | ||||||||
|
投稿日時: 2007-02-21 17:22
>mioさん
ご回答ありがとうございます。 実際にタイマーを設定してみましたが、 その間に変化した処理に対するPostBackも行われてしまっているようでした。 >まさるさん ご回答ありがとうございます。 AutoPostbackはfalseにし、onblurで前回値と異なる場合に __doPostBackをcallする、という形で試したところ、 ほぼ理想どおりの形になりました! ありがとうございます。 ですが、前回値の記憶というのが、どのタイミングで行えばいいのかがわからず 今のところフォーカスが外れる毎にPostBackが走ってしまう状態です。 >べるさん ご回答ありがとうございます。 なるほど、AutoPostBackの設定を行うことで コントロールにonChange="__PostBack(...)"が追加され、 PostBackが行われていることが認識できました。 あわせて、まさるさんにご提案いただいたonblurを用いることで ほぼ理想系にすることが出来ました。 | ||||||||
|
投稿日時: 2007-02-21 17:51
前回値をどのように持たせるかによってタイミングも変わってきます。 (JavaScriptの変数、HtmlInputHidden、TextBox、等) ただ、設定できるタイミングは ・DropDownList(1)変更時 ・DropDownList(1)フォーカス移動時 ・ページロード くらいしかないと思いますので、色々と試してみてはいかがでしょうか。 ところで、
__doPostBackはASP.NETが生成したファンクションなので、 直接呼ぶのはどうかと思うのですが・・・ | ||||||||
|
投稿日時: 2007-02-21 17:52
onblurのスクリプトに値を直接書けばよいのでは?
| ||||||||
|
投稿日時: 2007-02-22 06:10
__doPostBack(...)を直接記述しないで
ClientScript.GetPostBackClientHyperlink() で生成したほうがよいかもしれませんね。 ※コードを記述しないで実装したいならAJAXのUpdatePanelを 使用する方法もあるかと。 _________________ ASP.NET+Ajaxサンプル集 [ メッセージ編集済み 編集者: Access 編集日時 2007-02-22 06:32 ] |
1