好吧,请耐心等待,因为我有时会有点像木鸭......
我在 ASP.NET 中有一个网格视图,它将拉回数千条记录。除了性能方面之外,这一切都很好。我将 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);
}
Fill()
类的DbDataAdapter
方法为此目的提供了方便的重载:
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 方法。请参阅亚音速寻呼
您可以做的一件事是缓冲网络服务器中的数据并将数据页传输到网络浏览器。您可以使用 GridView 控件并创建一个后台线程来实现此目的,该线程使用 SqlDataReader 从数据库中提取数据以填充缓冲区。然后浏览器使用 AJAX 从网络服务器中提取数据页(第一页、第二页等 200 行),直到缓冲区中的所有行都传输到浏览器并将其存储在 JavaScript 字符串数组中。
我发现这个策略很有效,并在最多 300,000 行 18 列的情况下进行了测试。优点之一是数据分页不依赖于您的数据库。您甚至可以对缓冲区(可以是数据表)执行排序,而不用再次访问数据库。
要了解更多信息,您可以点击此链接。希望这会有所帮助。