在ASP.NET 2.0中操作数据之二十五:大数据量时提高(5)

  1.将ObjectDataSource的 EnablePaging 属性设为true – 这样表示必须传两个参数给SelectMethod方法: 一个指定Start Row Index (StartRowIndexParameterName), 一个指定Maximum Rows (MaximumRowsParameterName).

  2.设置 ObjectDataSource的 StartRowIndexParameterName 和MaximumRowsParameterName 属性– StartRowIndexParameterName 和MaximumRowsParameterName 属性是传给SelecMethod用来自定义分页的输入参数. 默认的参数名为startIndexRow and MaximumRows, 这就是在创建BLL里的GetProductsPaged方法时用这些给参数命名的原因 . 如果你使用了其它的参数名字–比如startIndex和maxRows–你将不得不相应的设置ObjectDataSource的StartRowIndexParameterName和MaximumRowsParameterName(startIndex和maxRows).

  3.设置 ObjectDataSource的 SelectCountMethod Property 为返回分页记录总数的方法的名字(TotalNumberOfProducts)–调用ProductsBLL类的TotalNumberOfProducts方法返回总的记录数 . ObjectDataSource 需要这个信息来正确的显示页面.

  4.从ObjectDataSource的声明里移除startRowIndex and maximumRows <asp:Parameter> 元素的标记– 当通过向导配置 ObjectDataSource 时, Visual Studio 自动为GetProductsPaged方法的参数增加了两个<asp:Parameter> 元素. 设置EnablePaging 为true后, 这些参数会被自动传递;如果在声明代码里保留它们,那么ObjectDataSource会试图传递4个参数给GetProductsPaged和2个参数给TotalNumberOfProducts .如果你没有移除<asp:Parameter> ,当浏览页面的时候你会获得一个象这样的错误信息 : “ObjectDataSource 'ObjectDataSource1' could not find a non-generic method 'TotalNumberOfProducts' that has parameters: startRowIndex, maximumRows.”

做完这些改动后,ObjectDataSource的声明代码看起来应该和下面差不多:

<asp:ObjectDataSource runat="server" OldValuesParameterFormatString="original_{0}" TypeName="ProductsBLL" SelectMethod="GetProductsPaged" EnablePaging="True" SelectCountMethod="TotalNumberOfProducts"> </asp:ObjectDataSource>

注意EnablePaging和SelectCountMethod属性已经被设置了,<asp:Parameter>被移除了.图16是属性窗口.

/uploads/allimg/200612/1K55T005_0.png

图16: 使用自定义分页配置,ObjectDataSource

  完成这些后,浏览页面.你会看到10条product按照字母排序被列出来了.每次翻一页看看.对用户来说现在还看不出来什么差别,因为自定义分页在大数据量的情况下效率才能显示出来.

/uploads/allimg/200612/1K5531O8_0.png

图17: 根据Product的 Name排序的数据的自定义分页

  注意:自定义分页时,ObjectDataSource的SelectCountMethod方法返回的page count值存在GridView的view state里.其它变量–PageIndex,EditIndex,SelectedIndex,DataKeys集合等–都存在control state里.control state和GridView的EnableViewState属性无关.由于PageCount的值在postback期间存在viewstate里,当你的页面上有链到上一页的link时,你需要开启GridView的view state(如果没有这个link,你可以禁用view state).

  点上一页link会引起postback,GridView会更新PageIndex属性.GridView会给PageIndex赋一个小于PageCount的值.如果禁用了view state,PageCount的值在postback时会丢失,PageIndex会被赋一个最大的整型值.然后GridView在根据PageSize乘PageCount来计算starting row index时会发生OverflowException异常.

执行自定义分页和排序

  目前我们自定义分页时使用的排序字段是在创建GetProductsPaged存储过程时写死的.在GridView的智能标签里有一个Enable Sorting的checkbox,不幸的是,在前面的工作里加上排序功能仅仅只能将当前页的记录排序.比如,按照降序查看第一页的数据,第一页的product的顺序回反转.见图18,Carnarvon Tigers 成为第一条记录,而在它之后的71条记录被忽略了.排序时只排了显示在第一页的数据.

/uploads/allimg/200612/1K5543137_0.png

图18: 只有当前页的数据被排序了

  发生这种情况的原因是调用完BLL的GetProductsPaged方法返回数据之后才排序.耳针个方法只返回特定页的记录.为了正确的排序,我们需要将排序表达式传到GetProductsPaged方法里,在返回特定页的数据前进行排序.我们将在后面的教程里完成这个功能.

执行自定义分页和删除

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wjwwxj.html