`
wsql
  • 浏览: 11776374 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
文章分类
社区版块
存档分类
最新评论

asp.net2.0数据访问(4)-数据基本显示-使用objectdatasource显示数据

 
阅读更多

本文将介绍不用写任何代码从BLL层中获取数据,并绑定。
一、介绍
应用程序架构和网站页面布局完成后,将开始学习通用的数据显示的功能。在前几篇文章中,我们已经学习了,如何通过编码,从DAL或BLL获取数据并绑定到页面的Web控件中。语法是这样的:绑定控件的DataSource属性,然后调用DataBind()方法。这通常是asp.net1.x的做法,当然也可以在asp.net2.0继续沿用。然而,在asp.net2.0中提供了一组新的控件--数据源控件。使用这些控件,可以很轻松将从BLL获取的数据绑定到页面,而不用写任何代码。

asp.net2.0内嵌了五个数据源控件--SqlDataSource,AccessDataSource,ObjectDataSource,XmlDataSource和SiteMapDataSource。如果需要,您也可以自定义数据源控件。基于我们的应用程序的架构,我们将使用ObjectDataSource来访问BLL中的类。


ObjectDataSource作为访问对象的代理。通过定义底层的对象来配置ObjectDataSource,并将对象的Select,Insert,Update和Delete方法和ObjectDataSource的方法一一对应起来。随后,可以绑定该ObjectDataSource控件到数据控件,如:GridView,DetailsView,RadioButtonList和DropDownList等等。在整个页面的生存周期中,数据控件将通过触发ObjectDataSource的Select方法完成数据的绑定;如果数据控件支持插入、更新和删除,将会分别调用ObjectDataSource的Insert、Update和Delete方法。然后再由ObjectDataSource调用底层对象的相应方法,如下图所示:


ObjectDataSource可以通过触发不同的方法来插入、更新或删除。本文将主要关注显示数据,后续的文章将介绍如何应用ObjectDataSource和数据控件来修改数据。

步骤1:添加、配置ObjectDataSource控件
打开BasicReporting文件夹中的SimpleDisplay.aspx页面,切换到设计视图。从工具箱拖拽一个ObjectDataSource控件到空白区。由于没有任何配置,所以控件呈灰色。可以通过调用特定对象的特定方法来访问数据。ObjectDataSource的返回值可以通过一个数据控件显示。
注意:也可以先添加数据控件到页面,然后通过选择下拉列表中的<New data source>来显示数据。

单击ObjectDataSource的Configure Data Source来指定ObjectDataSource对应的底层对象并将其方法一一对应起来。


打开配置数据源向导后,首先,确定ObjectDataSource关联的对象,如果选中“Show only data components”,下拉列表中就只罗列被DataObject特性(attribute)修饰的类。当前环境下,只包括在强类型数据集中的TableAdapters和在上文中创建的BLL中的类。您也可以不选中来查看所有对象。
我们选择ProductBLL类。


接下来选择ObjectDataSource要触发的方法。默认是获取数据的方法。我们可以看到GetProductByProductID,GetProducts,GetProductsByCategoryID和GetProductsBySupplierID,选择GetProducts方法,单击完成。


手动配置ObjectDataSource
向导提供了一种快速的指定对象和关联两者方法的途径。当然,也可以通过其属性配置ObjectDataSource(可以直接通过属性窗口,也可以用标识语言)。只需要指定ObjectDataSource的TypeName属性到相关的类,并指定SelectMethod属性来触发相应的方法获取数据。
<asp:ObjectDataSource ID="ObjectDataSource1" runat="server"
SelectMethod="GetProducts" TypeName="ProductsBLL">
</asp:ObjectDataSource

相对手动配置ObjectDataSource,您可能觉得使用向导会快很多倍,因为向导只罗列了用于创建的类。如果您想将.net framework中的类绑定到ObjectDataSource,比如绑定成员权限的类,来访问用户的帐户信息,又或者表示路径的类,来访问文件系统的信息,您就需要手动配置ObjectDataSource的属性了。

步骤2:添加一个数据控件并绑定到ObjectDataSource
等ObjectDataSource添加并配置后,接着添加一个数据控件用来接受ObjectDataSource方法返回的数据。任何的数据控件都可以绑定到ObjectDataSource,下面展示了绑定ObjectDataSource的数据到:GridView,DetailsView,FormView。
绑定ObjectDataSource到GirdView
在页面上(SimpleDisplay.aspx)添加一个GridView,选择其数据源为步骤1中创建的那个。这将会自动为ObjectDataSource的select方法返回的每一个属性创建一个绑定列。


您可以自定义,排序或者移除GridView绑定列中的字段。


花一定的事件修改GirdView中自动生成的绑定列,移除:ProductID,SupplierID,CategoryID,QuantityPerUnit,UnitsInStock,UnitsOnOrder和RecordLevel。只需要单击红叉号就可以了。通过上下箭头按钮,调整CategoryName和SupplierName到UnitPrice之前,然后设置Price列的HtmlEncode属性为false,并DataFormateString为“{0:C}”以使其按货币格式显示,设置Price的水平对齐为right和Discontinued对齐方式为居中(在ItemStyle/HorizontalAlign属性中设置)。
<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False"
DataKeyNames="ProductID" DataSourceID="ObjectDataSource1"
EnableViewState="False">
<Columns>
<asp:BoundField DataField="ProductName"
HeaderText="Product" SortExpression="ProductName" />
<asp:BoundField DataField="CategoryName"
HeaderText="Category" ReadOnly="True"
SortExpression="CategoryName" />
<asp:BoundField DataField="SupplierName"
HeaderText="Supplier" ReadOnly="True"
SortExpression="SupplierName" />
<asp:BoundField DataField="UnitPrice"
DataFormatString="{0:c}" HeaderText="Price"
HtmlEncode="False" SortExpression="UnitPrice">
<ItemStyle HorizontalAlign="Right" />
</asp:BoundField>
<asp:CheckBoxField DataField="Discontinued"
HeaderText="Discontinued" SortExpression="Discontinued">
<ItemStyle HorizontalAlign="Center" />
</asp:CheckBoxField>
</Columns>
</asp:GridView>

设置统一外观
我们这个系列的课程,尽量不用任何的控件级别的样式设置,而用一个外部的层叠样式表来定义,如果需要的话。文件Styles.css包含了DataWebControlStyle,HeaderStyle,RowStyle和AlternatingRowStyle等CSS类来修饰数据控件的外观。我们可以设置GridView的CssClass属性为DataWebControlStyle,也可以分别设置其HeaderStyle,RowStyle和AlternatingRowStyle属性的CssClass属性。

一个更好的管理方式就是为这些数据控件的使用一个主题。一个主题就是控件级别的属性设置,图片和CSS类的集合,这些集合被应用到网站的页面中以提供一个提供的外观。

我们创建的主题不包含任何的图片和CSS文件,但包含两个皮肤。一个皮肤就是一个文件定义了web控件的默认属性。特定的我们为GridView和DetailsView定义一个皮肤文件,以指示CssClass相关的属性。

通过右击项目名,单击添加新项,选择Skin文件模板,命名为GridView.skin。


皮肤文件将会被保存成一个主题放置在App_Themes文件夹中。由于我们没有这样一个文件夹,当添加第一个skin文件时,vs为自动为我们创建一个。只需单击“是”就可以了。


这样就会创建一个新的主题。


将GridView主题充命名为DataWebControls,接下来在GridView.skin文件中输入以下标识代码:
<asp:GridView runat="server" CssClass="DataWebControlStyle">
<AlternatingRowStyle CssClass="AlternatingRowStyle" />
<RowStyle CssClass="RowStyle" />
<HeaderStyle CssClass="HeaderStyle" />
</asp:GridView>

这样就使用DataWebControls主题为任何页面中的任何GridView的默认属性指定了相关的CssClass。添加另外一个Skin,命名为DetailsView.skin。同样放在DataWebControls主题中。
<asp:DetailsView runat="server" CssClass="DataWebControlStyle">
<AlternatingRowStyle CssClass="AlternatingRowStyle" />
<RowStyle CssClass="RowStyle" />
<FieldHeaderStyle CssClass="HeaderStyle" />
</asp:DetailsView>

定义完主题后,然后就是应用主题到页面了。一个主题基于页来引用,或者说应用到站点的所有页中。通过配置Web.config的<system.web>节来应用主题到网站中的所有页:
<pages styleSheetTheme="DataWebControls" />

这就是所有关于主题(theme)的全部了。在主题中通过styleSheetTheme设置的属性不能被在控件级别设置的属性所覆盖。为了说明主题设置要优先于控件级别的设置,使用theme属性代替styleSheetTheme。唯一的不足就是无法在vs的设计视图中通过theme属性使用theme设置。


在DetailsView中一次显示一条记录
GridView控件显示绑定数据源中的所有的记录。这是比较耗时的,如果您只想一次显示一条记录的时候。然而,DetailsView提供了这个功能,它可以通过<table>的形式显示两列,每一行显示了绑定到控件的一个属性或列。您可以这样认为,DetailsView就是只显示一行记录的GridView翻转了90度。

添加一个DetailsView控件到页面,并绑定其ObjectDataSource.和GridView一样,将绑定从ObjectDataSource的Select方法返回的每一个属性到DetailsView的绑定列。唯一的不同是:DetailsView的绑定列是水平布局的,而不是垂直布局的(GridView)。


和GridView一样,也可以自定义DetailsView的绑定列来显示特定的数据。下图显示了自定义的绑定列和应用样式配置后的外观,非常相象于GridView。


你可能发现了DetailsView只显示了数据源中的第一条记录。我们可以设置DetailsView的分页,使得您可以一次一条记录预览数据源中的所有记录。通过设置DetailsView的智能标签来设置。


我们将会在将来的课程中详细讲解分页的一些细节。

一种更加灵活的一次显示一条记录的布局
DetailsView的显示方式可能有点古板。我们可能需要一种更加灵活的显示数据的方式。比如,相对于只是简单的显示产品的名字,价格,类别,提供商和打折信息外,我们可能想让商品的名字和价格以<h4>样式显示,也可能让类别和提供商等信息以较小的字体显示在商品名称和价格下面。因为我们有时候可能不太关注这些信息。

通过FormView就可以实现上述灵活的显示功能。但相对于GridView和DetailsView使用列,FormView使用模板,在模板里面可以自由组合web控件,静态的html,甚至可以写一些数据绑定的代码。如果您对asp.net1.x中的repeater比较熟悉,你可以把FormView想象成一个只显示一条记录的Repeater。

添加一个FormView到SimpleDisplay.aspx,默认情况下,呈灰色显示,告诉我们至少要设置控件的ItemTemplate.


您可以通过FormView的智能标签直接绑定控件到数据源。这将会为您自动创建一个ItemTemplate。(如果数据源的InsertMethod和UpdateMethod设置后,同样为在FormView中创建InsertItemTemplate和EditItemTemplate。)在本例中,我们绑定数据到FormView并手动设置ItemTemplate。首先,设置FormView的DataSourceID属性为ObjectDataSource的ID--ObjectDataSource1。接下来,创建ItemTemplate让其以<h4>形式显示商品的名称和价格;以小字体在下面提供商品的类别和提供商。

<asp:FormView ID="FormView1" runat="server"
DataSourceID="ObjectDataSource1" EnableViewState="False">
<ItemTemplate>
<h4><%# Eval("ProductName") %>
(<%# Eval("UnitPrice", "{0:c}") %>)</h4>
Category: <%# Eval("CategoryName") %>;
Supplier: <%# Eval("SupplierName") %>
</ItemTemplate>
</asp:FormView>

<%# Eval(prppertyName)%>就是用来绑定的语法。Eval方法为FormView控件放回当前对象中的特定的属性。

和DetailsView一样,FormView只显示ObjectDataSource中的第一条记录。您同样可以通过分页来便利所有的记录。

二、总结
通过asp.net2.0提供的ObjectDataSource控件,可以让您不用写任何一行代码就可以从BLL中定义的对象中获取数据并显示数据。通过ObjectDataSource触发特定的方法并返回结果,这些结果可以被绑定到数据控件。在本文中我们学习了如果绑定BObjectDataSource到GridView,DetailsView和FormView。

至此为止,我们学习了通过ObjectDataSource来触发一个没有参数的方法。但如果我们需要触发一个需要输入参数的方法,如ProductBLL中的GetProductsByCategoryID(categoryID),应该如何做呢?我们将在下次内容中介绍,如果配置ObjectDataSource,让其能够触发接受一个或多个输入参数的方法。

快乐编程!!!


分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics