- PR -

[ASP.NET]GridViewの行選択から、別のWebペ−ジを開く際に非常に遅い

投稿者投稿内容
ita
常連さん
会議室デビュー日: 2006/10/10
投稿数: 25
お住まい・勤務地: 兵庫県
投稿日時: 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イベントのソース
コード:
    Protected Sub GridView1_SelectedIndexChanged(ByVal sender As Object, ByVal e As EventArgs) Handles GridView1.SelectedIndexChanged

        Dim k$ = GridView1.Rows(GridView1.SelectedIndex).Cells(3).Text     ' 項目の値
        Dim aspx$ = "WebPageB.aspx?ID=" & k$
        Dim javascr$ = "window.open('" & aspx$ & "','_blank','width=600,height=600,scrollbars=yes,resizable=yes');"

        ScriptManager.RegisterClientScriptBlock(Me.UpdatePanel1, Me.GetType(), "WEBB", javascr$, True)	' *A*

    End Sub


よろしくお願いします。
もん吉
常連さん
会議室デビュー日: 2008/05/16
投稿数: 36
投稿日時: 2008-11-11 22:58
800件程度のテーブル(GridViewは20行表示)で9秒というのは
SQL文でデータを全て(800件)取ってきているでしょうか?
20件取ってくるというSQL文に変えても結果は同じでしょうか?

それと話は変わりますがASP.NET Ajaxの根本的な問題として
Ajaxと言いつつもページ全体がサーバに送信される(PostBackされる)
ということです。
その文JavaScriptを書かずに済むので生産性は高いですが・・・。

ということでPostBackしているかどうかの判断を入れることで
解決するかもしれません。

Access
ぬし
会議室デビュー日: 2002/04/08
投稿数: 829
投稿日時: 2008-11-12 05:23
次のような対応をしてみてはどうでしょうか。

1)ViewStateを無効にできるように改善する

2)GridViewのカレントページに表示するレコードのみ
  データベースから読み込むように改善する

これでかなりレスポンスがよくなると思います。
_________________
ASP.NET+Ajaxサンプル集 | JavaScript+Ajaxサンプル集
会議室デビュー日: 2005/02/09
投稿数: 18
投稿日時: 2008-11-12 11:39
GridViewでは、
EnableViewState="false"にしてObjectDataSource等で自動bindしていると、
PostBackした場合に再度データ取得処理を行うと思います。

windowを開くだけならば、postbackさせないのが一番早いです。
GridViewのRowDataBoundイベント等で、
選択ボタンに対して先にjavascriptを埋め込んでおく。
(window.openの後にreturn falseしておけばpostbackしないはず)


ita
常連さん
会議室デビュー日: 2006/10/10
投稿数: 25
お住まい・勤務地: 兵庫県
投稿日時: 2008-11-12 12:00
もん吉さん、Accessさん

回答ありがとうございます。
仰るとおり、カレントページ分のデータだけを取得するようにしているつもりです。
下記のSQL文で、該当ページだけ(この場合は、41行目から20行だけ)を取得するように
しているつもりです。

コード:
SELECT TOP 20 * from Table where DBNo not in 
	(SELECT TOP 40 DBNo from Table where ORDER BY DBNo desc) 
	order by DBNo desc


でも、動きから何故か、全レコードを取得しにいっている気がします。

因みに、SQL Server 2000を使っていますが、実際に発行されたSQL文を確認する方法ってあるのですか?
あれば、その方法で確認すれば一目瞭然なのですが。

引用:

> ということでPostBackしているかどうかの判断を入れることで
> 解決するかもしれません。



PostBackについても、Page_Load時に判断しています。

引用:

1)ViewStateを無効にできるように改善する



AccessさんのViewStateを無効にするというのは、具体的にどのようなことなのでしょうか?
GridViewのEnableViewStateをFalseにするということでしょうか?
因みにFalseにしてみましたが、状況は変りませんでした。

追加情報として、GridViewの設定は、
GridViewには、デザイン時にはバインドさせておらず、実行時に動的にSqlDataSourceをバインドしています。
コード中で、SqlDataSourceのSelectCommandにページ文のSQLを指定しています。

よろしくお願いします。
todo
ぬし
会議室デビュー日: 2003/07/23
投稿数: 682
投稿日時: 2008-11-12 12:38
引用:

因みに、SQL Server 2000を使っていますが、実際に発行されたSQL文を確認する方法ってあるのですか?
あれば、その方法で確認すれば一目瞭然なのですが。



SQLプロファイラ
http://www.atmarkit.co.jp/fdotnet/basics/adonet05/adonet05_03.html

[ メッセージ編集済み 編集者: todo 編集日時 2008-11-12 12:39 ]
ita
常連さん
会議室デビュー日: 2006/10/10
投稿数: 25
お住まい・勤務地: 兵庫県
投稿日時: 2008-11-12 13:02
todoさん

ありがとうございます。これで発行SQLを確認してみます。

引用:

SQLプロファイラ
http://www.atmarkit.co.jp/fdotnet/basics/adonet05/adonet05_03.html




ita
常連さん
会議室デビュー日: 2006/10/10
投稿数: 25
お住まい・勤務地: 兵庫県
投稿日時: 2008-11-12 13:11
た さん

回答ありがとうございます。

引用:

たさんの書き込み (2008-11-12 11:39) より:
GridViewでは、
EnableViewState="false"にしてObjectDataSource等で自動bindしていると、
PostBackした場合に再度データ取得処理を行うと思います。


ObjectDataSourceは使っていません。前述しましたが、SqlDataSourceを動的にbindしています。

引用:

windowを開くだけならば、postbackさせないのが一番早いです。
GridViewのRowDataBoundイベント等で、
選択ボタンに対して先にjavascriptを埋め込んでおく。
(window.openの後にreturn falseしておけばpostbackしないはず)


具体的にどのようなコードを記述するのでしょうか?
申し訳ありませんが教えて下さい。
因みに、下記のようにWindow.openの後にreturn false;を追加してみましたがダメでした。見当違いのことをやっていたらすみません。

コード:
    Protected Sub GridView1_SelectedIndexChanged(ByVal sender As Object, ByVal e As EventArgs) Handles GridView1.SelectedIndexChanged

        Dim k$ = GridView1.Rows(GridView1.SelectedIndex).Cells(3).Text     ' 項目の値
        Dim aspx$ = "WebPageB.aspx?ID=" & k$
        Dim javascr$ = "window.open('" & aspx$ & "','_blank','width=600,height=600,scrollbars=yes,resizable=yes');return false;"

        ScriptManager.RegisterClientScriptBlock(Me.UpdatePanel1, Me.GetType(), "WEBB", javascr$, True)	' *A*

    End Sub


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