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事件创建一个事件处理器(在事件在排序流程启动时触发).

祝编程快乐!
 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
【1】项目代码完整且功能都验证ok,确保稳定可靠运行后才上传。欢迎下载使用!在使用过程中,如有问题或建议,请及时私信沟通,帮助解答。 【2】项目主要针对各个计算机相关专业,包括计科、信息安全、数据科学与大数据技术、人工智能、通信、物联网等领域的在校学生、专业教师或企业员工使用。 【3】项目具有较高的学习借鉴价值,不仅适用于小白学习入门进阶。也可作为毕设项目、课程设计、大作业、初期项目立项演示等。 【4】如果基础还行,或热爱钻研,可基于此项目进行二次开发,DIY其他不同功能,欢迎交流学习。 【注意】 项目下载解压后,项目名字和项目路径不要用中文,否则可能会出现解析不了的错误,建议解压重命名为英文名字后再运行!有问题私信沟通,祝顺利! 基于C语言实现智能决策的人机跳棋对战系统源码+报告+详细说明.zip基于C语言实现智能决策的人机跳棋对战系统源码+报告+详细说明.zip基于C语言实现智能决策的人机跳棋对战系统源码+报告+详细说明.zip基于C语言实现智能决策的人机跳棋对战系统源码+报告+详细说明.zip基于C语言实现智能决策的人机跳棋对战系统源码+报告+详细说明.zip基于C语言实现智能决策的人机跳棋对战系统源码+报告+详细说明.zip基于C语言实现智能决策的人机跳棋对战系统源码+报告+详细说明.zip基于C语言实现智能决策的人机跳棋对战系统源码+报告+详细说明.zip基于C语言实现智能决策的人机跳棋对战系统源码+报告+详细说明.zip基于C语言实现智能决策的人机跳棋对战系统源码+报告+详细说明.zip基于C语言实现智能决策的人机跳棋对战系统源码+报告+详细说明.zip基于C语言实现智能决策的人机跳棋对战系统源码+报告+详细说明.zip基于C语言实现智能决策的人机跳棋对战系统源码+报告+详细说明.zip
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值