介绍
在上一个教程中,我们学习了DataList提供的一些样式属性,还学习了如何定义Head Style、Item Style、Alternating Item Style和SelectedItemStyle等属性的默认CSS。除了这四个属性,DataList还提供了其他属性,比如Font。前颜色、后颜色和边框宽度。中继器不提供任何这样的属性。如果需要使用represet来实现这些效果,则需要直接在模板中编写标记语言。
一般来说,数据的格式取决于数据本身。例如,我们可能会使用灰色字体列出已经停产产品,或者在UnitsInStock等于0时突出显示这些产品。在前面的教程中,我们已经了解到GridView、DetailsView和FormView都提供了两种不同的数据格式化方式。
数据绑定事件—为数据绑定事件创建适当的事件处理程序,该事件在数据绑定到项时触发(对于GridView,它是一个RowDataBound事件;对于数据列表和中继器,它是一个ItemDataBound事件)。在这些事件中,可以格式化刚绑定的数据。参见第《基于数据的自定义格式化》章。
模板的格式化功能——在DetailsView或GridView中使用TemplateFields,或者在FormView中使用template,我们可以在ASP.NET Page或BLL的代码隐藏类中使用。或者任何其他可以在web程序中调用的类库。这个格式化函数可以接收任意的输入参数,但是在模板中,例如,它返回HTML。在GridView控件中使用TemplateField一章中首次提到了格式化函数。这两种方法都可以在DataList和Repeater中使用。在本章中,我们将使用这两种方法在这两个控件中逐步进行示例。
使用项目数据绑定事件处理程序。
当数据绑定到DataList时,无论是使用DataSource控件还是直接在代码中使用datasource和databind(),都会触发DataList的DataBinding事件。数据列表为数据源的每条记录创建一个数据列表项对象,然后将其绑定到当前记录。在这个过程中,datalist触发两个事件3360。
创建DataListItem后激发的项目数据绑定-在当前记录绑定到DataListItem后激发。
下面列出了数据列表数据绑定过程的一般步骤。
数据列表的数据绑定事件被激发.对于数据列表的数据源…中的每条记录.创建一个DataListItem对象来刺激项创建了一个事件绑定记录到DataListItem来刺激项数据绑定事件来将DataListItem添加到项集合。
当数据绑定到Repeater时,情况与上面相同。唯一的区别是数据列表项被RepeaterItem替换。
:的细心读者可能已经注意到,当DataList和Repeater绑定到数据时的步骤顺序与GridView略有不同。在数据绑定过程的后期,GridView将触发数据绑定事件,但数据列表和中继器都没有此事件。
像GridView一样,您可以为ItemDataBound事件创建一个事件处理程序来格式化数据。该事件处理程序可以处理刚刚绑定到DataListItem或RepeaterItem的数据,并根据需要对其进行格式化。
对于DataList,可以通过使用与样式相关的属性来格式化项目,如字体、前景色、背景色、CSS类等。如果您想在Datalist中格式化模板中的web控件,您需要通过编程来获取这些控件。那就控制它。我们已经在《Custom Formatting Based Upon Data》中看到了如何做到。像Repeater控件一样,RepeaterItem类没有与样式相关的属性,因此您需要在ItemDataBound事件处理程序中对其进行编程。
因为在DataList和Repeater中使用ItemDataBound格式化技术本质上是由于,所以我们的例子主要讨论DataList。
第一步:在数据列表中显示产品信息。
在学习格式化之前,我们首先使用DataList创建一个显示产品信息的页面。在前一章中,我们创建了一个显示名称、类别、供应商、数量和价格数据列表的项目模板。我们将在本章中重复它。您可以重新创建数据列表及其对象数据源,或者直接将上一章中的Basics.aspx中的控件复制到本章的页面(Formatting.aspx)。完成格式化后,将数据列表的标识从数据列表1更改为项目数据边界格式示例。接下来,看看浏览器中的数据列表。如图1所示,唯一的格式是每个产品的替代背景颜色。
图1:在数据列表中列出产品信息。
在本教程中,我们将用黄色突出显示价格低于20.00美元的产品的名称和单价。
第二步,对ItemDataBound事件处理程序中的数据值进行编程判断。
因为只有价格低于20.00美元的产品才会被格式化,所以我们必须首先判断每种产品的价格。将数据绑定到数据列表时,数据列表为每个数据源记录创建一个数据列表项实例,并绑定数据。当记录绑定到数据列表项对象时,将触发项目数据绑定事件。我们可以为这个事件创建一个事件处理程序来判断当前DataListItem的值,然后根据这个值格式化数据。添加以下代码为数据列表创建一个项目数据绑定事件。
受保护的void ItemDataBoundformatingExample _ ItemDataBound(对象发送方,DataListItemEventArgs e){ if(e . Item . ItemType==ListItemType。item | | e . item . item type==ListItemType。AlternatingItem) { //以编程方式引用绑定到此DataListItem北风的ProductsRow实例//。产品行产品=(北风。产品行()((系统。数据行视图)。划;//查看单价是否不为空且小于$20.00如果(!产品。IsUnitPriceNull()产品。UnitPrice 20) { //TODO:突出显示产品的名称和价格} } } DataList的ItemDataBound事件处理程序在概念和语义上与GridView的RowDataBound事件处理程序相同(请参见基于数据的自定义格式),但在语法上略有不同。当ItemDataBound事件被触发时,刚刚与数据绑定的DataListItem会通过e . Item(GridView中的e.Row和RowDataBound)传递给相关的事件处理程序。datalist的ItemDataBound事件处理程序会影响每一行,包括标题。页脚和分隔符。但是,产品信息仅绑定到数据线。因此,在处理ItemDataBound事件之前,我们必须首先确定是否正在处理该数据线。这可以通过检查DataListItem的ItemType属性来完成,该属性可以有以下八个值:
alternating itemcedititemfooterheaderitempageselecteditemseparator
Item和AlternatingItem都表示数据列表的数据项。假设我们正在处理item或AlternatingItem,我们可以获得一个绑定到当前DataListItem的producsRow实例。DataListItem的DataItem属性包含对DataRowView对象的引用,可以通过其row属性获取producsrow对象。
让我们检查产品行实例的单价属性。由于Product表的unitPrice字段允许空值,因此在获取UnitPrice属性之前,我们应该使用IsUnitPriceNull()方法检查该值是否为空。如果没有,我们会检查是否低于20美元。如果是,我们将格式化它。
第三步:是突出显示产品的名称和价格。
一旦我们发现产品的价格低于20美元,我们将突出其名称和价格。首先,我们需要对标签控件进行编程,该控件在项目模板中显示产品的名称和价格。然后我们将它的背景色显示为黄色。这可以通过修改BackColor属性(labeid)直接完成。背景色=颜色。黄色)。当然,最理想的方式是所有与显示相关的行为都通过CSS实现。事实上,风格。在基于数据的自定义格式一章中创建的CSS-follovabalepricemphasis已经提供了这个功能。
使用以下代码将两个标签控件的CssClass属性设置为可提供价格强调以完成格式化:
//突出显示产品名称和单价标签//首先,获取对两个标签网站控件的引用标签产品名称标签=(标签)e.Item.FindControl('产品名称标签');标签单价标签=(标签)e.Item.FindControl('单价标签');//接下来,设置它们的设置一下属性if (ProductNameLabel!=null) ProductNameLabel .' CssClass='实惠价格强调;if (UnitPriceLabel!=null)单价标签.' CssClass='实惠价格强调;项绑定事件事件完成后,在浏览器里浏览Formatting.aspx页。如图2所示,价格低于$20.00 的产品的名字和价格都高亮显示了。
图2: 价格低于$20.00 的产品都被高亮显示
注意:由于数据列表使用超文本标记语言表格,数据列表项实例有可以设置整个项目风格的属性。比如,如果我们想在价格低于$20.00时将所有的项目都用黄色来高亮显示,我们可以用' e.Item.CssClass='可负担价格强调'来代替上面的代码(见图3).
而组成中继器的重复项目并没有提供这样的属性。因此,在中继器里自定义格式需要设置模板里的控件的格式,象在图2里所做的那样。
图3:对于低于20.00美元的产品,突出显示整个产品项目
使用模板的格式化功能
在在显示数据表格(一种控件)控件中使用列一章里,我们学习了如何使用GridView TemplateField的格式化功能来格式化显示数据表格(一种控件)的数据。格式化功能是一种可以从模板里调用并返回超文本标记语言显示的方法。格式化功能可以写在ASP .网页面的代码隐藏类或应用程序代码文件夹里的类文件里或单独的类库项目里。如果你想在其它ASP。网网程序或多个ASP。网页用到同样的功能,那么不要把它下在ASP .网页面的代码隐藏类里。
为了演示这个功能,我们将修改产品信息。如果产品被停用,我们在产品的名字后面增加一个"[已停产]"的文字。同样的,如果价格低于$20.00 我们将会用黄色来高亮显示(如我们在项目数据绑定事件处理程序例子里做的那样).如果价格等于或高于$20.00,我们将不显示实际的价格,而是在文本里显示"请要求报价"。图四是完成以上功能的页面截图。
图4: 将比较贵的制品的价格用文本"请要求报价"来代替。
第一步: 创建格式化功能
这个例子里我们需要两个格式化功能,其一是在被停用的产品名称后面加上"[已停产]",其二是对价格低于$20.00的产品高亮显示,其它则显示"请要求报价"。我们将在ASP .网页面的代码隐藏类里创建这些功能,并给它们取名为显示产品名称和持续状态和显示价格。这两个方法都需要返回HTML,而且为了在ASP .网页面的声明语法里调用,都需要标记为受保护的(或公共的)。下面是这两个方法的代码:
受保护的字符串displayproductnamanddiscontinuuedstatus(字符串productName,bool已停止){ //如果已停止,则仅返回productName,如果(!停产)返回productNameelse //否则,返回附加了文本"[REPORTED]"的商品名称返回字符串Concat(productName,'[REPORTED]');}受保护的字符串显示价格(北风产品行.产品){ //如果价格低于$20.00,则返回价格,突出显示If(!产品IsUnitPriceNull()产品。单价20)返回字符串concat(' span class= ' expensablepriceenhanced '),产品单价。ToString('C '),'/span ');else /否则返回文本"请要求报价"返回“跨度请要求报价/span ";}注意到显示产品名称和持续状态方法接收商品名称和停止的值。而显示价格方法接收ProductsRow(而不是单价)。如果格式化功能处理可能包含数据库空值(比如单价,而商品名称和停止都不允许空)的量值,要特别小心处理。
的值可能是一个数据库空值,而不是您期望的数据类型,因此输入参数的类型必须是对象。例如,检查传入值是否为数据库NULL。也就是说,如果我们希望DisplayPrice方法将价格作为参数,我们需要下面的代码:
受保护的字符串DisplayPrice(对象单位价格){ //如果价格小于$20.00,则返回价格,如果(!转换。IsDBNull(单价)((十进制)单价)20)返回字符串。concat('(span class= ' expensablepriceessorization ',((十进制)单价)。ToString('C '),'/span ');else //否则返回文本“请要求报价”返回“span请要求报价/span”;}注意输入参数unitPrice为Object的类型,修改条件判断语句,判断UnitPrice是否为DBNull。此外,由于单价是作为对象传入的,因此必须转换为十进制。
步骤:调用DataList的ItemTemplate中的格式化方法。
完成上面的代码后,剩下的工作就是在DataList的ItemTemplate中调用这些格式化函数。我们需要使用下面的代码:
% # methodname (inputparameter1,inputparameter2,)%在DataList的ItemTemplate中。产品名称标签通过将文本属性指定为% # Eval(‘产品名称’)%,来标记显示的产品名称。如有必要,为了添加“[断开]”,请修改代码。请使用displayproductnameadcontinuedstatus方法指定text属性。我们需要使用Eval('columnName ')语法传入产品名称和停产值。Eval返回的值属于对象类型。displayproductnameaddiscontinuedstatus的参数是字符串和布尔值。因此,我们需要将Eval方法返回的值转换为所需的参数类型,代码如下:
H4 asp:标签ID=' productnamelab ' runat=' server ' Text=' % # displayproductnamanddiscontinuedstatus((string)Eval(' product name '),(bool) eval('贴现')%'/ASP :标签/H4像显示产品名称和文本“[贴现]”一样,我们将UnitPriceLabel标签的属性设置为DisplayPrice的返回值来显示价格。我们使用产品行作为参数,而不是单价:
ASP :标签ID='单价标签' runat='服务器' text=' % # display price((north wind。产品行)((系统。数据。datarowview)容器。dataitem)。row)%'/ASP 3360Label完成上述代码后,在浏览器中查看页面。您的页面应该与图中相似。
图5:将昂贵产品的价格替换为文本“请要求报价”。
摘要
有两种方法可以根据数据格式化数据列表或中继器。一种是为ItemDataBound创建一个事件处理程序。当数据源的每条记录都绑定到DataListItem或RepeaterItem时,itemdatabound被激活。在ItemDataBound事件处理程序中,可以对当前项的数据进行判断和格式化,而对DataListItem则可以对整个项进行格式化。
二是通过格式化功能完成自定义格式化。格式化函数是一种可以从模板调用并返回到HTML显示的方法。通常,绑定到当前项目的值被判断以确定返回什么类型的HTML。这些绑定到项目的值或对象可以传递给格式化函数。编程快乐!
作者简介
斯科特米切尔,六本关于ASP/ASP的书的作者。NET,是4GuysFromRolla.com的创始人,自1998年以来一直使用微软的网络技术。Scott是一名独立的技术顾问、培训师和作家,最近完成了一部即将由Sams出版社出版的新作,24小时内精通ASP.NET 2.0。他的联系电子邮件是[emailprotected],也可以通过他的博客http://scottonwriting.net/.联系到他