ASP.NET 2.0中的运行数据42:数据列表和中继器数据排序(一)
介绍
在DataList和Repeater数据分页中,我们学习了如何在DataList中添加分页功能。在ProductsBLL类中,我们创建了一个名为GetProductsAsPagedDataSource的方法,该方法返回一个PagedDataSource对象。当绑定到数据列表或中继器时,它们将只显示请求页面的数据。这项技术类似于GridView、DetailsView和FormView的内置分页功能。
除了分页,GridView还提供了内置的排序功能,而DataList和Repeater则没有。但是,排序功能可以用一点代码来实现。在本章中,我们将学习如何在数据列表和中继器中实现排序功能,我们还将创建一个支持分页和排序的数据列表或中继器。
查看排序。
正如我们在分页和排序报表数据中看到的,GridView提供了排序支持。每个GridView字段都可以有一个关联的排序表达式,该表达式指示数据排序所依据的字段。当GridView的AllowSorting属性设置为true时,每个包含SortExpression属性的GridView字段的标题都显示为一个链接按钮。单击标题时,页面会回发,数据将根据被单击字段的排序表达式进行排序。此外,SortDirection属性指示数据是升序还是降序。
当GridView绑定到数据源控件时,它会将排序表达式和排序方向传递给数据源控件。控件获取数据并根据排序表达式和排序方向对其进行排序。然后将数据返回到GridView。
要在数据列表或中继器中实现该功能,我们需要:
创建一个排序接口,并写下排序字段和方向(升序或降序),以指导ObjectDataSource根据特定字段进行排序。
我们将在第三和第四步中处理上述三个步骤。然后我们将看到如何让DataList或Repeater支持这两个功能(分页和排序)。
步骤:在中继器中显示产品。
在实现排序功能之前,首先创建一个列出所有产品的Repeater。在分页排序数据列表转发器文件夹中打开Sorting.aspx页面。添加中继器并将标识设置为可分类产品。从智能标记创建名为产品数据源的对象数据源。使用ProductsBLL类的GetProducts()方法对其进行配置。从插入、更新、删除标签的下拉列表中选择“(无)”。
图1:创建对象数据源。
图2:在更新、插入、删除标签的下拉列表中选择“(无)”。
与数据列表不同,Visual Studio在绑定到数据源后不会自动为Repeater创建项目模板。由于Repeater控件的智能标记中没有像DataList中那样的“编辑模板”选项,我们需要直接添加声明代码。我们使用与前一章相同的项目模板,其中显示了产品的名称、供应商和类别。
现在,您的Repeater和ObjectDataSource的声明标记应该类似于以下内容:
asp3360 repeater ID=' sortable products ' data source ID=' products data source ' EnableViewState=' False ' runat=' server ' item template H4 ASP : label ID=' product tNameLabel ' runat=' server ' Text=' % # Eval(' product name ' % ')'/asp: label/H4 category : label ID=' CategoryNameLabel ' runat=' server ' Text=' % # Eval(' Category: label)
图3:显示了产品的名称、供应商和类别。
第三步:指示ObjectDataSource对数据进行排序。
为了对Repeater中显示的数据进行排序,我们需要告诉ObjectDataSource数据排序的排序表达式。在ObjectDataSource获取数据之前,首先兴奋的是select事件,它给了我们一个指定排序表达式的机会。选择事件处理程序具有object data source selectingeventargs类型的参数,并且它具有名为Arguments的datasourceselectArguments类型的属性。DataSourceSelectArguments类旨在将与数据相关的请求从数据使用者传递到数据源控件,并且它有一个SortExpression属性。
创建一个选择事件处理程序,并使用以下代码将排序后的信息从ASP.NET页面传输到对象数据源:
受保护的void products data source _ Selecting(对象发送者,对象数据源选择事件参数){ e . arguments . sort expression=sort expression;}排序表达式需要分配给排序字段的名称(例如,“ProductName”)。它没有与排序方向相关的属性,因此如果需要按降序排序,请在sortExpression的值后追加“desc”(如“ProductName DESC”)。
尝试通过硬编码将sortExpression分配给不同的值,并浏览页面。如图4所示,当“ProductName DESC”用作sortExpression时,产品将按照名称的字母顺序进行反向排序。
图4:产品按照名称的字母顺序进行反向排序。
第四步,创建一个排序接口,写下排序表达式和方向。
打开GridView的排序支持,会将每个可排序字段的标题文本转换成一个LinkButton,点击后会进行相应的排序。这种排序对于GridView来说是合理的,因为它的数据以列的形式整齐地显示。对于DataList和Repeater,需要不同的排序接口。数据列表(相对于数据网格)常用的排序接口是使用提供排序字段的下拉列表。我们将在本章中完成这个界面。
在可排序产品中继器上方添加下拉列表,并将标识设置为排序依据。单击“属性”窗口中的“项目”属性,打开列表项集合编辑器。添加列表项,根据产品名称、类别名称和供应商名称字段对数据进行排序。同时添加ListItem,按照倒名顺序对产品进行排序。
列表项的文本属性可以设置为任何值(如“名称”),但值必须设置为数据字段的名称(如“产品名称”)。将字符串“DESC”添加到数据字段名称中,以降序对结果进行排序,例如“产品名称DESC”。
图5:为每个可排序字段添加列表项。
最后,在DropDownList的右侧添加一个按钮。将标识设置为刷新重复,将文本设置为“刷新”。
完成后,DropDownList和Button的声明语法应该类似于以下内容:
asp: DropDownList ID=' SortBy ' Runat=' Server ' asp: istitem Value=' product name ' name/asp: istitem asp: istitem Value=' product name desc ' name(逆序)/asp: istitem asp: istitem Value=' category name ' category/asp: istitem Value=' supplier name ' supplier/asp: istitem/ASP让它使用所选排序列表项的值作为排序表达式,而不是以前的硬编码。受保护的void products data source _ Selecting(对象发送者,对象数据源选择事件参数){ //让对象数据源按所选//排序表达式对结果进行排序。SelectedValue}现在第一次浏览页面时,因为SortBy ListItem的默认值是ProductName,所以产品会根据ProductName字段进行排序。参见图6。选择另一个项目,例如“类别”,然后单击刷新。此时,它将被回发,数据将根据类别名称重新排序,如图7所示。
图6:产品首次按名称排序。
图7:产品现在按类别分类。
注意:单击“刷新”按钮将对数据重新排序,因为Repeater的视图状态是禁用的,所以Repeater每次回发时都会重新绑定到数据源。如果打开中继器的视图状态,则更改下拉列表不会对排序产生任何影响。要解决此问题,您可以为“刷新”按钮的Click事件创建一个事件处理程序,将Repeater重新绑定到数据源(调用Repeater的DataBind()方法)。
写下排序表达式和方向(排序表达式和排序方向)。
如果包含可排序数据列表或Repeater的页面可能有其他与排序无关的回发,我们需要在回发过程中写下排序表达式和方向。例如,我们在本章中修改了Repeater,为每个产品添加了删除按钮。当用户点击删除按钮时,我们会执行一些代码来删除选中的产品,然后将数据绑定到Repeater。如果回发过程中未保存排序信息,显示的数据将恢复到原始排序状态。
在本章中,DropDownList为我们隐式地将排序表达式和方向保存在其视图状态中。如果我们使用不同的排序接口——link button提供不同的排序选项——我们需要在回发过程中写下排序信息。这可以通过在页面的视图状态、querystring或其他状态保存机制中记录已排序的参数来实现。
编程快乐!
作者简介
Scott Mitchell,本系列教程的作者,也是关于ASP/ASP的六本书的作者。NET,是4GuysFromRolla.com的创始人,自1998年以来一直使用微软的网络技术。你可以点击查看所有教程《[翻译]Scott Mitchell 的ASP.NET 2.0数据教程》,希望能帮助你学习ASP.NET。
版权声明:ASP.NET 2.0中的运行数据42:数据列表和中继器数据排序(一)是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。