// Clear out all of the items in the DropDownList PageList.Items.Clear(); // Add a ListItem for each page for (int i = 0; i < Products.PageCount; i++) { // Add the new ListItem ListItem pageListItem = new ListItem(string.Concat("Page ", i + 1), i.ToString()); PageList.Items.Add(pageListItem); // select the current item, if needed if (i == Products.PageIndex) pageListItem.Selected = true; }
这段代码首先清楚了PageList DropDownList中所有的项。既然我们不能预料到页面数会不会改变,看上去这个操作可能有些多余。但是其它用户可能会并发使用系统来从Products表中添加或者移除记录。这样的插入或者删除操作可能会改变数据的页数。
接着,我们重新创建页数并选择GridView PageIndex作为默认。我们循环0到PageCount – 1进行新增每一个ListItem,如果当前循环所以等于GridView的PageIndex属性的话,我们把这个项的Selected属性设置为true。
最后,我们需要为DropDownList的SelectedIndexChanged事件创建一个事件处理器。当用户每次选择了一个不同页面的时候触发,我们只需要双击设计器中的DropDownList来创建事件处理器,然后添加下面代码:
protected void PageList_SelectedIndexChanged(object sender, EventArgs e) { // Jump to the specified page Products.PageIndex = Convert.ToInt32(PageList.SelectedValue); }
如图11显示,只不过是改变GridView的PageIndex属性并重新绑定GridView。在GridView的DataBound事件处理器中,相应的DropDownList ListItem被选择。
图11:用户选择下拉列表Page 6项后就能切换到第六页
Step 5:添加双向排序支持
增加双向排序的支持和增加分页支持一样简单-只需要选择GridView 智能标签的Enable Sorting选项(它会设置GridView的AllowSorting property 属性为true)。这样,GridView每一个字段的标题都会显示为LinkButtons,点击后页面就会回发,所点击列的所有数据就会以升序显示。再次点击同一个LinkButton就能以降序显示。
注意:如果你使用一个自定义的数据访问层而不是强类型DataSet的话,你可能找不到GridView的Enable Sorting选项。因为ADO.NET DataTable提供了Sort方法使用指定标准对DataTable的DataRow进行排序,因此强类型DataSet提供了排序支持。
如果你的DAL不返回支持排序的对象,我们就需要配置ObjectDataSource来实现对业务逻辑层返回数据的排序。我们将会在将来的教程中研究如何排序业务逻辑或者数据访问层中的数据。
排序的LinkButton以HTML链接的形式呈现,当前的颜色(未访问过未蓝色访问过为暗红色)和标题的背景色有了冲突,让我们设置所有标题中的链接在访问过和未访问的情况下都为白色。我们通过在Styles.css中添加如下的类来实现:
.HeaderStyle a, .HeaderStyle a:visited { color: White; }
这段代码表示,使用HeaderStyle类中的所有链接都以白色进行显示。
在定义了CSS后,页面浏览器中的效果如图12,图1也显示了Price字段标题上的链接被点击后的效果。
图12:结果根据UnitPrice以正序形式进行排序
研究排序工作方式
所有的GridView字段-BoundField, CheckBoxField, TemplateField等等-都有SortExpression属性指示当标题上的排序链接点击后的排序方式。GridView同样也有一个SortExpression属性。当排序LinkButton被点击后,GridView把它的SortExpression设置为该字段的SortExpression,接着,数据就重新按照GridView的SortExpression属性以一定次序从ObjectDataSource返回。下面列出了用户排序时GridView具体的流程步骤:
1.GridView的Sorting event 触发
2.GridView的SortExpression 属性设置为点击LinkButton所在字段的SortExpression
3.ObjectDataSource重新从BLL中获取所有数据并根据GridView的 SortExpression来排序数据
4.GridView的PageIndex被置0,也就是用户转到了第一页数据(假设分页是开启的)
5.GridView的Sorted 事件触发
和默认分页方式一样,默认排序方式从BLL中获取所有数据进行排序。在未分页或者使用默认方式分页的情况下,我们没有办法改善性能(除了缓存数据)。然而在后续教程中,我们能通过自定义分页来使排序更有效率。