您的位置:首页 > 编程语言 > ASP

[翻译]Scott Mitchell 的ASP.NET 2.0数据教程之十三:在DetailsView控件中使用TemplateField

2006-08-17 19:48 1066 查看
导言


比起BoundField、CheckBoxField、HyperLinkField以及其他的那些数据字段控件(data field controls)来说,TemplateField提供了一种高度复杂的数据呈现的方法。在上一节中,我们主要着重于在GridVIew中使用TemplateField,以实现:

· 在一列中显示多个数据字段。比如说,将FirstName和LastName字段合并起来显示在一个GridView列中。

· 使用交互Web控件来展示数据。我们看到了如何使用一个Calendar控件来显示HiredDate的值。

· 显示基于潜在数据的状态信息。尽管Employees表中并没有包含一个关于雇员在公司干了多久的数据列,但我们仍然可以使用TemplateField 和格式化方法在GridView中实现这样的功能,就像我们在上一节中做的那样。

就像在GridView中那样,DetailsView控件也可以同样的使用TemplateField。在本节教程中,我们将使用一个包含两个TemplateField的DetailsView来一次一个的显示产品信息。第一个TemplateField将整合UnitPrice、UnitsInStock和UnitsOnOrder等数据并显示在一个DetailsView行上。第一个TemplateField则将显示Discontinued的数据,不过将使用格式化方法,在有折扣的时候就显示“YES”,否则就显示“NO”。

<asp:DetailsView ID="DetailsView1" runat="server" AutoGenerateRows="False" DataKeyNames="ProductID"
2 DataSourceID="ObjectDataSource1" AllowPaging="True" EnableViewState="False">
3 <Fields>
4 <asp:BoundField DataField="ProductName" HeaderText="Product" SortExpression="ProductName" />
5 <asp:BoundField DataField="CategoryName" HeaderText="Category" ReadOnly="True" SortExpression="CategoryName" />
6 <asp:BoundField DataField="SupplierName" HeaderText="Supplier" ReadOnly="True" SortExpression="SupplierName" />
7 <asp:BoundField DataField="QuantityPerUnit" HeaderText="Qty/Unit" SortExpression="QuantityPerUnit" />
8 <asp:BoundField DataField="UnitPrice" HeaderText="Price" SortExpression="UnitPrice" />
9 <asp:BoundField DataField="UnitsInStock" HeaderText="Units In Stock" SortExpression="UnitsInStock" />
10 <asp:BoundField DataField="UnitsOnOrder" HeaderText="Units On Order" SortExpression="UnitsOnOrder" />
11 <asp:CheckBoxField DataField="Discontinued" HeaderText="Discontinued" SortExpression="Discontinued" />
12 </Fields>
13</asp:DetailsView>
14

同样,我们还是花点时间到浏览器中看看效果吧!现在,你可以看到一个单独的产品(Chai),它包括一些显示其属性的行:名称、分类、供应商、库存量、订货量还有它的打折状态。

<asp:DetailsView ID="DetailsView1" runat="server" AutoGenerateRows="False" DataKeyNames="ProductID"
2 DataSourceID="ObjectDataSource1" AllowPaging="True" EnableViewState="False">
3 <Fields>
4 <asp:BoundField DataField="ProductName" HeaderText="Product" SortExpression="ProductName" />
5 <asp:BoundField DataField="CategoryName" HeaderText="Category" ReadOnly="True" SortExpression="CategoryName" />
6 <asp:BoundField DataField="SupplierName" HeaderText="Supplier" ReadOnly="True" SortExpression="SupplierName" />
7 <asp:BoundField DataField="QuantityPerUnit" HeaderText="Qty/Unit" SortExpression="QuantityPerUnit" />
8 <asp:TemplateField HeaderText="Price and Inventory">
9 <ItemTemplate>
10 <asp:Label ID="Label1" runat="server" Text='<%# Eval("UnitPrice", "{0:C}") %>'></asp:Label>
11 <br />
12 <strong>
13 (In Stock / On Order: </strong>
14 <asp:Label ID="Label2" runat="server" Text='<%# Eval("UnitsInStock") %>'></asp:Label>
15 <strong>/</strong>
16 <asp:Label ID="Label3" runat="server" Text='<%# Eval("UnitsOnOrder") %>'></asp:Label><strong>)</strong>
17 </ItemTemplate>
18 </asp:TemplateField>
19 <asp:CheckBoxField DataField="Discontinued" HeaderText="Discontinued" SortExpression="Discontinued" />
20 </Fields>
21</asp:DetailsView>
22

做了这些修改之后,我们已经把单价和总量信息统一的显示在一个单独的DetailsView行中了。

protected string DisplayDiscontinuedAsYESorNO(bool discontinued)
2

这个方法检查输入的参数(是否折扣),如果为true则返回“YES”,否则就返回“NO”。

注意:回忆一下我们在上一节中的相关内容,传递给格式化方法的参数可能是空值,所以我们需要在访问雇员的HiredDate之前对它进行空值检查。这样的检查在这里却是不需要的,因为Discontinued字段永远不会是空值。此外,这也是为什么这个方法接受的是一个布尔值而不是ProductsRow实例或object类型的参数的原因。

完成了这个格式化方法之后,剩下的就只是在TemplateField的ItemTemplate中调用它了。要创建这个TemplateField,我们可以删除Discontinued绑定列再添加一个新的TemplateField,也可以直接将Discontinued BoundField转换成TemplateField。然后,在源视图(译者注:就是HTML视图)编辑TemplateField以使其包含一个调用DisplayDiscontinuedAsYESorNO方法的ItemTemplate,传过去的参数就是当前ProductRow实例的Discontinued属性。这个可以通过Eval方法来访问。现在,这个TemplateField的标记代码就像这样了:

1<asp:TemplateField HeaderText="Discontinued" SortExpression="Discontinued">
2 <ItemTemplate>
3 </ItemTemplate>
5</asp:TemplateField>
6

这样,DisplayDiscontinuedAsYESorNO方法就会在呈现DetailsView时被调用,传给它的是ProductRow实例的Discontinued值。由于Eval方法返回的是一个obejct类型的值,而DisplayDiscontinuedAsYESorNO方法仅接受布尔型的参数,所以我们将Eval方法的返回值转换成布尔型的。根据接收到的值,DisplayDiscontinuedAsYESorNO方法将会返回“YES”或“NO”,这个返回值就是要在这个DetailsView行中显示的东西。



图十:现在在折扣行中显示的就是“YES”或“NO”了

[b]总结[/b]

在DetailsView控件中,相对于其他的列控件来说,模板列可以处理更加复杂的数据呈现。模板列主要用于这样一些情况:

· 一个DetailsView列中需要显示多个数据列

· 使用一个Web控件来展示数据比一段简单的文本更好

· 页面的输出取决于绑定到DetailsView的数据,比如说元数据或者说是数据的重新格式化

虽然模板列可以高度复杂的呈现DetailsView的数据,但DetailsView的输入仍然让人感到有些别扭,因为它把每个字段都显示成HTML标记<table>的一行。

FormView控件提供了一种更加复杂的输出呈现。FormView并不含有什么列,它仅仅包括一系列的模板(ItemTemplate、EditItemTemplate、HeaderTemplate等等)。在下一节中,我们将看到如何使用FormView来达到呈现更多控件的效果。

编程愉快!

关于作者

Scott Mitchell,著有六本ASP/ASP.NET方面的书,是4GuysFromRolla.com的创始人,自1998年以来一直应用微软Web技术。Scott是个独立的技术咨询顾问,培训师,作家,最近完成了将由Sams出版社出版的新作,24小时内精通ASP.NET 2.0。他的联系电邮为mitchell@4guysfromrolla.com,也可以通过他的博客http://ScottOnWriting.NET与他联系。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐