ListView
ListView 是一个非常灵活的数据绑定控件,根据定义的模版呈现自己的内容。和 Repeater 控件不同,ListView 增加了高级特性(如选择和编辑),它们的工作方式和 GridView 相同。它以最少的标记创建快速、简洁的 Grid 。
ListView 可以使一个需要更多工作的更灵活的 GridView,也可以使一个提供了更多细节的简化版本的 Repeater(ASP.NET 1.x 中包含的控件)。
ListView 包括更多的模版:
ItemTemplate | 所有数据项或奇数行的内容 |
AlternatingItemTemplate | 偶数行的内容 |
ItemSeparatorTemplate | 在项目中间绘制的分隔内容 |
SeletedItemTemplate | 选定项目的内容 |
EditItemTemplate | 项目在编辑模式中使用的控件 |
InsertItemTemplate | 插入新项目使用的控件 |
LayoutTemplate | 包装项目列表的标记 |
GroupTemplate | 如果使用了分组功能,设置包装项目组的标记 |
GroupSeparatorTemplate | 组之间的分隔内容 |
EmptyItemTemplate | 如果使用了分组,用于填充最后一组里的空项目 例如13个项目,每组5个项目,最后一组缺2个项目 |
EmptyDataTemplate | 设置绑定的数据对象为空(没有包括任何记录或对象)时使用的标记 |
使用 ListView 最常见的原因是为了创建不常见的布局!例如,创建在同一个行里显示多个项目的表、或者彻底脱离基于表格的呈现。构建显示大量数据的页面时通常首先考虑使用 GridView,而在更特殊的场景里使用 ListView 。
为了在 ListView 里显示数据,需要遵循由 TemplateField 列组成 GridView 的同样过程(至少要使用 ItemTemplate 模版):
<asp:ListView ID="listEmployees" DataSourceID="sourceEmployees" runat="server">
<ItemTemplate>
<span><b>
<%# Eval("EmployeeID") %> -
<%# Eval("TitleOfCourtesy") %><%# Eval("FirstName") %><%# Eval("LastName")%>
</b><hr />
<small><i>
<%# Eval("Address") %><br />
<%# Eval("City") %>,<%# Eval("Country") %>,<%# Eval("PostalCode") %><br />
<%# Eval("HomePhone") %>
</i><br /><br />
<%# Eval("Notes") %>
<br /><br />
</small></span>
</ItemTemplate>
</asp:ListView>
ListView 为了呈现自身时,它对绑定的数据进行迭代并为每个项目呈现 ItemTemplate。然后它把自己的所有内容都放到普通的<span>里。
通常你会希望提供一个 LayoutTemplate 以对项的组织进行更多控制。如果包含了 LayoutTemplate,项目则被放到 LayoutTemplate 里面。看下面这个示例,这个示例与没有 LayoutTemplate 的 ListView 行为相同:
<asp:ListView ID="listEmployees" DataSourceID="sourceEmployees" runat="server">
<LayoutTemplate>
<asp:PlaceHolder ID="itemPlaceholder" runat="server"></asp:PlaceHolder>
</LayoutTemplate>
<ItemTemplate>
...
</ItemTemplate>
</asp:ListView>
为 ListView 创建 LayoutTemplate 时需要指定 ItemTemplate 内容应该插入的位置。添加一个占位符可以实现这一点。该元素将为每个绑定的数据项目重复一次,只要把元素的 ID 设为 itemPlaceholder,就可以把该元素作为占位符。
因为 LayoutTemplate 才使得 ListView 如此灵活!其他数据控件为数据内容而使用模版,ListView 为数据整体结构而使用模版。
分组
使用分组,首先要设置 GroupItemCount 属性,它决定每个组里数据项的个数:
<asp:ListView ID="listEmployees" GroupItemCount="3" ...>
设置了分组大小后,还要修改 LayoutTemplate。这是因为总体布局不再包含数据项,它只包含分组,而分组才包含数据项。为了反映这一事实,需要把 ID 从 itemPlaceholder 改为 groupPlaceholder:
<LayoutTemplate>
<table border="1">
<tr id="groupPlaceholder" runat="server">
</LayoutTemplate>
然后要提供 GroupTemplate 用于封装每个组。GroupTemplate 必须提供一个项目占位符:
<GroupTemplate>
<tr><td runat="server" id="itemPlaceholder" valign="top" />
</GroupTemplate>