0

好吧,请多多包涵,因为我有时会有点像木鸭……

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

3 回答 3

1

为了这个目的,类的Fill()方法有一个方便的重载:DbDataAdapter

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

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

所以你需要修改你的 DAL 来提供这个重载。我没有使用过 SubSonic,所以我无法判断其中是否存在该功能。

于 2009-07-17T07:47:09.613 回答
0

您使用什么版本的 ASP.NET?.NET 3.5 中的 ListView 附带一个 DataPager 控件,请参阅system.web.ui.webcontrols.datapager

SubSonic 还支持分页,您应该在查询中内联调用 Paged 方法。请参阅SubSonic 寻呼

于 2009-07-17T08:02:57.553 回答
0

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

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

要了解更多信息,您可以点击此链接。希望这可以帮助。

于 2009-09-20T15:05:40.080 回答