欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

考察DataGrid控件: Part 4 (下) ASPSQLSQL ServerF#编程 

程序员文章站 2022-07-16 13:12:46
...


本文英文原版:

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属性;创建一个排序事件处理器;创建一个方法来对数据动态的排序.

祝编程快乐!