除了创建一个DAL方法返回特定页的products外,我们需要在BLL里也这样做.和DAL方法一样,BLL的GetProductsPaged 方法带两个整型的输入参数,分别为Start Row Index 和Maximum Rows,并返回在指定范围内的记录.在ProductsBLL 创建这个方法,仅仅调用DAL的GetProductsPaged 就可以了.
[System.ComponentModel.DataObjectMethodAttribute(System.ComponentModel.DataObjectMethodType.Select, false)] public Northwind.ProductsDataTable GetProductsPaged(int startRowIndex, int maximumRows) { return Adapter.GetProductsPaged(startRowIndex, maximumRows); }
你可以为BLL方法的参数取任何名字.但是我们马上会看到,选择用startRowIndex 和maximumRows 会让我们在配置ObjectDataSource 时方便很多.
第四步: 使用自定义分页配置ObjectDataSource
创建完BLL和DAL的方法后,我们可以准备创建一个GridView 来使用自定义分页了.打开PagingAndSorting 文件夹里的EfficientPaging.aspx ,添加一个GridView ,然后用ObjectDataSource 来配置它.在我们以前的教程里,我们通常使用ProductsBLL 类的GetProducts 方法来配置ObjectDataSource .然而这一次,我们使用GetProductsPaged 方法.GetProducts 会返回所有的products而GetProductsPaged 只返回特定的记录.
图 13: 使用ProductsBLL Class类的 GetProductsPaged方法 来配置ObjectDataSource
我们要创建一个只读的GridView,因此在INSERT, UPDATE, 和DELETE 标签下拉列表里选择(None).
接下来ObjectDataSource 向导会让我们选择GetProductsPaged 方法的输入参数startRowIndex 和maximumRows 的值.在source里选择none.
图 14: Sources 里选择None
完成ObjectDataSource 向导后,GridView 会为每个product字段创建一个BoundField 或CheckBoxField .可以随意裁减GridView 的外观.我这里选择的是只显示ProductName, CategoryName, SupplierName, QuantityPerUnit, 和UnitPrice BoundFields.在智能标签里选择支持分页,GridView 和ObjectDataSource 的标记看起来应该和下面差不多:
<asp:GridView runat="server" AutoGenerateColumns="False" DataKeyNames="ProductID" DataSourceID="ObjectDataSource1" AllowPaging="True"> <Columns> <asp:BoundField DataField="ProductName" HeaderText="Product" SortExpression="ProductName" /> <asp:BoundField DataField="CategoryName" HeaderText="Category" ReadOnly="True" SortExpression="CategoryName" /> <asp:BoundField DataField="SupplierName" HeaderText="Supplier" SortExpression="SupplierName" /> <asp:BoundField DataField="QuantityPerUnit" HeaderText="Qty/Unit" SortExpression="QuantityPerUnit" /> <asp:BoundField DataField="UnitPrice" DataFormatString="{0:c}" HeaderText="Price" HtmlEncode="False" SortExpression="UnitPrice" /> </Columns> </asp:GridView> <asp:ObjectDataSource runat="server" OldValuesParameterFormatString="original_{0}" SelectMethod="GetProductsPaged" TypeName="ProductsBLL"> <SelectParameters> <asp:Parameter Type="Int32" /> <asp:Parameter Type="Int32" /> </SelectParameters> </asp:ObjectDataSource>
如果你通过浏览器浏览页面,你会发现看不到GridView .
图 15: GridView 没有被显示
由于在ObjectDataSource 里的GetProductsPaged的startRowIndex和maximumRows的参数都为0,由SQL没有返回任何的记录因此GridView 看不到了.
我们需要将ObjectDataSource 配置成为自定义分页来修补上面的问题.下面的步骤可以完成这个: