.NET控件如GridView,DetailsView,FormView都支持分页,而ObjectDataSource和SqlDataSource好像也都支持分页.那么数据源控件是怎样支持分页,数据绑定控件又是怎样支持分页的呢?数据源控件和数据绑定控件之间是什么样的关系呢?
.NET有一个PagedDataSource类,该类不是控件,只是封装了所有数据绑定控件需要的分页属性.并且支持各种数据源返回的结果集.也就是说,如果自定义一个需要支持分页的ServerControl 或者Component, 为了支持各种不同的数据源,则也应该使用PagedServerControl来分页.PagedDataSource支持CustomPaging和ServerPaging.其中GridView是ServerPaging.而DataGrid可以支持这两种方式的分页.这样就能解释数据绑定控件是如何支持分页的.
而数据源控件分页则显得不那么统一.但是本质上来讲无非两种:一种是能够自行分页,例如ObjectDataSource,那么它需要暴露一些属性,如CanPage和CanSort,使PagedDataSource理解它的能力.另外一种是只负责取数据,不处理分页的.如SqlDataSource.它同样需要暴露一些属性来使PagedDataSource理解它的能力.真实情况是数据源控件都有对应的数据源视图.例如,ObjectDataSource有ObjectDataSourceView,SqlDataSource有SqlDataSourceView.而这些View,统统继承于DataSourceView.而DataSourceView有一些虚拟字段.
public virtual bool CanRetrieveTotalRowCount ... { get; }
public virtual bool CanSort ... { get; }
也就是说,虽然各种数据源可以自己来决定是否处理分页.
需要注意的是,数据源控件必须正确设置CanPage,CanRetrieveTotalRowCount属性,因为这些属性将会被数据绑定控件使用,并设置PagedDataSource的属性,指示PagedDataSource来返回数据.简单的,如果数据源已经分页,则PagedDataSource返回所有数据,如果数据源没有分页,则PagedDataSource返回结果集中的部分数据来实现分页.这就是数据源控件和数据绑定控件的分页是如何联系起来的