在Gridview中分配大量数据

时间:2009-07-17 07:28:46

标签: c# asp.net gridview subsonic paging

好的,请耐心等待,因为我有时可能会有点像木鸭......

我在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);
}

3 个答案:

答案 0 :(得分:1)

Fill()类的DbDataAdapter方法为此目的提供了方便的重载:

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

在此重载中,您可以提供要开始的记录编号以及要从该起点检索的最大记录。这使您可以根据当前页面索引从数据源中仅检索记录的子集。您需要跟踪的是显示的当前记录索引。

因此您需要修改DAL以提供此重载。我没有使用过SubSonic,所以我无法判断它是否存在该功能。

答案 1 :(得分:0)

您使用的是哪个版本的ASP.NET? .NET 3.5中的ListView附带了一个DataPager控件 见system.web.ui.webcontrols.datapager

SubSonic还支持分页,你应该在查询中调用内联的Paged方法。见SubSonic Paging

答案 2 :(得分:0)

您可以做的一件事是在网络服务器中缓冲数据并将数据页面流式传输到网络浏览器。您可以使用GridView控件以及通过创建后台线程来实现此操作,该后台线程从数据库中提取数据以使用SqlDataReader填充缓冲区。然后浏览器使用AJAX从webserver中提取数据页(第一页200行,秒页等),直到缓冲区中的所有行都传输到浏览器并将其存储在JavaScript字符串数组中。

我发现这个策略有效并且测试了最多300,000行,18列。一个优点是分页数据不依赖于您的数据库。您甚至可以对缓冲区(可以是DataTable)执行排序,而不是再次访问数据库。

To find out more, you can follow this link.希望这有帮助。