ASP.NET 2.0中的操作数据十三:在详细视图控件中使用模板字段
介绍
与BoundField、CheckBoxField、HyperLinkField等数据字段控件相比,TemplateField提供了一种高度复杂的数据表示方法。在前一节中,我们主要关注在GridVIew中使用TemplateField来实现:
在一列中显示多个数据字段。例如,名字和姓氏字段被组合并显示在GridView列中。
使用交互式网络控件呈现数据。我们看到了如何使用日历控件来显示日期的值。
基于潜在数据显示状态信息。虽然Employees表不包含关于员工在公司工作时间的数据列,但我们仍然可以使用TemplateField和格式化方法在GridView中实现这些功能,就像我们在上一节中所做的那样。
就像在GridView中一样,DetailsView控件也可以使用TemplateField。在本教程中,我们将使用包含两个模板字段的DetailsView一次显示一个产品信息。第一个模板字段将集成单价、单价和单价等数据,并将它们显示在明细视图行上。第一个模板字段将显示停产的数据,但是当有折扣时将使用格式化方法显示“是”,否则将显示“否”。
图1:使用两个模板列定制显示。
好了,我们开始吧!
步骤1:将数据绑定到DetailsView。
如前一节所述,使用TemplateField最简单的方法是创建一个仅包含BoundField的DetailsView控件,然后添加一个新的TemplateField或将一些BoundField转换为TemplateField。因此,我们首先通过设计器向页面中添加一个DetailsView控件,并绑定一个向其返回产品列表的ObjectDataSource。这些操作将创建一个包含边界字段和检查框字段的详细视图,边界字段用于非布尔值,检查框字段当然用于布尔值(如“折扣”)。
打开DetailsViewTemplateField.aspx页面,将DetailsView从工具箱拖到设计器中。选择并添加一个新的ObjectDataSource控件,该控件从DetailsView的智能标记中调用ProductsBLL类的GetProducts()方法。
图2:添加一个调用GetProducts()方法的新ObjectDataSource控件。
在此报告中,删除边界字段,如产品标识、供应商标识、类别标识和重组级别。然后,调整剩余边界字段的顺序,使类别名称和供应商名称跟随产品名称。然后设置BoundField的HeaderText和格式化属性,不要紧张,只要你觉得舒服就填好。与在GridView中一样,您可以通过字段对话框或直接修改声明性语法。译者注:直译应该是什么?声明性语法?总之,只是HTML视图中的那些东西)来编辑这些绑定列。最后,清除DetailsView的Height和Width属性,这样就可以根据要显示的数据自动展开。此外,选择智能标记中的“启用分页”复选框。
进行这些更改后,DetailsView控件的声明标记应该如下所示:
asp3360 Detailsview ID=' Detailsview 1 ' runat=' server ' AutoGenerateRows=' False ' DataKeyNames=' ProductID ' Data sourceid=' objectdata source 1 ' allow paging=' Tr UE ' EnableViewState=' False '字段asp3360 boundfield Data Field=' Product name ' Header Text=' Product ' sort expression=' Product name '/asp3360 boundfield Data Field=' CategoryName ' Header Text=' Category ' ReadOnly现在,您可以看到一个产品(柴),它包括一些显示其属性的行:名称、分类、供应商、库存、订单数量及其折扣状态。
图3:使用一组绑定的列来显示产品细节。
第二步:将单价、库存数量、订单数量合并在一列。
DetailsView有一个关于单价、单价和单价的列。使用TemplateField,您可以将这三个数据合并成一行,并且可以添加一个新的TemplateField,或者直接将单价、单价或单价的任何边界字段转换为TemplateField。虽然我个人喜欢将现有的BoundField转换为TemplateField的方式,但是让我们联系这里添加一个新的TemplateField。
单击详细视图智能标记弹出菜单中的“编辑字段”。在弹出的字段对话框中,添加一个新的模板字段,并将其HeaderText属性设置为“价格和库存”,然后将新的模板字段移动到单价之上。
图4:向DetailsView控件添加模板列。
新添加的TemplateField将显示BoundField中的数据,例如UnitPrice、UnitsInStock和UnitsOnOrder,所以让我们先删除这些bound field。
这一步的最后一个任务是定义“价格和库存”,这是TemplateField的ItemTemplate。您可以通过设计器中DetailsView的模板编辑界面完成此任务,也可以手动编写声明代码。就像GridView一样,您可以通过在智能标记的弹出菜单中单击“编辑模板”来使用模板编辑界面。在这里,您可以从下拉框中选择要编辑的模板,并从工具箱中添加任何您喜欢的Web控件。
在本教程中,首先,在“价格和库存”模板的列中向项目模板添加一个标签。然后,单击标签控件的智能标签上的编辑数据绑定,并将其文本属性绑定到单价字段。
图5:将标签的文本属性绑定到单价字段。
将单价格式化为货币。执行此操作后,在“价格和库存”模板的“标签”栏中仅显示所选产品的单价。图6向我们展示了我们到目前为止所做的工作。
图6:“单价和总金额”模板列显示单价。
请注意,产品的单价尚未格式化为货币。如果是BoundField,可以通过将HtmlEncode属性设置为false并将DataFormatString属性设置为“{ 03360 format说明符}”来实现格式化。但是,在TemplateField中,必须在数据绑定语法中或通过使用编写在应用程序中某处的格式化方法(例如,在ASP.NET页面的后代码类中)来指定任何格式化指令。
要在标签的数据绑定代码中指定格式,请在标签的智能标签中单击“编辑数据绑定”,然后直接输入格式描述或在弹出的数据绑定对话框的下拉框中选择预定义的格式字符串。就像BoundField的DataFormatString属性一样,格式是使用{ 0:formatSpecifier说明符}指定的。要使用单价字段的货币格式,我们可以在下拉框中选择适当的值,或者直接输入“{0:C}”。
图7:将单价格式化为货币形式。
解释格式描述是绑定或评估方法的第二个参数。设计器刚刚添加的设置用以下标记语言表示:ASP :标签ID=' label 1 ' Runat=' Server ' Text=' % # Eval('单价',' { 03360 c } ')% '/ASP 3360标签将剩余的数据字段添加到TemplateField。
目前,我们已经在“价格和库存”的模板列中显示并格式化了单价字段,但我仍然需要显示单价库存和单价订单。让我们把它们放在单价下一行的括号里。在设计器的模板编辑器中,这些用于显示的标记语言可以简单地用键盘输入。当然,您需要首先将光标定位在模板中的某个位置。此外,还可以直接在申报代码中输入。
添加了静态标记语言、标签控件和数据绑定代码,因此“价格和库存”模板列可以显示单价和总金额信息,如下所示:
单价(库存/订单:库存/订单数量)
完成此操作后,DetailsView的声明标记代码应该如下所示:
asp3360 DetailsView ID=' DetailsView 1 ' runat=' server ' AutoGenerateRows=' False ' DataKeyNames=' ProductID ' data sourceid=' objectdata source 1 ' allow paging=' Tr UE ' EnableViewState=' False '字段asp3360 boundfield data field=' Product name ' header Text=' Product ' sort expression=' Product name '/asp3360 boundfield data field=' CategoryName ' header Text=' Category ' ReadOnly
图8:单价和总金额信息显示在单独的一行上。
第三步:自定义折扣字段的信息。
“产品”表的折扣字段是一个位值,表示产品是否打折。当DetailsView(或GridView)绑定到数据源控件时,布尔字段(如停产)将实现为CheckBoxField,而非布尔字段(如ProductID、ProductName等)。)将作为BoundField实现。CheckBoxField呈现为禁用的复选框。如果数据值为真,则复选框被选中,否则不选中。
与显示CheckBoxField相比,也许我们更愿意将其显示为文本,以显示产品是否有折扣。为此,我们可以从DetailsView中删除这个CheckBoxField,添加一个BoundField,并将其DataField属性设置为Discontinued。嗯,花点时间完成吧!在此更改之后,DetailsView将为那些打折产品显示“真”,为其他产品显示“假”。
图9:字符串“真”和“假”用于显示折扣状态。
想一想,我们不是要用“真”或“假”,而是要“是”和“否”。这种定制可以通过模板字段和格式化方法来实现。格式化方法可以接受几个输入参数,但会智能地返回一个HTML(字符串类型)以插入模板。
向DetailsViewTemplateField.aspx页面的post代码类添加一个名为DisplayDiscontinuedAsYESorNO的格式化方法,该方法接受一个布尔值作为参数并返回一个字符串。如前一节所述,此方法必须标记为受保护或公共的,否则无法从模板中访问。
受保护字符串显示中断系统否(布尔中断){如果(中断)返回“是”;否则返回“否”;}此方法检查输入参数(折扣与否),如果为真则返回“是”,否则返回“否”。
注意:回想一下我们在上一节说过的话。传递给格式化方法的参数可能为null,因此我们需要在访问员工的HiredDate之前检查其null值。此处无需进行此检查,因为“已停产”字段永远不会为空。此外,这也是此方法接受布尔值而不是ProductsRow实例或对象类型的参数的原因。
完成这个格式化方法后,剩下的就是在TemplateField的ItemTemplate中调用它。要创建这个模板字段,我们可以删除已中断的绑定列并添加一个新的模板字段,或者我们可以直接将已中断的绑定字段转换为模板字段。然后,在源视图(即HTML视图)中编辑TemplateField,使其包含一个调用DisplayDiscontinuedAsYESorNO方法的ItemTemplate,传递的参数是当前ProductRow实例的continuated属性。这可以通过Eval方法访问。现在,模板字段的标记代码如下所示:
asp: templatefield header text=' discontined ' sort expression=' discontined ' item template % # displaydiscontinuedasyerno((bool)Eval(' discontined '))%/item template/ASP : templatefield这样,在呈现DetailsView时将调用displaydiscontinuedasyerno方法,并将ProductRow实例的discontined值传递给它。Eval方法返回obejct类型的值,而DisplayDiscontinuedAsYESorNO方法只接受布尔参数,因此我们将Eval方法的返回值转换为布尔类型。根据接收到的值,DisplayDiscontinuedAsYESorNO方法将返回“是”或“否”,这个返回值就是要在DetailsView行中显示的内容。
图10:现在折扣行显示“是”或“否”。
摘要
在DetailsView控件中,与其他列控件相比,模板列可以处理更复杂的数据呈现。列主要用于以下情况:
DetailsView列需要显示多个数据列。
使用Web控件显示数据比简单的文本要好。
页面输出取决于绑定到DetailsView的数据,例如元数据或数据的重新格式化。
虽然模板列可以以较高的复杂度呈现DetailsView的数据,但是DetailsView的输入还是让人觉得别扭,因为它把每个字段都显示为一行HTML标记表。
FormView控件提供了更复杂的输出呈现。表单视图不包含列,只包含一系列模板(项目模板、编辑项目模板、标题模板等)。).在下一节中,我们将看到如何使用FormView来呈现更多的控件。
编程快乐!
关于作者
斯科特米切尔,六本关于ASP/ASP的书的作者。NET,是4GuysFromRolla.com的创始人,自1998年以来一直使用微软的网络技术。Scott是一名独立的技术顾问、培训师和作家,最近完成了一部即将由Sams出版社出版的新作,24小时内精通ASP.NET 2.0。他的联系电子邮件是[emailprotected],也可以通过他的博客http://ScottOnWriting.NET联系到他。
版权声明:ASP.NET 2.0中的操作数据十三:在详细视图控件中使用模板字段是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。