`

ASP.NET 3.5's ListView and DataPager—Part3:用ListView控件排序数据

阅读更多

本文英文原版及代码下载:
http://aspnet.4guysfromrolla.com/articles/011608-1.aspx

ASP.NET 3.5's ListView and DataPager—Part3:用ListView控件排序数据

导言:

当使用数据源控件绑定数据到一个GridView控件时,要想启用排序功能的话只需要在GridView的智能标签里选"Enable Sorting"即可.启用了之后,GridView控件里每列的表头都将转变成一个LinkButton,当点击时就会引发一个回传,按照该列进行排序后重新绑定到GridView控件.

同样的,要想在ListView控件里启用排序功能也是很简单的,甚至不用你写一行代码.但是我们遇到的主要问题是,与GridView控件不同,ListView控件里没有没有预先定义好的列(pre-defined columns).因此我们要自己定义并贯彻排序界面(sorting interface),完成这些工作之后,ListView控件就可以在内部处理排序逻辑而不用我们写代码了.当然,在一些更高级的场合下,我们需要手动排序或者通过编程的方式指定在内部排序数据要依据的排序表达式.在排序之前,ListView控件将先触发Sorting事件处理器(Sorting event handler),在该事件处理器里我们可以添加任何与排序相关的逻辑.此外,还可以通过Sort method来通过编程调用ListView控件的排序逻辑.

在本文我们将考察如何在ListView控件里启用排序功能。我们首先考察ListView的排序函数(sorting functionality),接下来我们在考察如何在更高级的场合以编程的方式通过Sort method调用排序逻辑.

Sorting Basics

ListView排序所用到的核心概念与其它View Web controls,比如 GridView, DetailsView,和FormView等是一样的.作为启动器(starters),ListView控件有一个Sort(sortExpression, sortDirection) method,参数为一个string类型的sortExpression以及一个SortDirection enumeration(值为Ascending 和 Descending),调用该Sort method将触发ListView控件的Sorting event.

如果ListView是绑定到一个数据源控件(比如SqlDataSource或ObjectDataSource ),那么数据源控件将负责对数据进行排序,然后这些排序后的数据再重新绑定到ListView控件.简单的说,如果你使用的是数据源控件,那么不需要我们写一行代码,ListView就可以执行排序——所有的工作由ListView以及数据源控件自动的处理.

如果ListView是通过编程的方式绑定数据的——也就是说我们写代码检索数据再指定ListView控件的DataSource属性,再调用ListView的DataBind()方法——那么我们就要自己负责对数据进行排序再将排好序的数据重新绑定到ListView控件.为此,我们需要为ListView的Sorting event创建一个事件处理器,在该事件处理器里我们将按指定的排序来检索数据并重新绑定到ListView.我们将在本文后面考察如何创建一个Sorting事件处理器(实际上,在更高级的排序场合才这样做。在此,我们的示例代码使用的是一个数据源控件)

为了开启ListView的排序工作流程(sorting workflow)有2个办法,一是调用Sort method;二是在ListView控件的LayoutTemplate模板里添加一个LinkButton, Button, 或ImageButton按钮,当点击按钮时将触发回传并开启排序工作流程.为此,LinkButton, Button, 或ImageButton按钮的CommandName属性必须设置为"Sort",而CommandArgument属性要设置成作为排序依据的那个数据列(data field).

一个简单的,随意排序的示例

为演示如何使用ListView控件内置的排序机制,我们来看一个例子(该示例可以在本文结尾处下载到).我们将Part1里的例子进行扩展以包含一个排序界面.具体来说,我们添加2个排序选项:按ProductName和UnitPrice进行排序.为此,仅仅需要在ListView控件的LayoutTemplate模板里添加2个LinkButtons (或Buttons 或ImageButtons都行),并对CommandName 和 CommandArgument属性赋相应的值.

<asp:ListView ID="ProductList" runat="server" DataSourceID="ProductDataSource">
<LayoutTemplate>
<h3>Product Listing</h3>
[<asp:LinkButton runat="server" ID="SortByName" CommandName="Sort"
CommandArgument="ProductName">Sort by Name</asp:LinkButton>]
| [<asp:LinkButton runat="server" ID="SortByPrice" CommandName="Sort"
CommandArgument="UnitPrice">Sort by Price</asp:LinkButton>]

<blockquote>
<asp:PlaceHolder runat="server" ID="itemPlaceholder"></asp:PlaceHolder>
</blockquote>
</LayoutTemplate>

...
</asp:ListView>

(注意:为简化起见,我省略掉了ListView的大部分声明代码,而将注意力集中到这2个用来排序的LinkButtons.此外我们也省略掉了绑定到该ListView控件的AccessDataSource控件)

请注意,这2个排序按钮的CommandName属性都设置为Sort,而CommandArgument属性则设置为相应的数据列的名字.当点击其中一个按钮时,页面回传,ListView控件将自动的调用其Sort method方法,并将LinkButton的 CommandArgument属性值传入作为排序表达式(sort expression).而排序方向则由一个内部变量控制,当用相同的排序表达式连续2次进行排序时,排序方向将互相转换.因此,如果访问用户连续2次点击"Sort by Price"链接,第一次点击时产品将按升序进行排序(也就是从最便宜到最贵的方向),第二次点击时排序方向将变为按降序进行排序.

下面的2个截屏显示的是实际点击排序LinkButtons的情形,第一个截屏是第一次点击"Sort by Price" 时的情况,产品按升序进行排列.


图1
第二个截屏显示的是再次点击的情形,这次是按降序排列的.


图2


通过Sort Method来排序

在前面的示例我们考察了当用户点击一个LinkButton, Button, 或ImageButton控件时如何让ListView做出响应以排序数据.不过在某些情况下,我们需要以编程的方式启动ListView的排序工作流程.比如,当页面初次加载时我们想排序数据,或者将某些用户界面元素呈现为某种样式,那么我们就想对结果排序了.为此,我们可以调用ListView的Sort method方法并传入sort expression以及排序方向.

为演示该方法,我们在上面的示例里添加一个Button Web control,当点击时按CategoryName列对结果进行排序.我们仅仅需要添加一个Button Web control,创建它的Click event handler,在该event handler 里我们调用ListView控件的Sort method,传入"CategoryName"作为sort expression ,排序方向为SortDirection.Ascending,要做的就这些了.

Protected Sub SortByCallingSortMethodButton_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles

SortByCallingSortMethodButton.Click
'Sort the ListView by the CategoryName field in ascending order
ProductList.Sort("CategoryName", SortDirection.Ascending)
End Sub

点击该按钮将导致页面回传,并调用Sort method,该方法又启动排序工作流程.效果就好像我们在LayoutTemplate模板里添加了一个LinkButton,并分别设置其CommandName和CommandArgument属性为Sort 和 "CategoryName"一样.


图3


为ListView的Sorting Event事件创建一个Event Handler

在某些情况下,我们需要在ListView的排序工作流程里执行代码,为此我们可以为ListView的Sorting event事件创建一个事件处理器,当启动排序工作流程时就会触发该事件.如果ListView的数据是通过编程的方式来进行绑定的,那么我们就需要创建一个Sorting event handler来对数据重新排序并重新绑定到ListView数据.即使我们声明使用的是数据源控件来绑定数据的,我们也可以在排序工作流程里执行自定义排序逻辑

.在本文下载代码里,包含了一个示例,它可以“记住”最近5次运用的排序依据并将这5个排序依据显示在页面上的一系列LinkButton控件上.当点击其中一个LinkButtons时将根据对应的排序依据再次执行排序.为实现该功能,我需要为Sorting event事件创建一个event handler,这样一来我们就可以将刚才应用的sort expression和排序方向记录下来.

每一条用户刚刚应用过的排序依据都将由一个名为SortHistory的object对象进行登记记录,该对象实际上是我在App_Code文件夹里创建的一个类,该类有SortExpression 和 SortDirection属性且都是只读的,该类将SortExpression和SortDirection属性以string的形式返回,此外该类还将返回一个格式化字符串(formatted string),以表明我们的意图.打个比方,如果SortExpression 和 SortDirection属性的值分别为 "CategoryName" 和SortDirection.Descending,那么该格式化字符串将返回一个更为友好、明了的输出: "Category (in descending order)".

同时在App_Code文件夹我还创建了一个SortHistoryQueue object对象,它最多可以存储5个SortHistory对象.我们把一个SortHistoryQueue的实例存储在一个Session里,那么当页面回传时,针对某个用户的排序依据就不会丢失,且可以跨页面传递.

除了使用Sorting event handler外,演示代码里还使用了Sort method。就象我在前面提过的那样,用户最近的5个排序依据展示在一系列的LinkButtons控件上,这是用一个Repeater控件来实现的.点击一个LinkButton控件将引发回传并触发Repeater的ItemCommand event事件.我为该事件创建了一个事件处理器,在该事件处理器了调用ListView控件的Sort method方法,排序依据就是点击的那个LinkButtons控件对应的排序依据.

下面的截屏显示的是实际运用的情况,第一个图输出的是最近使用的5个排序依据.


图4
第二图是点击了"Sort by Name"按钮后的情况,注意最上面那个LinkButton按钮变成了"Name (in ascending order)"(当然,实际上是按ProductName进行升序排序的)


图5


结语:

在本文我们考察了如何在一个ListView控件里排序数据.与GridView, DetailsView,和FormView控件一样,不用写一行代码我们就可以对ListView的数据排序。正如我们在第一个示例里看到的那样,我们所要做的就是创建一个sorting interface:添加Buttons, LinkButtons, 或ImageButtons控件,并设置恰当的CommandName 和 CommandArgument属性.点击这些按钮后将产生页面回传,并触发ListView的排序工作流程,

当然我们也可以显式的调用Sort method, 传入相关的sort expression和排序方向.在某些情况下我们需要手动排序,或执行其它与排序相关的逻辑. 在这种情况下,只需要为ListView控件的Sorting event事件创建一个事件处理器(在事件在排序流程启动时触发).

祝编程快乐!

分享到:
评论

相关推荐

    Professional ASP.NET 3.5 SP1 Edition: In C# and VB(part1)

    While ASP.NET 3.5 boasts server controls like the ListView and the incredibly flexible GridView, it also includes advancements in AJAX technology combined with JavaScript® debugging features in ...

    ASP.NET 3.5 揭秘(ASP.NET 3.5 Unleashed)

    书中详细介绍了微软LINQ to SQL数据库查询技术,以及ListView和DataPager两种新的数据访问控件等技术。本书作者Stephen Walther是ASP界的名人,是微软公司的ASP.NET MVP,荣获微软“软件传奇人物”称号(微软技术...

    ASP.NET 3.5 Unleashed.pdf

    书中详细介绍了微软LINQ to SQL数据库查询技术,以及ListView和DataPager两种新的数据访问控件等技术。本书作者Stephen Walther是ASP界的名人,是微软公司的ASP.NET MVP,荣获微软“软件传奇人物”称号(微软技术...

    ASP.NET 3.5 ListView控件例子

    Some ASP.NET 3.5 ListView Control Examples

    ASP.NET 3.5 揭秘(卷1)中文版3

    书中详细介绍了微软LINQ to SQL数据库查询技术,以及ListView和DataPager两种新的数据访问控件等技术。本书作者Stephen Walther是ASP界的名人,是微软公司的ASP.NET MVP,荣获微软“软件传奇人物”称号(微软技术...

    ASP.NET 3.5 ListViewDataPager实例

    ListView,DataPager是ASP.net 3.5的新控件,给些例子!

    ASP.NET3.5揭秘_卷一(Code+Pdf).7z.004

    书中详细介绍了微软LINQ to SQL数据库查询技术,以及ListView和DataPager两种新的数据访问控件等技术。本书作者Stephen Walther是ASP界的名人,是微软公司的ASP.NET MVP,荣获微软“软件传奇人物”称号(微软技术...

    [PetShop] PetShop for .Net 3.5 源代码

    基于 .NET Framework 3.5 的 Petshop,使用 LINQ to SQL 改进数据访问层,使用 WCF 来提供RSS,并在 UI 层上做一些改进,如使用 ASP.NET AJAX,ListView 控件等; ☆ 文件清单:☆ PetShop for .Net 3.5 (Source ...

    ASP.NET3.5揭秘_卷一(Code+Pdf).7z.003

    书中详细介绍了微软LINQ to SQL数据库查询技术,以及ListView和DataPager两种新的数据访问控件等技术。本书作者Stephen Walther是ASP界的名人,是微软公司的ASP.NET MVP,荣获微软“软件传奇人物”称号(微软技术...

    ASP.NET3.5揭秘_卷一(Code+Pdf).7z.002

    书中详细介绍了微软LINQ to SQL数据库查询技术,以及ListView和DataPager两种新的数据访问控件等技术。本书作者Stephen Walther是ASP界的名人,是微软公司的ASP.NET MVP,荣获微软“软件传奇人物”称号(微软技术...

    ASP.NET3.5揭秘_卷一(Code+Pdf).7z.008

    书中详细介绍了微软LINQ to SQL数据库查询技术,以及ListView和DataPager两种新的数据访问控件等技术。本书作者Stephen Walther是ASP界的名人,是微软公司的ASP.NET MVP,荣获微软“软件传奇人物”称号(微软技术...

    ASP.NET3.5揭秘_卷一(Code+Pdf).7z.001

    书中详细介绍了微软LINQ to SQL数据库查询技术,以及ListView和DataPager两种新的数据访问控件等技术。本书作者Stephen Walther是ASP界的名人,是微软公司的ASP.NET MVP,荣获微软“软件传奇人物”称号(微软技术...

    ASP.NET3.5揭秘_卷一(Code+Pdf).7z.006

    书中详细介绍了微软LINQ to SQL数据库查询技术,以及ListView和DataPager两种新的数据访问控件等技术。本书作者Stephen Walther是ASP界的名人,是微软公司的ASP.NET MVP,荣获微软“软件传奇人物”称号(微软技术...

    ASP.NET3.5揭秘_卷一(Code+Pdf).7z.007

    书中详细介绍了微软LINQ to SQL数据库查询技术,以及ListView和DataPager两种新的数据访问控件等技术。本书作者Stephen Walther是ASP界的名人,是微软公司的ASP.NET MVP,荣获微软“软件传奇人物”称号(微软技术...

    ASP.NET3.5揭秘part3

    与此同时,作者添加了大量新内容,涵盖ASP.NET 3.5引入的所有新特性,包括使用LINQ to SQL更轻松地构建数据驱动的网站,使用新的数据访问控件ListView和DataPager开发更加灵活的用户体验,以及整整三章全面剖析 ASP...

    ASP.NET3.5揭秘_卷一(Code+Pdf).7z.005

    书中详细介绍了微软LINQ to SQL数据库查询技术,以及ListView和DataPager两种新的数据访问控件等技术。本书作者Stephen Walther是ASP界的名人,是微软公司的ASP.NET MVP,荣获微软“软件传奇人物”称号(微软技术...

    ASP.NET3.5揭秘_卷一(Code+Pdf).7z.009

    书中详细介绍了微软LINQ to SQL数据库查询技术,以及ListView和DataPager两种新的数据访问控件等技术。本书作者Stephen Walther是ASP界的名人,是微软公司的ASP.NET MVP,荣获微软“软件传奇人物”称号(微软技术...

    ASP.NET 3.5揭秘(卷1)源代码

    书中详细介绍了微软LINQ to SQL数据库查询技术,以及ListView和DataPager两种新的数据访问控件等技术。本书作者Stephen Walther是ASP界的名人,是微软公司的ASP.NET MVP,荣获微软“软件传奇人物”称号(微软技术...

    ASP.NET3.5揭秘part2

    与此同时,作者添加了大量新内容,涵盖ASP.NET 3.5引入的所有新特性,包括使用LINQ to SQL更轻松地构建数据驱动的网站,使用新的数据访问控件ListView和DataPager开发更加灵活的用户体验,以及整整三章全面剖析 ASP...

Global site tag (gtag.js) - Google Analytics