考察DataGrid控件: Part 4 (下)

本文介绍ASP.NET中DataGrid控件的排序实现方法,包括设置AllowSorting属性、创建排序事件处理器及编写排序函数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


本文英文原版:

http://aspnet.4guysfromrolla.com/articles/052202-1.2.aspx#postadlink

考察DataGrid控件: Part 4 (下)

 

    在上半部分我们考察了前2步:将DataGrid控件的AllowSorting属性设置为True,并创建一个排序事件处理器.在本节我们看如何获取按指定排序的数据.

 

构建一个函数获取数据并排序

最理想的情况是我们构建某个函数,该函数根据传入的排序表达式(sort expression)来对记录排序.然后要么直接将这些数据绑定到DataGrid;要么返回一个DataReader对象,再将DataReader对象绑定到DataGrid.假定我们已经创建了这样的一个函数,我们叫它BindData,它接受一个排序表达式作为输入参数,返回排好序的数据并绑定到DataGrid。在排序事件处理器里包含该函数,如下:

Sub SortData(sender as Object, e as DataGridSortCommandEventArgs)
   BindData(e.SortExpression)
End Sub


现在的问题是创建该函数!该函数的主体代码取决于我们使用的数据源以及如何排序.在本前面的示例里我们使用存储过程来获取最常见的10个FAQs.但在这里我不想修改该存储过程,而使用SQL语句,因此,BindData函数看起来应该像下面这样:

Sub BindData(sortExpr as String)
  '1. Create a connection
  Dim myConnection as New _
       SqlConnection(ConfigurationSettings.AppSettings("connStr"))

  '2. Create the command object, passing in the SQL string
  Dim strSQL as String = "SELECT TOP 10 FAQID, F.Description, " & _
        "F.ViewCount, F.FAQCategoryID, SubmittedByName, " & _
        "SubmittedByEmail, DateEntered, CatName = C.Name " & _
        "FROM tblFAQ F (nolock)  " & _
        "INNER JOIN tblFAQCategory C (nolock) ON  " & _
           "  C.FAQCategoryID = F.FAQCategoryID  " & _
        "WHERE Approved=1 ORDER BY " & sortExpr

  Dim myCommand as New SqlCommand(strSQL, myConnection)

  'Set the datagrid's datasource to the datareader and databind
  myConnection.Open()
  dgPopularFAQs.DataSource = _
              myCommand.ExecuteReader(CommandBehavior.CloseConnection)
  dgPopularFAQs.DataBind() 
End Sub


注意,在SQL查询的ORDER BY 子句我们用到了sortExp变量.这是因为表tblFAQ和表 tblFAQCategory有很多相同列名的列,当指定排序依据时我们必须根据别名或说明来排序,比如使用F.ViewCount DESC,这意味着BoundColumns里的SortExpressions相应地改成这个样子:

<asp:DataGrid runat="server" id="dgPopularFAQs"
                AllowSorting="True"
                OnSortCommand="SortResults">
  ... 
  <Columns>
    ...
    <asp:BoundColumn DataField="ViewCount"
           <b>SortExpression="F.ViewCount DESC" </b>
           DataFormatString="{0:#,###}"
           HeaderText="Views" ItemStyle-HorizontalAlign="Center" />
    ...
    <asp:BoundColumn DataField="DateEntered"
            SortExpression="DateEntered DESC"
            HeaderText="Date Added" DataFormatString="{0:MM-dd-yyyy}"/>
  </Columns>
</asp:datagrid>


最后,当页面首次登录时我们需要基于某个默认值来排序,在此我选择依ViewCount的降序来排. 在Page_Load事件处理器里我们需要调用BindData("F.ViewCount DESC")方法,当然仅限于首次登录。我们应该认识到,当用户在页面里选择某个特定的列来排序时(这将产生页面回传),我们就不应在Page_Load事件处理器里绑定数据了.

完整的代码和演示页面见http://aspnet.4guysfromrolla.com/demos/dgExample11.aspx


另外,关于使用存储过程来排序的情况请参阅文章《Dynamic ORDER BY Statements in Stored Procedures》(http://www.4guysfromrolla.com/webtech/010704-1.shtml


结语:
   对DataGrid的内容进行排序是很简单的,包含3个步骤:设置AllowSorting属性;创建一个排序事件处理器;创建一个方法来对数据动态的排序.

 

祝编程快乐!

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值