我有一个返回大约 30,000 条记录的数据表。我在 ASP:GridView 控件中显示这些记录。我有一个下拉控件,我希望用户能够在其中选择要在 GridView 中显示的记录数。默认值应该是全部,但它也可以具有诸如 20、50、100 之类的值。我不太确定该怎么做。
如果我没有打开分页怎么办。PageSize 还能用吗?
我对 GridView.PageSize = 1 进行了硬编码,它仍然返回了所有记录。
使用 gridview 的 PageSize 属性。链接。
您可以将下拉列表的值 (20, 50, 100) 添加到查询中,以便仅选择顶部 (20, 50, 100) 记录。
你也要使用分页吗?
在数据选择中,分页应该总是尽可能早地处理。您不想从数据库检索 30,000 条记录到应用服务器,然后只显示其中的 50 条。
类似于:(用于选择第 3 页,每页 50 个)
select top 50 from x where pk not in (select top 100 pk from x)
翻译为:
CREATE PROCEDURE sspGetItems (@pageSize int, @pageNum int)
AS
SELECT TOP @pageSize
FROM x
WHERE pk NOT IN
(
SELECT TOP (@pageNum - 1) * @pageSize pk FROM x
)
显然,在排序等方面需要更加小心。
如果您希望 PageSize 有效,您必须将 GridView 的 AllowPaging 设置为 true。显然,您必须创建管理事件 PageIndexChanging 的方法。
像这样:
protected void myGvw_OnPageIndexChanging(object sender, GridViewPageEventArgs e)
{
myGvw.PageIndex = e.NewPageIndex;
// then recall the method that bind myGvw
}
DropDown 可以将属性 AutoPostBack 设置为 true 并且您必须在他的 OnSelectedIndexChanged 上设置
myGvw.PageSize = Convert.ToInt32(myDropDown.SelectedValue)
这就是我要做的。首先,我会在 DataTable 中添加一个列,如果它还没有的话,它将作为一个计数器。然后,将 GridView 绑定到 DataView。这是一些代码来演示我在说什么:
//add column with counter
table.Columns.Add("counter", typeof(int));
for (int i = 0; i < table.Rows.Count; i++)
{
table.Rows[i]["counter"] = i+1;
}
然后,从 DataTable 中获取默认视图并设置 RowFilter:
DataView view = table.DefaultView;
view.RowFilter = "counter <= 100"; //or whatever number the user selected
最后,只需将 GridView 直接绑定到 DataView 即可。