根据 SortField 的值添加一个正确的 ORDER BY 子句。这样做有什么原因吗?
当分页程序以 NonCached 模式工作时,原始的查询将被修改以确保只检索当前页面的记录。在 SQL Server 上执行的实际查询文本将采取以下形式。 SELECT * FROM
(SELECT TOP ItemsPerPage * FROM
(SELECT TOP ItemsPerPage*CurrentPageIndex * FROM (SelectCommand) AS t0
ORDER BY SortField ASC) AS t1 ORDER BY SortField DESC) AS t2 ORDER BY SortField
该查询弥补了 SQL Server 2000 中 ROWNUM 子句的缺陷,并且对记录进行重新排序,使得只有 x 项目的“第 n 个”块经过正确排序后返回。您可以指定基础查询,分页程序将它分解为多个较小的页面。只有适合某个页面的记录被返回。正如您看到的那样,除了查询命令以外,上述查询需要处理排序字段。这就是为什么另外添加了 SortField 属性。此代码的唯一缺陷是默认情况为升序排序。通过使 ASC/DESC 关键字参数化,可以使此代码真的非常完美: private void FetchPageData() {
// 需要经过验证的页面索引来获取数据。 // 还需要实际的页数来验证页面索引。 AdjustSelectCommand(false);
VirtualRecordCount countInfo = CalculateVirtualRecordCount(); TotalPages = countInfo.PageCount;
// 验证页码(确保 CurrentPageIndex 有效或为“-1”) ValidatePageIndex();
if (CurrentPageIndex == -1) return;
// 准备并运行命令
SqlCommand cmd = PrepareCommand(countInfo); if (cmd == null) return;
SqlDataAdapter adapter = new SqlDataAdapter(cmd); DataTable data = new DataTable(); adapter.Fill(data);
// 配置分页的数据源组件 if (_dataSource == null)
_dataSource = new PagedDataSource(); _dataSource.AllowCustomPaging = true; _dataSource.AllowPaging = true; _dataSource.CurrentPageIndex = 0; _dataSource.PageSize = ItemsPerPage;
_dataSource.VirtualCount = countInfo.RecordCount; _dataSource.DataSource = data.DefaultView; }
在 NonCached 模式中,PagedDataSource 对象并不提供整个数据源,因此不能计算出要进行分页的总页数。进而必须对 AllowCustomPaging 属性进行标记,并提供数据源中的实际记录数量。通常,实际数量是使用 SELECT COUNT(*) 查询进行检索的。此模型与 DataGrid 的自定义分页几乎相同。此外,PagedDataSource 对象中选择的当前页面索引通常为 0,因为实际上已经存储了一页记录。
SqlPager 控件的实现方法就介绍到这里,下面我们介绍一下它的使用方法。 使用 SqlPager 控件
假设存在一个包含 ListBox 控件的示例页面。要使用分页程序,请确保 .aspx 页面正确地注册了该控件的程序集。
<%@ Register TagPrefix=\Assembly=\
控件的标记取决于实际设置的属性。以下标记是一个合理的示例:
SelectCommand=\ ConnectionString=\ SortKeyField=\ 除了分页程序以外,页面还包含一个列表框和一个按钮。列表框将显示每个页面的内容;按钮只用于首次填充列表框。该按钮具有一个单击事件处理程序,定义如下。 private void LoadFirst1_Click(object sender, EventArgs e) { SqlPager1.CurrentPageIndex = 0; SqlPager1.DataBind(); } 图 2 显示操作中的页面。 图 2:与 ListBox 控件协同工作的 SqlPager 控件。 使用 DataList 控件可以生成一个更有意思的示例。目标是使用分页程序浏览每个 Northwind 职员的个人记录。该 DataList 如以下列表所示。 <%# DataBinder.Eval(Container.DataItem, \ DataBinder.Eval(Container.DataItem, \ <%# DataBinder.Eval(Container.DataItem, \ id=<%# DataBinder.Eval(Container.DataItem, \/> <%# DataBinder.Eval(Container.DataItem, \ 表格的第一行显示职员的姓名和职务,然后是相片,相片周围是注释。相片是使用特定的 .aspx 页面检索的,返回从数据库中获取的 JPEG 数据。 分页程序可以放置在页面中的任何位置。本例中将它放置在合作者 DataList 控件上方并紧挨着合作者控件。 图 3:SqlPager 对 DataList 控件进行分页 将 SqlPager 控件与 DataGrid 控件一起使用有意义吗?这要视情况而定。DataGrid 已经与一个基于本文中使用的 PagedDataSource 对象的嵌入式分页引擎一起工作。因此,如果您需要对以表格格式显示的单个记录集合进行分页时,就无需使用 SqlPager。但是,对于重要/复杂的方案,将这两个控件一起使用并不是一种牵强的想法。例如,如果您要向前一个屏幕快照添加一个 DataGrid 来显示由职员管理的订单,则可以在同一格页面上放置两个相关的分页引擎,一个要对职员进行分页,另一个用于滚动相关订单。 小结 不管您要生成哪种类型的应用程序(Web 应用程序、Microsoft? Windows? 应用程序或 Web 服务),您都很难下载和缓存要显示的整个数据源。有时,测试
相关推荐: