【ASP.NET 2.0中GridView的排序方法】 NET2.0

  摘 要:在ASP.NET 2.0中GridView控件代替了ASP.NET 1.1中的DataGrid控件,该控件通常用于显示数据库查询结果。排序是我们在处理数据时经常会碰到的一类操作,GridView控件支持顺序排序和逆序排序。本文介绍在GridView控件中实现排序功能的三种方法。
  关键词:GridView 排序
  
  在ASP.NET 2.0中可以使用GridView控件自带的AllowSorting属性、AJAX技术或用户自定义方式来实现排序功能。下面我们具体介绍这三种方法。
  
  一、设置AllowSorting属性来实现排序
  
  只要用过GridView控件的就会发现实现排序功能很简单,只需要把该控件的AllowSorting属性设置为True就可以实现了。代码清单1中的页面演示如何对Pubs数据库中的jobs数据表进行排序。
  代码清单1 SortGrid.aspx
  <body>
  <form id=″form1″ runat=″server″>
  <div>
  <asp:GridView ID=″grdJobs″ runat=″Server″ AllowSorting=″true″
  DataSourceID=″SqlDataSource1″></asp:GridView>
  <asp:SqlDataSource ID=″SqlDataSource1″ runat=″server″ ConnectionString=″<%$ ConnectionStrings:pubsConnectionString %>″
  SelectCommand=″SELECT * FROM [jobs]″></asp:SqlDataSource>
  </div>
  </form>
  </body>
  当AllowSorting属性设置为True的时候,GridView的列标题就变成链接。点击列标题,就可以根据选中的列对GridView中的记录进行排序。但是要注意,当显式指定GridView控件的列时,例如绑定列,则需要指定列的SortExpression值才能支持排序,否则,点击此列的标题不会对数据排序。具体实现如代码清单2所示。
  代码清单2
  <body>
  <form id=″form1″ runat=″server″>
  <div>
  <asp:GridView ID=″grdJobs″ runat=″Server″ AllowSorting=″true″
  AutoGenerateColumns=″false″ DataSourceID=″SqlDataSource1″>
  <Columns>
  <asp:BoundFieldDataField=″job_id″HeaderText=″job_id″
  SortExpression=″job_id″/>
  <asp:BoundFieldDataField=″job_desc″ HeaderText=″job_desc″
  SortExpression=″job_desc″/>
  <asp:BoundFieldDataField=″min_lvl″ HeaderText=″min_lvl″
  SortExpression=″min_lvl″/>
  <asp:BoundFieldDataField=″max_lvl″ HeaderText=″max_lvl″
  SortExpression=″max_lvl″/>
  </Columns>
  </asp:GridView>
  <asp:SqlDataSource ID=″SqlDataSource1″ runat=″server″ ConnectionString=″<%$ ConnectionStrings:pubsConnectionString %>″
  SelectCommand=″SELECT * FROM [jobs]″></asp:SqlDataSource>
  </div>
  </form>
  </body>
  
  二、 使用AJAX排序
  
  默认情况下,无论何时在GridView中点击列名时将触发整页的PostBack,使包含此控件的页面都会回发到服务器端。但更多时候我们只想对页面GridView控件中的数据进行排序,而页面中其他内容不动,使用AJAX(Asynchronous JavaScript and XML)技术可以实现该操作。在声明GridView的时候将EnableSortingAndPagingCallbacks属性设置为True就可以启用AJAX。代码清单3中的页面在排序的时候就使用了AJAX。
  代码清单3 AjaxSort.aspx
  <body>
  <form id=″form1″ runat=″server″>
  <div>
   <%=DateTime.Now.ToString() %>
   <asp:GridView ID=″grdJobs″ runat=″Server″ AllowSorting=″true″
  EnableSortingAndPagingCallbacks=″true″
  DataSourceID=″SqlDataSource1″></asp:GridView>
  <asp:SqlDataSource ID=″SqlDataSource1″ runat=″server″ ConnectionString=″<%$ ConnectionStrings:pubsConnectionString %>″
  SelectCommand=″SELECT * FROM [jobs]″></asp:SqlDataSource>
  </div>
  </form>
  </body>
  在代码清单3中,在页面的顶部显示当前时间。但是在GridView中排序数据的时候这个时间并没有改变,这就说明并不是整个页面都被提交给服务器端,只有GridView控件的内容被提交更新。
  
  三、 用户自定义排序界面
  
  多次点击列标题,记录就会在顺序和逆序之间进行切换,但是在列标题上没有一个显示升序降序的图标,这会让最终用户使用时产生迷惑,因为不知道是升序了还是降序了。避免这种情况可以通过响应GridView控件的RowDataBound事件定制排序链接的外观。在为GridView控件绑定到数据源后,呈现每一行记录时都会触发这个事件。代码清单4就用图片来显示数据列的排序状态。
  代码清单4 ImageSorting.aspx
  <body>
  <form id=″form1″ runat=″server″>
  <div>
  <asp:GridView ID=″grdJobs″ runat=″Server″ AllowSorting=″true″
  DataSourceID=″SqlDataSource1″
  OnRowDataBound=″grdJobs_RowDataBound″></asp:GridView>
  <asp:SqlDataSource ID=″SqlDataSource1″ runat=″server″ ConnectionString=″<%$ ConnectionStrings:pubsConnectionString %>″
  SelectCommand=″SELECT * FROM [jobs]″></asp:SqlDataSource>
  </div>
  </form>
  </body>
  当用户点击列标题时,将触发事件protected void grdJobs_RowDataBound(object sender, GridViewRowEventArgs e),其程序代码如下:
  protected void grdJobs_RowDataBound(object sender, GridViewRowEventArgs e)
  {
  if (e.Row.RowType == DataControlRowType.Header)
  {
  foreach (TableCell cell in e.Row.Cells)
  {
  LinkButton SortLink = (LinkButton)cell.Controls;
  if (SortLink.Text == grdJobs.SortExpression)
  {
  if(grdJobs.SortDirection == SortDirection.Ascending)
   SortLink.Text += ″<img src=’asc.gif’ title=’Sort ascending’>″;
   else
  SortLink.Text += ″<img src=’desc.gif" title=’Sort descending’>″;
  }
  }
  }
  }
  在代码清单4中,图片是通过grdJobs_RowDataBound方法添加到标题行的。当前行的RowType属性用来确定当前行是否是标题行,然后,在选中排序列的LinkButton中添加一个HTML<img>标签。
  该页面执行后结果如图1所示。用户从图1中可以看到在job_id列标题旁有个向下的箭头,就很清楚现在GridView控件中的数据是按job_id降序显示的。当用户再次点击job_id列标题时,该标题旁会有个向上的箭头,表示当前是升序显示。
  
  总之,ASP.NET 2.0中的GridView控件的排序功能简单、快捷,而且很容易掌握。上述的三种方法,基本上可以满足用户的需求,用户可以根据自己的需要选择适合自己的方法。
  
  参考文献:
  [1]Stephen Walther,ASP.NET 2.0揭秘.人民邮电出版社,2007年10月.
  [2]江广顺,余松.ASP.NET 2.0+SQL Server热门网络应开开发详解.人民邮电出版社,2007年3月.

推荐访问:排序 方法 ASP NET