繁体   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