- PR -

DropDownListのAutoPostBack処理について

1
投稿者投稿内容
sin
会議室デビュー日: 2006/08/14
投稿数: 14
投稿日時: 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)の対応を行っておりますが、やはり操作性に支障が出るため、
なにか他の対応をご存知の方がいらっしゃいましたら、
ご教示いただけませんでしょうか?

よろしくお願いします。
 


mio
ぬし
会議室デビュー日: 2005/08/25
投稿数: 734
お住まい・勤務地: 神奈川県
投稿日時: 2007-02-21 14:31
.NETを使ってないのでJavaScriptからの発想になりますが。
onchangeが必要なのだとしたら、タイマーを仕込んで、前回と異なればpostするというのも考えられますね。
タイマー間隔分のタイムラグは出ますが、何回かのonchangeは無視されると思います。
まさる
ベテラン
会議室デビュー日: 2006/12/21
投稿数: 59
お住まい・勤務地: 越後の中ほど
投稿日時: 2007-02-21 15:11
引用:

sinさんの書き込み (2007-02-21 13:49) より:
考えられる解決策
 1)LostFocusのような、内容確定後に走るイベントがあれば、そちらを利用する。
   (SelectedIndexChangedは一つ変更する毎にPostBack処理が走る)



とあるので、JavaScriptの話になりますが、
onblurで前回の値と何らかの方法で比較し、
違ったらpostなんてのも考えられますね。

[ メッセージ編集済み 編集者: まさる 編集日時 2007-02-21 15:12 ]
べる
ぬし
会議室デビュー日: 2003/09/20
投稿数: 1093
投稿日時: 2007-02-21 15:22
引用:
 1)LostFocusのような、内容確定後に走るイベントがあれば、そちらを利用する。
   (SelectedIndexChangedは一つ変更する毎にPostBack処理が走る)

PostBackはSelectedIndexChangedによって起きているわけではありません。
そもそもPostBackはクライアントからサーバに対しての動作で、SelectedIndexChangedイベントは
サーバー側のイベントですから。一つ変更する毎にPostBackが走るのはAutoPostBackをTrueに
したことによって自動生成されたjavascriptのonchange(の処理)です。

生成されたHTMLをよくみてAutoPostBackのメカニズムを理解してください。
代替案が思いつくかもしれません。
sin
会議室デビュー日: 2006/08/14
投稿数: 14
投稿日時: 2007-02-21 17:22
>mioさん
ご回答ありがとうございます。
実際にタイマーを設定してみましたが、
その間に変化した処理に対するPostBackも行われてしまっているようでした。

>まさるさん
ご回答ありがとうございます。
AutoPostbackはfalseにし、onblurで前回値と異なる場合に
__doPostBackをcallする、という形で試したところ、
ほぼ理想どおりの形になりました!
ありがとうございます。
ですが、前回値の記憶というのが、どのタイミングで行えばいいのかがわからず
今のところフォーカスが外れる毎にPostBackが走ってしまう状態です。

>べるさん
ご回答ありがとうございます。
なるほど、AutoPostBackの設定を行うことで
コントロールにonChange="__PostBack(...)"が追加され、
PostBackが行われていることが認識できました。
あわせて、まさるさんにご提案いただいたonblurを用いることで
ほぼ理想系にすることが出来ました。



まさる
ベテラン
会議室デビュー日: 2006/12/21
投稿数: 59
お住まい・勤務地: 越後の中ほど
投稿日時: 2007-02-21 17:51
引用:

ですが、前回値の記憶というのが、どのタイミングで行えばいいのかがわからず
今のところフォーカスが外れる毎にPostBackが走ってしまう状態です。


前回値をどのように持たせるかによってタイミングも変わってきます。
(JavaScriptの変数、HtmlInputHidden、TextBox、等)

ただ、設定できるタイミングは
・DropDownList(1)変更時
・DropDownList(1)フォーカス移動時
・ページロード
くらいしかないと思いますので、色々と試してみてはいかがでしょうか。

ところで、

引用:

AutoPostbackはfalseにし、onblurで前回値と異なる場合に
__doPostBackをcallする、という形で試したところ、
ほぼ理想どおりの形になりました!


__doPostBackはASP.NETが生成したファンクションなので、
直接呼ぶのはどうかと思うのですが・・・
todo
ぬし
会議室デビュー日: 2003/07/23
投稿数: 682
投稿日時: 2007-02-21 17:52
引用:

ですが、前回値の記憶というのが、どのタイミングで行えばいいのかがわからず
今のところフォーカスが外れる毎にPostBackが走ってしまう状態です。



onblurのスクリプトに値を直接書けばよいのでは?
コード:
DropDownList1.Attributes["onblur"] 
	= "if (this.selectedIndex != " 
	+ DropDownList1.SelectedIndex 
	+ ") __doPostBack(..);";

Access
ぬし
会議室デビュー日: 2002/04/08
投稿数: 829
投稿日時: 2007-02-22 06:10
__doPostBack(...)を直接記述しないで

ClientScript.GetPostBackClientHyperlink()

で生成したほうがよいかもしれませんね。

※コードを記述しないで実装したいならAJAXのUpdatePanelを
使用する方法もあるかと。

_________________
ASP.NET+Ajaxサンプル集

[ メッセージ編集済み 編集者: Access 編集日時 2007-02-22 06:32 ]
1

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