- PR -

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

投稿者投稿内容
会議室デビュー日: 2005/02/09
投稿数: 18
投稿日時: 2008-11-12 15:24
SqlDataSourceを動的にbindしていてもEnableViewState=trueにしていれば、
PostBackしただけでは再度データ取得しなさそうですが。。


私が最初に書いた方法は、先にjavascriptを埋め込む方法です。
(最初の描画時に既にスクリプトを入れておく)
選択ボタンの位置は、適当に Cells(10) としています。
コンパイルもせずに適当に書いたので動かなかったらごめんなさい。

Protected Sub GridView_RowDataBound(ByVal sender As Object, ByVal e As GridViewRowEventArgs)
If e.Row.RowType = DataControlRowType.DataRow Then
Dim k As String = e.Row.Cells(3).Text
e.Row.Cells(10).Attributes.Add("onclick", "window.open('◎◎◎?ID=" + k + "');return false")
End If
End Sub


書いててふと思ったのですが、
選択ボタンをTemplateFieldのアンカータグにしてしまえば
aspx側だけで完結することもできそうです。


<asp:TemplateField>
<ItemTemplate>
<a href="javascript:void(0);" onclick="javascript:window.open('WebPageB.aspx?ID=<%# Eval("ID") %>');return false;">選択</a>
</ItemTemplate>
</asp:TemplateField>
ita
常連さん
会議室デビュー日: 2006/10/10
投稿数: 25
お住まい・勤務地: 兵庫県
投稿日時: 2008-11-13 15:30
た さん Todoさん

返信大変遅くなりすみません。風邪でダウンしていました。

todoさんから教えていただいたSQLプロファイラでSQL発行状況を確認しましたが、
SQLでは全行のSelect文は発行していませんでした。
ひとつハッキリしました。todoさんありがとうございます。

引用:

私が最初に書いた方法は、先にjavascriptを埋め込む方法です。
(最初の描画時に既にスクリプトを入れておく)
選択ボタンの位置は、適当に Cells(10) としています。
コンパイルもせずに適当に書いたので動かなかったらごめんなさい。

コード:
Protected  Sub GridView_RowDataBound(ByVal sender As Object, ByVal e As GridViewRowEventArgs)
    If e.Row.RowType = DataControlRowType.DataRow Then
        Dim k As String =  e.Row.Cells(3).Text 
        e.Row.Cells(10).Attributes.Add("onclick", "window.open('◎◎◎?ID=" + k + "');return false")
    End If
End Sub


書いててふと思ったのですが、
選択ボタンをTemplateFieldのアンカータグにしてしまえば
aspx側だけで完結することもできそうです。


コード:
<asp:TemplateField>
    <ItemTemplate>
         <a href="javascript:void(0);" onclick="javascript:window.open('WebPageB.aspx?ID=<%# Eval("ID") %>');return false;">選択</a>
    </ItemTemplate>
</asp:TemplateField>






わざわざ、コードも書いてくれてありがとうございます。
このTemplateFieldでやる方法が一番すっきりするのですが、この部分を動的に埋め込む
方法を教えていただけないでしょうか?
例えば、リスト中の"ID"の部分をコードで動的に設定したいと考えております。

頼ってばかりで申し訳ありませんがよろしくお願いします。
もん吉
常連さん
会議室デビュー日: 2008/05/16
投稿数: 36
投稿日時: 2008-11-14 05:59
VSのデザイナ側でaタグに対し、runat="server"とid=任意のid
を設定しておけば、コードから動的に設定することが可能だと思います。

引用:

コード:
Protected  Sub GridView_RowDataBound(ByVal sender As Object, ByVal e As GridViewRowEventArgs)
    If e.Row.RowType = DataControlRowType.DataRow Then
        Dim k As String =  e.Row.Cells(3).Text 
        Dim a As System.Web.UI.HtmlControls.HtmlAnchor = DirectCast(e.Row.Cells(10).FindControl("hogehoge"), System.Web.UI.HtmlControls.HtmlAnchor)
        a.Attributes.Add("onclick", "window.open('◎◎◎?ID=" + k + "');return false")
    End If
End Sub



コード:
<asp:TemplateField>
    <ItemTemplate>
         <a runat="server" id="hogehoge" href="javascript:void(0);" onclick="javascript:window.open('WebPageB.aspx?ID=<%# Eval("ID") %>');return false;">選択</a>
    </ItemTemplate>
</asp:TemplateField>





会議室デビュー日: 2005/02/09
投稿数: 18
投稿日時: 2008-11-14 10:18
>Dim k$ = GridView1.Rows(GridView1.SelectedIndex).Cells(3).Text ' 項目の値
ここのCells(3)のカラム名がわからなかったので、適当に「ID」というカラムに置き換えました。

TemplateFieldは、自分でカスタマイズできる項目です。
カラム名「ID」がSqlDataSourceのSELECT文内にあれば、
SqlDataSourceがbindしたタイミングで<%# Eval("ID") %> と記載した場所に自動で埋まります。
ですので、VB側で埋め込むコードを記述する必要はありません。

TemplateFieldを追加して、SelectedIndexChangedのイベントを削除すれば
postbackしないでwindow.openできると思います。
(本当は別のところに遅い原因があると思うのですが、全ソースを見ていないので原因はわからないです。。)
ita
常連さん
会議室デビュー日: 2006/10/10
投稿数: 25
お住まい・勤務地: 兵庫県
投稿日時: 2008-11-17 13:08
た さん、もん吉 さん

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

他の方からの回答も合わせて、試してみます。

しかし、別ページを開く部分だけでなく、ページング(独自にSQL文で該当ページだけを取得しています)処理でもDBによっては非常に遅くなっている現実があるので、そこから
片付けないとというより、そこが根本的な原因のような気がします。

た さんのご指摘通り

引用:

(本当は別のところに遅い原因があると思うのですが、全ソースを見ていないので原因はわからないです。。)



原因がわかったら、又、載せようと思います。ありがとうございました。
(少し整理して、別スレッドとして投稿させて頂きます。その時もどうかよろしくお願いします。)

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