Repeater控件
Repeater 控件使用列表方式来显示数据,能够让用户定义 Template 模板标记,自动用模板标记的项目,像循环那样重复编排数据源的数据,其基本语法如下所示。
<asp:Repeater Id="repeater" Runat="server">
<HeaderTemplate> </HeaderTemplate>
<ItemTemplate> </ItemTemplate>
<AlternatingItemTemplate> </AlternatingItemTemplate>
<FooterTemplate> </FooterTemplate>
</asp:Repeater>
上述Repeater 控件使用 Template 模板标记(标记内容可以使用 HTML 标记)编排数据。各种Template 标记的说明如表10-4所示。
表10-4 Template 标记的说明
Template 模板标记 | 说 明 |
ItemTemplate | 定义列表项目,也就是重复显示部分,对数据表来说是每一条记录,此为必须标记 |
AlternatingItemTemplate | 项目交叉使用不同样式的模板,例如,记录轮流使用不同色彩显示,可以定义此标记,奇数项目(以 0 开始)使用此模板显示,偶数项目使用 ItemTemplate 模板 |
SeparatorTemplate | 项目分隔模板,可以定义分隔标记,通常使用 HTML 标记 <br> 或 <hr>,如果没有定义就不显示 |
HeaderTemplate | 定义列表标题,对数据表来说,就是 <table> 和记录的标题列,如果没有定义就不显示 |
FooterTemplate | 定义列表脚注,对数据表来说,就是结尾标记 </table>,如果没有定义就不显示 |
10.2.1 Repeater控件以表格显示数据表
Repeater 控件的功能如同 Visual Basic 的 For/Next 循环,换句话说,配合 HTML 表格标记和数据源控件,就可以使用表格来显示数据表的记录数据。
首先创建数据源控件为 Products 数据库,如下所示。
<asp:AccessDataSource Id="Products" Runat="server"
DataFile="~/Products.mdb"
SelectCommand="SELECT * FROM Products"/>
上述标记建立数据库的数据源后,Repeater 控件可以使用 Template 标记编排记录数据。Template 模板标记内容中的 HTML 表格标记如表10-5所示。
表10-5 Template模板标记内容中的HTML表格标记
Template 模板标记 | 表 格 标 记 |
ItemTemplate | <tr> <td><%#Eval("ProductNo")%></td> <td><%#Eval("ProductName")%></td> <td><%# Eval("ProductPrice")%></td> </tr> |
AlternatingItemTemplate | <tr bgcolor="lightyellow"> <td><%# Eval("ProductNo")%></td> <td><%# Eval("ProductName")%></td> <td><%# Eval("ProductPrice")%></td> </tr> |
HeaderTemplate | <table border="1" cellspacing="0" cellpadding="5"> <tr bgcolor="FFCC99"> <td>书号</td><td>书名</td><td>书价</td> </tr> |
FooterTemplate | </table> |
Repeater 控件首先显示 HeaderTemplate 后,依数据表的记录数重复显示 ItemTemplate 和 AlternativeItemTemplate 标记,最后显示 FoolterTemplate 模板标记的内容。
在<td>标记中每一个单元格使用“<%#”符号和“%>”符号标记为表达式,此例是获取和显示指定数据表字段内容,如下所示。
<%# Eval("ProductNo")%>
上述程序代码的参数字符串是数据表的字段名称,此为 ASP.NET 2.0 的写法。1.0/1.1 版的写法如下所示。
<%# Container.DataItem("ProductNo")%>
上述 Container 属性可以参考 RepeaterItem 对象,然后使用 RepeaterItem 对象的属性 DataItem 获取字段值。
1. ASP.NET程序:Ch10-2-1.aspx
在 ASP.NET 程序中使用 Repeater 和 AccessDataSource 控件,用表格显示数据表的记录数据,如下所示。
01: <html>
02: <head><title>Ch10-2-1.aspx</title></head>
03: <body>
04: <h3>Repeater控件 - 数据源控件</h3>
05: <form Runat="server">
06: <asp:AccessDataSource Id="Products" Runat="server"
07: DataFile="~/Products.mdb"
08: SelectCommand="SELECT * FROM Products"/>
09: <asp:Repeater Id="repeater" Runat="server"
10: DataSourceID="Products">
11: <HeaderTemplate>
12: <table border="1" cellspacing="0" cellpadding="5">
13: <tr bgcolor="FFCC99">
14: <td>书号</td><td>书名</td><td>书价</td>
15: </tr>
16: </HeaderTemplate>
17: <ItemTemplate>
18: <tr>
19: <td><%# Eval("ProductNo")%></td>
20: <td><%# Eval("ProductName")%></td>
21: <td><%# Eval("ProductPrice")%></td>
22: </tr>
23: </ItemTemplate>
24: <AlternatingItemTemplate>
25: <tr bgcolor="lightyellow">
26: <td><%# Eval("ProductNo")%></td>
27: <td><%# Eval("ProductName")%></td>
28: <td><%# Eval("ProductPrice")%></td>
29: </tr>
30: </AlternatingItemTemplate>
31: <FooterTemplate>
32: </table>
33: </FooterTemplate>
34: </asp:Repeater>
35: </form>
36: </body>
37: </html>
2. 程序说明
第6~8行是AccessDataSource 控件,建立 Products 数据库的数据源,SQL 查询命令可以提取 Products 数据表的所有记录和字段。
第9~34行是 Repeater 控件,第19~21行和26~28行的表达式显示数据表记录的字段数据。
3. 网页预览
将Ch10文件夹建立为虚拟目录后,启动浏览程序执行 ASP.NET 程序,可以看到表格显示的记录数据,如图10-3所示。
图10-3 Ch10-2-1.aspx运行结果
上图使用表格显示数据表的记录数据,每一条记录交叉显示不同色彩,分别是 ItemTemplate 和 AlternativeItemTemplate 模板标记的 <tr> 表格行标记显示的记录数据。
Repeater 控件也可以使用数据绑定方式获取数据源,如下所示。
repeater.DataSource = objCmd.ExecuteReader()
repeater.DataBind()
上述程序代码的repeater是Repeater控件,完整程序范例是Ch10-2-1Script.aspx。
10.2.2 Null值字段处理与ItemIndex属性
记录字段值如果是空值 Null,显示的单元格数据是空字符串。为了让单元格具有值,例如N/A 或 "没有值" 等字符串。可以建立 showNull()函数来检查字段值,如下所示。
Function showNull(value As String )As String
If value = "" Then
Return "[N/A]"
Else
Return value
End If
End Function
上述函数检查参数字符串,如果字符串为空值,就返回 " [N/A]" 字符串。在 Repeater 控件的表达式中只需要改成上述函数,如下所示。
<%# showNull(Eval("ProductName").ToString())%>
上述程序代码将字段值使用 ToString()方法转换成字符串后,使用 showNull()函数检查是否为空字符串。
程序范例的 Repeater 控件是使用列表项目来显示记录数据,可以使用 RepeaterItem 对象的 ItemIndex 属性显示列表项目编号,如下所示。
<%# Container.ItemIndex + 1 %>
上述程序代码因为 ItemIndex 值是从 0 开始,所以加 1 显示。
1. ASP.NET程序:Ch10-2-2.aspx
在 ASP.NET 程序中使用 Repeater 和 AccessDataSource 控件,以项目编号的列表方式来显示数据表指定字段的记录数据,如下所示。
01: <%@ Page Language="VB" %>
02: <script Runat="server">
03: Function showNull(value As String )As String
04: If value = "" Then
05: Return "[N/A]"
06: Else
07: Return value
08: End If
09: End Function
10: </script>
11: <html>
12: <head><title>Ch10-2-2.aspx</title></head>
13: <body>
14: <h3>Repeater控件 - Null值字段与ItemIndex</h3>
15: <form Runat="server">
16: <asp:AccessDataSource Id="Products" Runat="server"
17: DataFile="~/Products.mdb"
18: SelectCommand="SELECT * FROM Products"/>
19: <asp:Repeater Id="repeater" Runat="server"
20: DataSourceID="Products">
21: <ItemTemplate>
22: <font color="red">
23: <%# Container.ItemIndex + 1 %> :
24: <%# showNull(Eval("ProductName").ToString())%> -
25: <%# showNull(Eval("ProductNote").ToString())%>
26: </font>
27: </ItemTemplate>
28: <AlternatingItemTemplate>
29: <font color="blue">
30: <%# Container.ItemIndex + 1 %> :
31: <%# showNull(Eval("ProductName").ToString())%> -
32: <%# showNull(Eval("ProductNote").ToString())%>
33: </font>
34: </AlternatingItemTemplate>
35: <SeparatorTemplate>
36: <br>
37: </SeparatorTemplate>
38: </asp:Repeater>
39: </form>
40: </body>
41: </html>
2. 程序说明
第3~9行是showNull()函数,第16~18行是数据源控件,第19~38行是 Repeater控件,第21~27行是ItemTemplate标记,第28~34行是AlternativeItemTemplate标记。
第23行和30行显示ItemIndex属性值,第35~37行是SeparatorTemplate标记,使用<br>标记分隔列表选项。
3. 网页预览
将Ch10文件夹建立为虚拟目录后,启动浏览程序执行 ASP.NET 程序,可以看到 Repeater 控件以项目编号显示的记录数据,如图10-4所示。
图10-4 Ch10-2-2.aspx运行结果
上图使用项目编号显示记录数据,第1条记录的ProductNote字段是空值,所以显示 [N/A],因为SeparatorTemplate 标记是<br>标记,所以项目会分行显示