通过智能标签里配置完ObjectDataSource ,并把它和DataList 关联起来后,Visual Studio会在DataList 里自动为数据源返回的每个字段创建一个ItemTemplate 用来显示name 和value (见下面的代码).这个默认的ItemTemplate看起来和绑定FormView 时自动产生的模板是一样的.
<asp:DataList runat="server" DataKeyField="ProductID" DataSourceID="ObjectDataSource1" EnableViewState="False"> <ItemTemplate> ProductID: <asp:Label runat="server" Text='<%# Eval("ProductID") %>' /><br /> ProductName: <asp:Label runat="server" Text='<%# Eval("ProductName") %>' /><br /> SupplierID: <asp:Label runat="server" Text='<%# Eval("SupplierID") %>' /><br /> CategoryID: <asp:Label runat="server" Text='<%# Eval("CategoryID") %>'/><br /> QuantityPerUnit: <asp:Label runat="server" Text='<%# Eval("QuantityPerUnit") %>' /><br /> UnitPrice: <asp:Label runat="server" Text='<%# Eval("UnitPrice") %>' /><br /> UnitsInStock: <asp:Label runat="server" Text='<%# Eval("UnitsInStock") %>' /><br /> UnitsOnOrder: <asp:Label runat="server" Text='<%# Eval("UnitsOnOrder") %>' /><br /> ReorderLevel: <asp:Label runat="server" Text='<%# Eval("ReorderLevel") %>' /><br /> Discontinued: <asp:Label runat="server" Text='<%# Eval("Discontinued") %>' /><br /> CategoryName: <asp:Label runat="server" Text='<%# Eval("CategoryName") %>' /><br /> SupplierName: <asp:Label runat="server" Text='<%# Eval("SupplierName") %>' /><br /> <br /> </ItemTemplate> </asp:DataList> <asp:ObjectDataSource runat="server" OldValuesParameterFormatString="original_{0}" SelectMethod="GetProducts" TypeName="ProductsBLL"> </asp:ObjectDataSource>
注意:当通过智能标签将数据源绑定到FormView 时,Vistual Studio会创建一个ItemTemplate,一个InsertItemTemplate和一个EditItemTemplate.然而对DataList来说,只会创建一个ItemTemplate .这是因为DataList 不象FormView那样,有内置的编辑和插入功能.DataList 没有编辑和删除相关的事件,虽然要完成这些功能,对DataList 来说没有FormView那么简单,我们仍然可以加少量代码来实现它.我们在以后的教程里会讲到如何在DataList 里完成编辑和删除的功能.
让我们花点时间来改善一下模板的外观.我们只显示product的name,supplier,category,数量和单价.而且我们用<h4> 来显示名字,其它字段都放在 <h4>heading下的<table>里.你可以通过DataList的只能标签里的 Edit Templates ,或者直接修改页面声明语法来达到以上目的.如果你是通过Edit Templates 来实现,那你的页面代码可能和下面的不完全一样.但是通过浏览器浏览你的页面应该和图8看起来差不多.
<asp:DataList runat="server" DataKeyField="ProductID" DataSourceID="ObjectDataSource1" EnableViewState="False"> <ItemTemplate> <h4><asp:Label runat="server" Text='<%# Eval("ProductName") %>' /></h4> <table> <tr> <td>Category:</td> <td><asp:Label runat="server" Text='<%# Eval("CategoryName") %>' /></td> <td>Supplier:</td> <td><asp:Label runat="server" Text='<%# Eval("SupplierName") %>' /></td> </tr> <tr> <td>Qty/Unit:</td> <td><asp:Label runat="server" Text='<%# Eval("QuantityPerUnit") %>' /></td> <td>Price:</td> <td><asp:Label runat="server" Text='<%# Eval("UnitPrice", "{0:C}") %>' /></td> </tr> </table> </ItemTemplate> </asp:DataList>
注意:上面的例子使用的是Text指定为数据绑定的值的Label控件.我们也可以不使用Label,而只是保留数据绑定的代码.也就是说,我们可以用<%# Eval("CategoryName") %>来代替<asp:Label runat="server" Text='<%# Eval("CategoryName") %>' />.
使用Label控件有两个好处,第一点在下一章我们会看到,就是提供了一个格式化数据的简单途径.第二点是不使用web控件的时候,Edit Templates 不显示声明的数据绑定代码.通过Edit Templates 的界面很容易操作静态标记语言和web控件,其前提是所有的数据绑定都是通过web控件的智能标签里的Edit DataBindings对话框来实现.因此,使用DataList的时候,我建议使用Label控件,这样通过Edit Templates 就可以操作其内容.我们会看到,使用Repeater 时如果需要编辑其内容,需要切换到源视图.而设计Repeater模板的时候,我通常不使用Label控件,除非我需要格式化绑定数据的外观.
图 8: 用DataList的 ItemTemplate显示Product
第三步: 改善DataList的外观