2012-01-06 56 views
0

私はVisual Studio 2010とSQL Server 2008を使用していて、sqldatasoureでgridviewを実装しています。また、gridviewのitemtemplateには、sqldatasourceとrowdataboundイベントでバインドされているドロップダウンリストこれらのドロップダウンリストに選択した値を割り当てています。グリッドを非常に遅くロードする2000年以上のレコードがあります。これを最適化するためのアイデア。ASP.NET Gridviewより多くのデータバインディングで遅い読み込み

<form id="form1" runat="server"> 
    <div> 
    <asp:GridView ID="Gridview1" runat="server" DataSourceID="SqlDataSource1" 
     AutoGenerateColumns="False" onrowdatabound="Gridview1_RowDataBound"> 
     <Columns> 
      <asp:TemplateField> 
       <ItemTemplate> 
        <asp:DropDownList ID="Dropdownlist1" runat="server" DataSourceID="SqlDataSource2" DataTextField="empid" DataValueField="empname"> 
        </asp:DropDownList> 
        <asp:HiddenField ID="HiddenField1" runat="server" Value='<%# Eval("empid") %>' /> 
        <asp:DropDownList ID="Dropdownlist2" runat="server" DataSourceID="SqlDataSource3" DataTextField="desgid" DataValueField="desgname"> 
        </asp:DropDownList> 
        <asp:HiddenField ID="HiddenField2" runat="server" Value='<%# Eval("desgid") %>' /> 
       </ItemTemplate> 
      </asp:TemplateField> 
     </Columns> 
    </asp:GridView> 
<asp:SqlDataSource ID="SqlDataSource1" runat="server" ConnectionString='<%$  ConnectionStrings:dbconn %>' 
    SelectCommandType="StoredProcedure" SelectCommand="SP_Fetch_Grid"> </asp:SqlDataSource> 
    <asp:SqlDataSource ID="SqlDataSource2" runat="server" ConnectionString='<%$ ConnectionStrings:dbconn %>' 
    SelectCommandType="StoredProcedure" SelectCommand="SP_Fetch_DDL1"></asp:SqlDataSource> 
    <asp:SqlDataSource ID="SqlDataSource3" runat="server" ConnectionString='<%$ ConnectionStrings:dbconn %>' 
    SelectCommandType="StoredProcedure" SelectCommand="SP_Fetch_DDL2"></asp:SqlDataSource> 
</div> 
</form> 

protected void Gridview1_RowDataBound(object sender, GridViewRowEventArgs e) 
{ 
    if (e.Row.RowType == DataControlRowType.DataRow) 
    { 
     HiddenField hf1 = (HiddenField)e.Row.FindControl("HiddenField1"); 
     HiddenField hf2 = (HiddenField)e.Row.FindControl("HiddenField2"); 
     DropDownList ddl1 = (DropDownList)e.Row.FindControl("DropDownList1"); 
     DropDownList ddl2 = (DropDownList)e.Row.FindControl("DropDownList2"); 
     ddl1.SelectedValue = hf1.Value; 
     ddl2.SelectedValue = hf2.Value; 
    } 
} 
+0

UIを別の方法で設計することをお勧めします。 + 2000レコードのddlは、ユーザビリティの点でベストプラクティスではありません。 – aleafonso

+0

@aleafonso私は、OPはGridViewの2000レコードを意味すると思います。 – jadarnel27

+0

各行のリストから値を選択する必要があります。私は別の代替を見つけることができないと思う。 – DON

答えて

1

ドロップダウンリストを一度メモリにプルダウンしてバインドします。それはあなたに2000以上のサーバーラウンドトリップを節約します。

編集 - このように、何かを小さなクラスを作成します。

public static class DropDownListCache 
{ 
    private static Func<DataTable> m_getDataFunc = 
      () => AccessYourDAL.GetYourDropdownListTableData1(); 
    private static Func<DataTable> m_getDataFunc = 
      () => AccessYourDAL.GetYourDropdownListTableData2(); 

    private static Lazy<DataTable> DropDown1 = 
      new Lazy<TDataType>(m_getDataFunc1,true); 
    private static Lazy<DataTable> DropDown2 = 
      new Lazy<TDataType>(m_getDataFunc2,true); 

    public static DataTable GetDropDownList1() 
    { 
     return DropDown1; 
    } 

    public static DataTable GetDropDownList2() 
    { 
     return DropDown2; 
    } 
} 

そして、キャッシュオブジェクト上の2つの方法と、オブジェクトのデータ・ソース・オブジェクトとそのポイントをSqlDataSource2SqlDataSource3を交換してください。あなたがAccessYourDAL.GetYourDropdownListTableData1();AccessYourDAL.GetYourDropdownListTableData2();

者のためのコードを記述する必要が

は単なるプレースホルダです。これにより、グリッド全体で2回の往復で、1行につき2回の往復のみを支払う必要があります。

1 + n * 2データベース呼び出しは1 + 2データベース呼び出しになります。

+0

はい私はあまりにも私は1つのドロップダウンリストにそれらのsqldatasourceをバインドし、onrowdataboundイベント中にitemtemplate内部のパネルが見つかりましたが、それは実行時に表示されていません。 – DON

+0

キャッシュされたドロップダウンリストの結果のコピーを返すメソッドを指すオブジェクトデータソースを使用します。 – asawyer

+0

キャッシュされたドロップダウンリスト?ワットは意味ですか? – DON

3
  1. の2000行を表示しません。
  2. GridViewpagingを設定してください。
  3. 最初の2つの項目が役に立たなかった場合は、代わりにRepeaterコントロールに切り替えることを検討してください。
  4. SQLクエリが妥当な時間枠(2-3秒)でデータを返すことを確認します。
+0

こんにちは、4。 2. Clientsideフィルタを使用しているため、ページングを使用すると、ページングされた行のみがフィルタリングされます。私はリピータコントロールを使ったことは一度もありませんでした。 – DON

+0

@ M.Bharnidharan、私は、RepeaterコントロールのMSDNヘルプ記事へのリンクを含めるように答えを編集しました。ページの一番下にその例があります。 **非常に**基本的であることを知っておくべきで、 'GridView'コントロールが行う多くの機能(組み込みページングのような)は含まれていません。私はここにあなたのコメントに基づいて、可能であればサーバ側のフィルタを使用することを検討することをお勧めしたいと思います。また、いくつかのjQuery/JavaScriptグリッドオプションを調べることもできますが、残念ながらそこには何もお勧めできません。 – jwiscarson

+0

ありがとう、私はsqldatasoureにフィルタ式を追加してサーバー側のフィルタで開始し、selectcommandがストアドプロシージャのときにフィルタ式を追加するなどの難しさで終了しました。フィルタのコントロールパラメータを使用すると、 jqueryフィルタリング。 – DON

0

代わりに、DropDownListを作成するために使用されている列にインデックスを追加して、SQLクエリを最適化することもできます。

+0

こんにちは、クエリで問題はありません、それは秒で取得取得... – DON

関連する問題