- PR -

【ASP.NET】Timer使用時にUpdatePanelを更新させない方法

1
投稿者投稿内容
キレネン
会議室デビュー日: 2008/08/04
投稿数: 9
投稿日時: 2008-09-04 19:27
Ajax Extensionを使って開発しています。

UpdatePanelにGridViewを配置して、Timerによる
更新処理をさせています。

やりたいことは、Timerで必ず再描画するのではなく、
Timerが発生した時にサーバのデータを取得してきて、そのデータが
ブラウザに表示中のデータと異なる場合のみ再描画させたいです。

しかし、Timerが発生すると同時にポストバックが発生する為、
強制的にUpdatePanelが更新されてしまう問題に直面しています。


実装は以下のようにしています。
・UpdatePanelの外にTimerを配置
・UpdatePanelの「UpdateMode」は『Always』

なお、「UpdateMode」を『Condensial』に変えて、
UpdatePanelの「Triggers」は『Timer』の『Tick』を設定し、
Timer_Tick()の中で、UpdatePanel.update()を発生させる手段も試しました。

しかしそうすると、
UpdatePanel.update()を呼ばずにTimer_Tick()が
終わった場合に、「無効なポストバックが発生しました」と
ブラウザに表示されてしまいます。

Timerの度に再描画させたくないのですが
何か方法はありませんでしょうか。
べる
ぬし
会議室デビュー日: 2003/09/20
投稿数: 1093
投稿日時: 2008-09-04 23:13
状況がちょっとつかめないです。

引用:
実装は以下のようにしています。
・UpdatePanelの外にTimerを配置
・UpdatePanelの「UpdateMode」は『Always』

これだけでは、Timer_Tickの際に、普通に(Ajaxを使っていないときのように)
ページが更新されてしまうはずですよね。(これを再描画といっています?)
UpdatePanelのTriggersにTimerを入れていますか?またはTimerは別のUpdatePanelにある?

引用:
なお、「UpdateMode」を『Condensial』に変えて、
UpdatePanelの「Triggers」は『Timer』の『Tick』を設定し、
Timer_Tick()の中で、UpdatePanel.update()を発生させる手段も試しました

Triggersに設定しているならUpdate()しなくても更新されます。

引用:
UpdatePanel.update()を呼ばずにTimer_Tick()が
終わった場合に、「無効なポストバックが発生しました」と
ブラウザに表示されてしまいます。

こちらでは発生しませんでした。何か別の原因でしょうかね。
ただ表示するだけのGridViewで試していますか?

・TimerもUpdatePanelに入れる。
・ChildrenAsTriggersをfalseにする
・UpdateModeをConditionalにする
これでもTickは発生するので、このときに更新するかしないか判断して
UpdatePanel.Update() とするのはどうですか?
ぴあちゃん
ぬし
会議室デビュー日: 2008/02/07
投稿数: 287
投稿日時: 2008-09-05 01:15
流れぶった切ってすんまそん、状況つかめます、です。
昨日ほぼ同じものをASP.NETではなくてJavaで(ごめん
なさい)作りましたから。

まぁかいつまんで言うと、GridViewの展開イメージさえわかれば
割と簡単に実現できそうです。
ViewState までは保証できませんがね。

僕が作ったのは、サーバーログを5秒間隔でポーリングして差分をJSON
で取得し、DOMでテーブルの最後尾に追加して、ScrollIntoViewで常に
最下行に移動させて画面を表示して、画面は1000行固定なんで溢れた
行はDOMで消してくみたいなのですね。ログは更新間隔5秒なんで多いと
過去ログがすぐに消えちゃうからタイマーを停止するためのチェックボッ
クス付けたりして。

Ajaxはサーバーとの通信にはJSONフォーマットで対応しました。簡単です
から。

UpdatePanelで実現したいなら、ちょっと難しいかもしれません。
UpdatePanelはやめて、ただのGridView+AjaxtoolkitのAjax単体と
タイマーを使うならまだ出来そうな悪寒がします。

更新行数が最大400行で設定しています。つまりサーバーログの最新を
最大400行引っ張ってくるのですが、今のところ最初の描画だけ5秒以
上掛かりますがあとは1秒〜2秒程度の再描画時間でいけていますね。
再描画完了してから5秒経過で再読み込みなんで実質5秒〜10秒と間隔
に多少ばらつきがありますが。ログ見るためだけのツールなんで問題じゃ
ありません、です。

50行程度の更新なら、1秒かからんです。

追記:差分だけを更新したい、ってのは、一度なんにしてもサーバーまで
データがあるかどうか確認しに行かなくちゃならないからGridViewは毎回
追加データが無くても更新されちゃいますよねw見た目・行数は変わらな
いにしてもスクロール位置が先頭に戻ってしまったり・・・その他色々。

なんで、つまり、UPdatePanelでやるなら、非表示のUpdatePanelをタイマー
で動かしつつ、ポストバックしてきたGridViewの更新部分を表の静的なGridView
に追加するとか、なんてならもっと簡単に実現できそうな気がします。



[ メッセージ編集済み 編集者: ぴあちゃん 編集日時 2008-09-05 01:25 ]
1

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