[英]Paging large amounts of Data in a 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);
}
為此, DbDataAdapter
類的Fill()
方法具有一個方便的重載:
public int Fill (DataSet dataSet, int startRecord, int maxRecords, string srcTable)
在此重載中,您可以提供記錄編號開頭,並提供從該起始點檢索的最大記錄。 這使您可以基於當前頁索引僅從數據源檢索記錄的一部分。 您需要跟蹤的只是顯示的當前記錄索引。
因此,您將需要修改DAL以提供此重載。 我沒有使用SubSonic,所以我無法確定該功能是否存在。
您使用什么版本的ASP.NET? .NET 3.5中的ListView附帶有一個DataPager控件,請參見system.web.ui.webcontrols.datapager
SubSonic還支持分頁,您應該在查詢中內聯調用Paged方法。 請參見SubSonic分頁
您可以做的一件事是將數據緩存在Web服務器中,並將數據頁面流式傳輸到Web瀏覽器。 您可以使用GridView控制並通過創建一個后台線程來實現此目的,該線程從數據庫中提取數據以使用SqlDataReader填充緩沖區。 然后,瀏覽器使用AJAX從Web服務器提取數據頁(首頁的200行,秒的頁面等),直到緩沖區中的所有行都傳輸到瀏覽器並將其存儲在JavaScript字符串數組中。
我發現此策略有效,並且最多測試了18列的300,000行。 優點之一是分頁數據不依賴於數據庫。 您甚至可以對緩沖區(可以是DataTable)執行排序,而不必再次訪問數據庫。
要了解更多信息,您可以點擊此鏈接。 希望這可以幫助。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.