2009-07-17 59 views
0

好了,請原諒,因爲我可能會有點有時木鴨...分頁大量的數據在GridView

我在asp.net一個GridView將被拉回不少一千個記錄。除了事物的性能方面,這一切都很好。我將我的GridView綁定到數據集,並將查詢中的每條記錄都拉回來。我想改變這個,這樣gridview只會拉回它當前正在顯示的記錄,然後當用戶移動到下一個頁面時,它會得到下一個數據夾點。

下面是我通常綁定我的網格瀏覽和處理分頁和排序,這對我的數據量很小的情況非常有效,但對於大數據量則不太好。我使用SubSonic作爲我的DAL,這很酷。任何人都可以在正確的方向上指出我如何最好地實現如上所述的分頁?

在此先感謝...

public SortDirection SortDir 
{ 
    get 
    { 
     if (ViewState["sortDirection"] == null) 
     { 
      ViewState["sortDirection"] = SortDirection.Ascending; 
     } return (SortDirection)ViewState["sortDirection"]; 
    } 
    set 
    { 
     ViewState["sortDirection"] = value; 
    } 
} 

DataSet ds = new DataSet(); 
DataView dv = new DataView(); 

protected void Page_Load(object sender, EventArgs e) 
{ 
    if (!IsPostBack) 
    { 
     BindGrid(); 
     GridView1.DataSource = dv; 
     GridView1.DataBind(); 
    } 
} 

private DataView BindGrid() 
{ 
    ds = new Query(AnthemWeb.DAL.Item.Schema).ExecuteDataSet(); 

    if (ViewState["sortExpr"] != null) 
    { 
     dv = new DataView(ds.Tables[0]); 
     dv.Sort = (string)ViewState["sortExpr"]; 
    } 
    else 
    { 
     dv = ds.Tables[0].DefaultView; 
    } 

    return dv; 
} 

protected void GridView1_PageIndexChanging(object sender, GridViewPageEventArgs e) 
{ 
    GridView1.PageIndex = e.NewPageIndex; 
    GridView1.DataSource = BindGrid(); 
    GridView1.DataBind(); 
} 

protected void GridView1_Sorting(object sender, GridViewSortEventArgs e) 
{ 
    string stExp = e.SortExpression; 
    string stDir = string.Empty; 
    if (SortDir == SortDirection.Ascending) 
    { 
     SortDir = SortDirection.Descending; 
     stDir = "DESC"; 
    } 
    else 
    { 
     SortDir = SortDirection.Ascending; 
     stDir = "ASC"; 
    } 

    ViewState["sortExpr"] = e.SortExpression + " " + stDir; 
    GridView1.DataSource = BindGrid(); 
    GridView1.DataBind(); 
} 

protected void GridView1_SelectedIndexChanged(object sender, EventArgs e) 
{ 
    int selectedRowIndex; 
    selectedRowIndex = GridView1.SelectedIndex; 
    GridViewRow row = GridView1.Rows[selectedRowIndex]; 
    string ID = row.Cells[0].Text; 

    Response.Redirect("customer-details.aspx?ID=" + ID, false); 
} 

回答

0

您使用的是什麼版本的ASP.NET? 有一個DataPager控件附帶在.net 3.5 的ListView見system.web.ui.webcontrols.datapager

亞音速還支持分頁,你應該打個電話查詢的分頁方法內聯。請參閱SubSonic Paging

+0

非常感謝球員的回覆。我正在嘗試在Subsonic中使用分頁方法,但是我現在遇到的問題是gridview上的分頁控件沒有出現? 我正在創建一個集合並將gridview綁定到這個。我傳入.Paged(pageIndex,6)。 allowpaging在gridview上設置,我有一個方法來處理GridView1_PageIndexChanging事件 - BindPagedData(e.NewPageIndex,6);無法通過分頁進行移動控制 - 有120個記錄用於測試。 我是用完全錯誤的方式來解決這個問題的嗎?謝謝你提供的所有幫助。 – macou 2009-07-20 03:45:19

1

DbDataAdapter類的Fill()方法對這個目的的便利超載:

public int Fill (DataSet dataSet, int startRecord, int maxRecords, string srcTable) 

在這種超載,您可以提供記錄編號從該起點開始檢索最大記錄並從中檢索。這使您可以根據當前頁面索引從數據源中僅檢索記錄的子集。所有你需要跟蹤的是顯示的當前記錄索引。

所以你需要修改你的DAL來提供這個過載。我沒有使用亞音速,所以我不知道該功能是否存在。

0

您可以做的一件事是將數據緩衝在網絡服務器中並將數據頁面流式傳輸到網絡瀏覽器。您可以使用GridView控件並通過創建後臺線程來實現此目的,該後臺線程從數據庫中提取數據以使用SqlDataReader填充緩衝區。然後,瀏覽器使用AJAX從Web服務器中提取數據頁(200行第一頁,第二頁等),直到緩衝區中的所有行傳輸到瀏覽器並將其存儲在JavaScript字符串數組中。

我覺得這個策略有效,並且測試到最多300,000行,18列。一個優點是分頁數據不依賴於你的數據庫。您甚至可以對緩衝區執行排序(可以是DataTable),而不是再次訪問數據庫。

To find out more, you can follow this link.希望這會有所幫助。