编程开发 > ASP > 文章内容

创建用于ASP.NET的分页程序控件

2010-7-14编辑:feimeimei
  解决向任何 ASP.NET 控件添加分页功能的问题。还为开发复合 ASP.NET 控件提供了很多有用的提示和技巧。
  的第一个标记之间进行的。由于分页程序是窗体的子控件,因此匹配时会成功,分页程序获取单击事件。如果您认为这种解释不够充分或者令人费解,只要下载 SqlPager 控件的源代码,删除 INamingContainer 标记接口并进行重新编译即可。您将看到分页程序能够返回,但不能内部处理单击事件。
  INamingContainer 接口是一个不具备方法的标记接口,其实现只需在类声明中指定名称即可,无需进行任何其他操作。
  复合控件的另一个重要方面是,它们通常不需要自定义逻辑来进行显示。复合控件的显示遵循其组成控件的显示。生成复合控件时,通常无需覆盖 Render 方法。
  控件的 SqlPager 树由一个包含两个单元格的单行表格组成。该表格继承了分页程序的大部分可视设置,如前景颜色和背景颜色、边框、字体信息和宽度等。第一个单元格包含导航条,其结构取决于 PagerStyle 属性的值。如果分页程序的样式为 NextPrev,则导航条将由四个 VCR 式的按钮组成。否则,它将由一个下拉列表组成。
  private void BuildControlHierarchy(){ // 生成环境表格,就会生成分页程序的控件树,这时远未达到显示阶段。特别是,当处理相关的服务器端事件时,就必须生成控件树,因而是在数据绑定开始之前生成控件树。困难在于,数据绑定将修改页面索引,而这必须反映在用户界面中。如果不采取某些对策的话,当用户切换到另一页时,分页程序中的页面索引将不会被刷新。
  有各种方法可以解决此问题,但重要的是要弄清楚问题及其真正的原因。您可以避免生成控件树,并在 Render 方法中生成所有输出。另外,您还可以修改树中受数据绑定更改影响的部分。本文选择了第三种方法,这种方法需要较少的代码,而且,不管控件的用户界面的哪个部分受到数据绑定更改的影响,都能够解决问题。通过将 ChildControlsCreated 属性设置为 false,可以使以前创建的任何控件树无效。这样,在显示之前将重新创建控件树。
  分页引擎
  SqlPager 控件支持两种检索数据的方法 - 缓存和非缓存。如果采用前者,选择命令原样执行,整个结果集将绑定到在内部进行分页的数据源对象上。PagedDataSource 对象将自动返回适合特定页面的记录。PagedDataSource 类也是在 DataGrid 默认分页机制背后运行的系统组件。
  检索所有记录但只显示适合页面的几个记录,这通常不是一种明智的方法。由于 Web 应用程序的无状态特性,事实上,每次请求页面时都可能运行大量的查询。要使操作有效,采用缓存的数据检索方法必须依赖于某种缓存对象,ASP.NET 的 Cache 对象就是一个很好的候选对象。缓存技术的使用加快了应用程序的运行速度,但其提供的数据快照不能反映最新的更改。另外,它需要使用 Web 服务器上的较多内存。而且荒谬的是,如果大量的数据按会话缓存的话,甚至可能造成很大的问题。Cache 容器对于应用程序来说是全局的;如果数据按会话存储在其中,还需生成会话特有的项目名称。
  Cache 对象的上面是完全支持过期策略的。换句话说,存储在缓存中的数据在一段时间后可以自动被释放。以下代码说明 SqlPager 类中用来获取数据并将其存储在缓存中的一个 private 方法。
  private void FetchAllData(){ // 在 ASP.NET Cache 中查找数据 DataTable data; data = (DataTable) Page.Cache[CacheKeyName]; if (data == null) {// 使用 order-by 信息修改 SelectCommandAdjustSelectCommand(true);// 如果数据过期或从未被获取,则转到数据库SqlDataAdapter adapter = new SqlDataAdapter(SelectCommand, ConnectionString);data = new DataTable();adapter.Fill(data);Page.Cache.Insert(CacheKeyName, data, null,DateTime.Now.AddSeconds(CacheDuration),System.Web.Caching.Cache.NoSlidingExpiration); } // 配置分页的数据源组件 if (_dataSource == null)_dataSource = new PagedDataSource();_dataSource.DataSource = data.DefaultView; _dataSource.AllowPaging = true; _dataSource.PageSize = ItemsPerPage; TotalPages = _dataSource.PageCount;// 确保页面索引有效 ValidatePageIndex(); if (CurrentPageIndex == -1) {_dataSource = null;return; } // 选择要查看的页面 _dataSource.CurrentPageIndex = CurrentPageIndex;}
  控件和请求的缓存项目名称是唯一的。它包括页面的 URL 和控件的 ID。在指定的时间,您都很难下载和缓存要显示的整个数据源。有时,测试环境会使您相信这种解决方案真是太棒了,非常可取。但是测试环境也会误导。数据源的大小非常关键,应用程序的规模越大,数据源的大小越关键。
  在 ASP.NET 中,只有 DataGrid 控件具有内置的分页功能。但是,分页引擎是由相当样板化的代码实现的,只要进行少量的处理,就可以进行推广并用于多个不同的控件。本文介绍的 SqlPager 控件就实现了此目标。它关注下载数据,将数据分成多个页面并通过合控件显示。该控件可以检索并缓存整个数据集,或者仅在 SQL Server 中查询要在选定的页面中显示的几个记录。我说的是 SQL Server,这是另一个重点。SqlPager 只能用于 SQL Server,不能用于通过 OLE DB 或 ODBC 来检索数据。也不能使用它 Oracle 或 DB2 存档。
  要生成真正的通用 SQL 分页程序组件,应该形成数据层,并生成一种能够使用相应的数据提供程序创建连接、命令和适配器的工厂类。此外,要注意为各种 SQL 源设置一个分页引擎是最糟糕的做法。这里介绍的方法只适用于 SQL Server 7.0 和更高版本。TOP 子句在不同的环境下具有不同的特性。使用服务器游标和临时表格,它可适用于较大范围的 DBMS 系统。但那将使代码更为复杂。
Asp组件检测函数

热点推荐

登录注册
触屏版电脑版网站地图