本文英文原版:
http://aspnet.4guysfromrolla.com/articles/052202-1.aspx
考察DataGrid控件: Part 4 (上)
导言:
在Part 3,我们考察了相关的事件,例如点击按钮时的情况.再比如在演示页面里,我们允许用户点击"Details"按钮来显示特定行的详细信息,在本节我们考察对数据排序.
准备对DataGrid排序
对DataGrid控件添加排序功能是很简单的,按下面3步走:
1.将DataGrid控件的AllowSorting属性设为True.如果DataGrid的AutoGenerateColumns属性为False,为BoundColumn控件的SortExpression指定值,以便用户以此排序.
2.创建一个排序事件处理器(sort event handler),并在DataGrid的OnSortCommand事件里指定该处理器的名字。
3.构建函数以获取数据
我们一个一个的来.第一步,你需要在DataGrid里指定AllowSorting属性的值,比如:
<asp:DataGrid runat="server" id="id"
AllowSorting="True"
... >
...
</asp:DataGrid>
如果AutoGenerateColumns属性被设置为True(默认值),那么第一步就算完了.(如果设为True,DataGrid就将数据源绑定的列全部显示出来;如果是False,你就要通过BoundColumn来指定需要显示哪些列,具体内容可参考Part 2)。当AutoGenerateColumns属性确实是False时,我们需要确定允许用户依据哪些列来排序。对哪些要排序的列,在对应的BoundColumn里添加SortExpression属性.记住,你必须将SortExpression属性指定为对应的数据库列的名字:
<asp:DataGrid runat="server" id="id"
AutoGenerateColumns="False"
AllowSorting="True">
<Columns>
<asp:BoundColumn DataField="dbField" />
<asp:BoundColumn DataField="dbField2"
SortExpression="dbField2" />
</Columns>
</asp:datagrid>
上述DataGrid代码包含2个列,一个绑定到数据库的dbField列,另一个绑定到dbField2列。后者允许排序而前者不行(因为后者包含SortExpression属性)
创建一个排序处理器
将DataGrid的AllowSorting属性设为True后,每列的表头都会呈现一个超链接,当点击它时,发生页面回传,触发排序事件(sort event).当触发该事件后,我们需要有一个事件处理器来将排好序的数据重新绑定到DataGrid.为了顺序执行上述流程,我们要做2件事情:创建一个排序事件处理器,并且指定DataGrid的排序事件调用该处理器.
首先,当创建处理器时,你必须使用如下的定义:
Sub SortEventHandler(sender as Object, e as DataGridSortCommandEventArgs)
...
End Sub
(当然,你可以为变量sender 和 e任意命名,重要的是明确你的处理器接受2个变量,一个为Object,另一个为DataGridSortCommandEventArgs )
在你的事件处理器里,你可以通过e.SortExpression获取基于排序的列的列名.如果你在一个BoundColumn里明确的指定了SortExpression属性,那么e.SortExpression的值就是SortExpression属性的值;如果没有指定SortExpression属性(比如你将AutoGenerateColumns属性设为True),那么e.SortExpression的值就是你点击的那个列的对应的数据库列的列名。
当创建好排序处理器后,你需要将它与DataGrid控件的排序事件联系起来.这样一来,当触发排序事件时便引发相应的事件处理器.为此,你只需要将DataGrid的OnSortCommand属性设置为你创建的事件处理器的名字,如下:
<asp:DataGrid runat="server" id="id"
AllowSorting="True"
OnSortCommand="NameOfSortEventHandler">
...
</asp:DataGrid>
我们分两种情况来考察,第1个演示页面将AutoGenerateColumns属性设为True(演示页面http://aspnet.4guysfromrolla.com/demos/dgExample10.aspx);另一个设为False(演示页面为http://aspnet.4guysfromrolla.com/demos/dgExample9.aspx).这两个示例都将AllowSorting属性设为True,并对应一个简单的排序事件处理器,该处理器暂时只是指定了一个label控件,并将其Text属性赋值为e.SortExpression.我们注意到DataGrid控件包含在一个服务器端的form(<form runat="server"> ... </form>)——这点很重要,因为在这里我们要处理页面回传的情况.
现在我们需要创建一个函数以获取排好序的数据,创建好后我们只需要简单的调用该函数,传递SortExpression,将结果传递给DataGrid的数据源(DataGrid's DataSource),并且重新绑定到DataGrid(通过DataBind()方法).我们在下半部分来详细探讨.