簡體   English   中英

在Gridview中分頁大量數據

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM