- - PR -
[ASP.NET]GridViewの行選択から、別のWebペ−ジを開く際に非常に遅い
投稿者 | 投稿内容 | ||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2008-11-11 15:54
いつも、お世話になっています。「ita」と申します。
GridViewの行選択から、別のWebペ−ジを開く際に非常に遅いのですが、ここら辺判る方、教えて下さい。 開発環境 ・ASP.NET 2.0 ・Visual Basic 2008 ・IIS6.0+Ajax1.0 あるWebページAのUpdatePanel中にGridViewを配置し、列に「選択」CommondFieldを設けて、SelectedIndexChangedイベントで この行情報を使って、他のWebページBを別Windowで開こうとしています。 この時、選択ボタン(Link)をクリックし、SelectedIndexChangedイベントにはすんなり制御が移るのですが、 このSelectedIndexChangedイベント内のScriptManager.RegisterClientScriptBlock(*A*)の実行の後から WebページBに制御が移るまでに時間がかかるのですが、なにが原因なのでしょうか? いろいろ調べた処、そのGridViewにBindしているテーブルの大きさに左右されるように思われます。 (GridViewの表示行数には関係なく、テーブル自体の行数が大きい物ほど、時間がかかっているようです) 例:800件程度のテーブル(GridViewは20行表示)でも9秒もかかっています。 ScriptManager.RegisterClientScriptBlockの後にDBに対して何らかの処理を行っているように思えて ならないのですが、自分ではなにもしていないつもりです。 自動的になにか処理されるのでしょうか? ■SelectedIndexChangedイベントのソース
よろしくお願いします。 | ||||||||||||
|
投稿日時: 2008-11-11 22:58
800件程度のテーブル(GridViewは20行表示)で9秒というのは
SQL文でデータを全て(800件)取ってきているでしょうか? 20件取ってくるというSQL文に変えても結果は同じでしょうか? それと話は変わりますがASP.NET Ajaxの根本的な問題として Ajaxと言いつつもページ全体がサーバに送信される(PostBackされる) ということです。 その文JavaScriptを書かずに済むので生産性は高いですが・・・。 ということでPostBackしているかどうかの判断を入れることで 解決するかもしれません。 | ||||||||||||
|
投稿日時: 2008-11-12 05:23
次のような対応をしてみてはどうでしょうか。
1)ViewStateを無効にできるように改善する 2)GridViewのカレントページに表示するレコードのみ データベースから読み込むように改善する これでかなりレスポンスがよくなると思います。 _________________ ASP.NET+Ajaxサンプル集 | JavaScript+Ajaxサンプル集 | ||||||||||||
|
投稿日時: 2008-11-12 11:39
GridViewでは、
EnableViewState="false"にしてObjectDataSource等で自動bindしていると、 PostBackした場合に再度データ取得処理を行うと思います。 windowを開くだけならば、postbackさせないのが一番早いです。 GridViewのRowDataBoundイベント等で、 選択ボタンに対して先にjavascriptを埋め込んでおく。 (window.openの後にreturn falseしておけばpostbackしないはず) | ||||||||||||
|
投稿日時: 2008-11-12 12:00
もん吉さん、Accessさん
回答ありがとうございます。 仰るとおり、カレントページ分のデータだけを取得するようにしているつもりです。 下記のSQL文で、該当ページだけ(この場合は、41行目から20行だけ)を取得するように しているつもりです。
でも、動きから何故か、全レコードを取得しにいっている気がします。 因みに、SQL Server 2000を使っていますが、実際に発行されたSQL文を確認する方法ってあるのですか? あれば、その方法で確認すれば一目瞭然なのですが。
PostBackについても、Page_Load時に判断しています。
AccessさんのViewStateを無効にするというのは、具体的にどのようなことなのでしょうか? GridViewのEnableViewStateをFalseにするということでしょうか? 因みにFalseにしてみましたが、状況は変りませんでした。 追加情報として、GridViewの設定は、 GridViewには、デザイン時にはバインドさせておらず、実行時に動的にSqlDataSourceをバインドしています。 コード中で、SqlDataSourceのSelectCommandにページ文のSQLを指定しています。 よろしくお願いします。 | ||||||||||||
|
投稿日時: 2008-11-12 12:38
SQLプロファイラ http://www.atmarkit.co.jp/fdotnet/basics/adonet05/adonet05_03.html [ メッセージ編集済み 編集者: todo 編集日時 2008-11-12 12:39 ] | ||||||||||||
|
投稿日時: 2008-11-12 13:02
todoさん
ありがとうございます。これで発行SQLを確認してみます。
| ||||||||||||
|
投稿日時: 2008-11-12 13:11
た さん
回答ありがとうございます。
ObjectDataSourceは使っていません。前述しましたが、SqlDataSourceを動的にbindしています。
具体的にどのようなコードを記述するのでしょうか? 申し訳ありませんが教えて下さい。 因みに、下記のようにWindow.openの後にreturn false;を追加してみましたがダメでした。見当違いのことをやっていたらすみません。
|