模板控件介绍
虽然上一节中说明的 DataGrid 服务器控件对许多适于采用网格样式数据表示形式的 Web 应用程序方案很适合,但许多情况下,数据表示形式需要丰富得多。ASP.NET 提供两个控件 DataList 和 Repeater,这两个控件为呈现列表样式的数据提供了更大的灵活性。这些控件基于模板,因此没有自己的默认呈现形式。数据的呈现方式完全取决于控件模板的实现,而控件模板描述如何表示数据项。
与 DataGrid 控件一样,DataList 和 Repeater 也支持 DataSource 属性,该属性可设置为任何 ICollection、IEnumerable 或 IListSource 类型。此 DataSource 中的数据通过其 DataBind 方法绑定到控件。绑定了数据后,每个数据项的格式都由模板描述。
ItemTemplate 属性控制 DataSource 集合中每一项的呈现形式。在 ItemTemplate 内,可以定义任何任意表示代码(HTML 或其他)。使用 ASP.NET 数据绑定语法,可以将数据绑定中的值插入 DataList 或 Repeater 控件,如下例所示。
<ASP:Repeater id="MyRepeater" runat="server">
<ItemTemplate>
Hello <%# DataBinder.Eval(Container.DataItem, "name") %> !
</ItemTemplate>
</ASP:Repeater>
Container 表示直接层次结构中支持 System.Web.UI.INamingContainer 标记接口的第一个控件。本例中,Container 解析为 System.Web.UI.WebControls.RepeaterItem 类型的对象,而该类型具有 DataItem 属性。当 Repeater 在 DataSource 集合上迭代时,DataItem 随之包含该集合的当前项。例如,如果将数据源设置为 Employee 对象的 ArrayList,则 DataItem 是 Employees 类型。当绑定到 DataView 时,DataItem 是 DataRowView 类型。
下面的示例说明绑定到 DataView(从 SQL 查询返回的)的 Repeater 控件。还定义了 HeaderTemplate 和 FooterTemplate,它们分别在列表的开头和末尾呈现。
Repeater 控件只是在绑定数据上迭代,为 DataSource 集合中的每一项呈现一次 ItemTemplate。除了其模板中包含的元素外,它不呈现任何内容。Repeater 是一个通用用途的迭代程序,而 DataList 提供了一些控制列表布局的附加功能。与 Repeater 不同,DataList 呈现模板定义外的其他元素(如表行及包含样式属性的单元格和跨距),以启用这种更丰富的格式设置。例如,DataList 支持 RepeatColumns 和 RepeatDirection 属性,这两个属性指定数据是否应在多列中呈现,以及数据项的呈现方向(垂直方向或水平方向)。DataList 还支持样式属性,如下例所示。
<ASP:DataList runat="server" DataSource="<%#MyData%>"
RepeatColumns="2"
RepeatDirection="Horizontal"
ItemStyle-Font-Size="10pt"
ItemStyle-Font-Name="Verdana"
>
...
</ASP:DataList>
注意:本节的其余部分集中描述 DataList 控件的许多功能。有关 Repeater 控件的更多信息,请参考本教程 Web 窗体控件引用一节中的 Repeater 主题。
下面的示例说明 DataList 控件的用法。注意上一示例中的数据项外观已更改,仅仅是通过更改控件的 ItemTemplate 属性的内容。RepeatDirection 和 RepeatColumns 属性确定 ItemTemplates 的布局。
下面的示例通过再次更改 ItemTemplate 进一步说明模板的无限灵活性。这一次,DataItem 的一个值已替换为 <img> 标记的"src"属性。DataBinder.Eval 的 格式 String 参数也已用于将查询字符串中的 DataItem 值替换为 URL。
从模板处理回发
与 DataGrid 中一样,可以从 DataList 模板内激发传递到与 DataList 本身连接的事件处理程序的命令。例如,ItemTemplate 内的 LinkButton 可以激发 Select 命令。通过设置 DataList 的 OnSelectedIndexChanged 属性,可以调用事件处理程序响应此命令。下面的示例说明此过程。
<ASP:DataList id="MyDataList" OnSelectedIndexChanged="MyDataList_Select" runat="server">
<ItemTemplate>
<asp:linkbutton CommandName="Select" runat="server">
<%# DataBinder.Eval(Container.DataItem, "title") %>
</asp:linkbutton>
</ItemTemplate>
</ASP:DataList>
下面的示例说明此代码的运行。在 MyDataList_Select 事件处理程序中,用特定选定项的详细内容填充其他若干服务器控件。
注意,虽然 DataList 识别少数特殊命令(如 Select 和 Edit/Update/Cancel),但是在模板内激发的命令字符串可以是任意字符串。对于所有命令都激发 DataList 的 OnItemCommand。如前例所示,可以将该事件与处理程序连接。下面的示例说明如何完成此操作。