ListView 基础
ListView 是模板驱动的控件,这意味着它默认情况下不会呈现任何数据——您必须以模板的形式完全指定希望它呈现的 HTML。与大多数模板控件类似,ItemTemplate 将成为您工作的重点,您需要将绑定数据集中每一行不断重复的 HTML 内容放在 ItemTemplate 里。
ListView 中的新功能,也是它与其它控件的真正不同之处在于引进了 LayoutTemplate。在 LayoutTemplate 中,您可以将要输出的顶级 HTML 定义为控件呈现的内容。例如,如果希望 ListView 作为表格呈现,则可以在 LayoutTemplate 中包含顶级 <table> 和 <thead> 元素,把行和单元格的呈现留给 ItemTemplate,如
图 1 所示(在本示例中,绑定的数据源将显示包含电影标题和发行日期的简单表格)。
图 2 显示了浏览器呈现。
Figure 1 Using LayoutTemplate and ItemTemplate
<asp:ListView runat="server" ID="_simpleTableListView" DataSourceID="_moviesDataSource"> <LayoutTemplate> <table> <thead> <tr> <th>ID</th> <th>Title</th> <th>Release Date</th> </tr> </thead> <tbody> <asp:PlaceHolder runat="server" ID="itemPlaceholder" /> </tbody> </table> </LayoutTemplate> <ItemTemplate> <tr> <td><%# Eval("movie_id") %></td> <td><%# Eval("title") %></td> <td><%# Eval("release_date", "{0:d}") %></td> </tr> </ItemTemplate> </asp:ListView>
Figure 2
显示在表格中的列表 (单击该图像获得较大视图)
LayoutTemplate 和 ItemTemplate 之间的关联由 LayoutTemplate 中 ID 设置为 itemPlaceholder 的单一服务器端控件完成。(您可以使用 ListView 的 ItemPlaceholderID 属性更改 ID 字符串的默认值。)在第一个示例中,我将 PlaceHolder 控件的实例放置在模板中,即我希望注入 ItemTemplate 内容的位置。请注意:尽管必须支持子控件,但并没有限制必须使用什么类型的控件作为占位符——ID 才是重要。例如,我可以使用服务器端表格行代替 PlaceHolder 控件编写 LayoutTemplate,实现同样的效果:
<LayoutTemplate> <table> <thead> <tr> <th>ID</th> <th>Title</th> <th>Release Date</th> </tr> </thead> <tbody> <tr runat="server" ID="itemPlaceholder" /> </tbody> </table> </LayoutTemplate>
通常情况下,出于以下两个原因,我更喜欢使用通用的 PlaceHolder 控件。第一个原因是名称匹配得很好。而且,该控件并不呈现其自身的 HTML,而是用 ItemTemplate 的内容代替,因此如果控件除在层次结构中保留位置以外无任何其它目的,这是更合乎逻辑的选择。
当然,使 ListView 如此灵活的原因是您可以完全控制 LayoutTemplate 的内容。您不是只能使用表格——您可以将任何希望呈现的 HTML 放置在 LayoutTemplate 中,只要注入 itemPlaceholder 控件位置时 ItemTemplate 的内容有效即可。以下是绑定到相同电影数据源的 ListView 示例,但这次不是表格,是带有标题和发行日期的电影显示在项目符号列表中(结果列表如
图 3 所示):
Figure 3
相同列表,不同格式 (单击该图像获得较大视图)
<asp:ListView runat="server" ID="_simpleTableListView" DataSourceID="_moviesDataSource"> &