2012-01-06 18 views
0

我使用的是Visual Studio 2010和SQL Server 2008,並使用sqldatasoure填充了我的gridview。並且gridview內部的itemtemplate中有一些dropdownlist,它們再次與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

我會建議以不同的方式設計用戶界面。具有+2000條記錄的ddl在可用性方面不是最佳實踐。 – aleafonso 2012-01-06 16:53:36

+0

@aleafonso我認爲OP在GridView中意味着2000條記錄。 – jadarnel27 2012-01-06 17:02:00

+0

需要從列表中選擇每行的值。我想我找不到其他備用 – DON 2012-01-06 17:09:33

回答

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; 
    } 
} 

然後用對象數據源對象替換SqlDataSource2SqlDataSource3,這一點到緩存對象的兩種方法。

你需要編寫代碼AccessYourDAL.GetYourDropdownListTableData1();AccessYourDAL.GetYourDropdownListTableData2();

這些只是佔位符。這應該確保您只支付整個電網的2次往返行程,而不是每行2次。

1 + n * 2數據庫調用變爲1 + 2數據庫調用。

+0

是的,我嘗試過,我綁定這些sqldatasource到一個dropdownlist和onrowdatabound事件,我發現它裏面添加itemtemplate內的面板,但它不是在運行時顯示。 – DON 2012-01-06 17:06:24

+0

使用指向返回緩存下拉列表結果副本的方法的對象數據源。 – asawyer 2012-01-06 18:07:14

+0

緩存下拉列表?你的意思是? – DON 2012-01-06 18:35:20

3
  1. 同時不顯示2000行什麼的。
  2. 在您的GridView上設置paging
  3. 如果前兩項沒有幫助,請考慮切換到Repeater控制。
  4. 驗證您的SQL查詢是否在合理的時間範圍內(2-3秒)返回您的數據。
+0

嗨,謝謝,4.SQL查詢顯示記錄在幾秒鐘內。 2.我正在使用Clientside過濾器,所以當使用分頁時,它只會過濾那些分頁的行。 1.我從來沒有使用中繼器控制,我谷歌,如果你有任何工作代碼請在這裏發佈。 – DON 2012-01-06 17:01:26

+0

@ M.Bharnidharan,我編輯了我的答案,其中包含一個鏈接,指向「Repeater」控件的MSDN幫助文章 - 頁面底部有一個例子。您應該知道它是**非常基本的,並且不包含'GridView'控件所具有的很多功能(如內置分頁)。根據您在這裏的評論,我建議您也可以考慮使用服務器端過濾器(如果可能的話)。你也可以看看一些jQuery/JavaScript網格選項,但不幸的是我不能在那裏提出任何建議。 – jwiscarson 2012-01-06 17:07:26

+0

謝謝,我開始與服務器端過濾器通過添加過濾器表達式到sqldatasoure並結束了更多的困難,如在selectcommand是存儲過程時附加過濾器表達式,以及使用controlparameters過濾器時,我無法將我的控件放置在gridview中,所以去了到jquery過濾。 – DON 2012-01-06 17:14:58

0

一種替代方案可能是通過在用於填充DropDownList的列上添加索引來優化sql查詢。

+0

嗨,查詢沒有問題,它在幾秒鐘內就被抓取... – DON 2012-01-06 17:28:39