repeater控件是Web服务器控件中的一个容器控件,它使您可以从页的任何可用数据中创建出自定义列表。Repeater不具备内置的呈现功能,这表示用户必须通过创建模板为Repeater控件提供布局。当该页运行时,repeater控件依次通过数据源中的记录呈现一个项。
假设我们显示复杂的数据可以用gridview,一般复杂的用dataList,那么简单的数据呈现呢?我们就用repeater,因为它简单、小巧、最主要是灵活。
repeater支持的模板:
例子:
说明:用到的数据库为pubs数据中的authors和titileauthor。
页面的设计如图所示:
html代码:
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="1.aspx.cs" Inherits="Repeater._1" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title></title>
</head>
<body>
<form id="form1" runat="server">
<div>
<asp:Repeater ID="Repeater1" runat="server"
onitemdatabound="Repeater1_ItemDataBound">
<HeaderTemplate>
<table width="500">
<tr style="background-color:#ccffcc">
<td>作者</td>
<td>书籍</td>
</tr>
</HeaderTemplate>
<ItemTemplate>
<tr>
<td><a href='aaa.aspx?id=<%# Eval("au_id") %>'><%#Eval("au_lname") %></a></td>
<td>
<asp:Repeater ID="Repeater2" runat="server" DataSource='<%#Eval("myrela") %>'>
<ItemTemplate>
<%--<%#Eval("[\"title_id\"]") %><br />--%>
<%#Eval("title_id") %><br />
</ItemTemplate>
</asp:Repeater>
</td>
</tr>
</ItemTemplate>
<SeparatorTemplate>
<tr>
<td colspan="2">
<hr size="1pt" />
</td>
</tr>
</SeparatorTemplate>
<FooterTemplate>
<tr>
<td colspan="2" style="font-size:12pt; color:#0099ff; background-color:#e6feda;">共<asp:Label ID="lblpc" runat="server" Text="Label"></asp:Label>页 当前为第<asp:Label ID="lblp" runat="server" Text="Label"></asp:Label>页
<asp:HyperLink ID="hlfir" runat="server" Text="首页"></asp:HyperLink>
<asp:HyperLink ID="hlp" runat="server" Text="上一页"></asp:HyperLink>
<asp:HyperLink ID="hln" runat="server" Text="下一页"></asp:HyperLink>
<asp:HyperLink ID="hlla" runat="server" Text="末页"></asp:HyperLink>
</td>
</tr>
</table>
</FooterTemplate>
</asp:Repeater>
</div>
</form>
</body>
</html>
页面的后台代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Configuration;
using System.Data;
using System.Data.SqlClient;
namespace Repeater
{
public partial class _1 : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
Repeater1.DataSource = pds();
Repeater1.DataBind();
}
}
private PagedDataSource pds()
{
string connstring = ConfigurationManager.ConnectionStrings["pubsConnectionString"].ConnectionString;
SqlConnection con = new SqlConnection(connstring);
SqlDataAdapter sda = new SqlDataAdapter("select * from authors", con);
DataSet ds = new DataSet();
sda.Fill(ds, "name");
SqlDataAdapter sda2 = new SqlDataAdapter("select * from titleauthor", con);
sda2.Fill(ds, "title");
//为上面建立的两个表创建一个关系,指明父列和子列的名称并为他们的关系命名,前面将会用到
ds.Relations.Add("myrela", ds.Tables["name"].Columns["au_id"], ds.Tables["title"].Columns["au_id"]);
PagedDataSource pds = new PagedDataSource();
pds.DataSource = ds.Tables["name"].DefaultView;
pds.AllowPaging = true;
pds.PageSize = 5;
pds.CurrentPageIndex = Convert.ToInt32(Request.QueryString["page"]);
return pds;
}
protected void Repeater1_ItemDataBound(object sender, RepeaterItemEventArgs e)
{
if (e.Item.ItemType== ListItemType.Footer)
{
int n = pds().DataSourceCount;
int i = pds().CurrentPageIndex;
Label lblpc = (Label)e.Item.FindControl("lblpc");
lblpc.Text = n.ToString();
Label lblp = (Label)e.Item.FindControl("lblp");
lblp.Text = Convert.ToString(pds().CurrentPageIndex + 1);
HyperLink hlfir = (HyperLink)e.Item.FindControl("hlfir");
hlfir.NavigateUrl="?page=0";
HyperLink hlla = (HyperLink)e.Item.FindControl("hlla");
hlla.NavigateUrl = "?page=" + Convert.ToInt32(n-1);
HyperLink hlp = (HyperLink)e.Item.FindControl("hlp");
HyperLink hln = (HyperLink)e.Item.FindControl("hln");
if (i<=0)
{
hlfir.Enabled = false;
hlp.Enabled = false;
hln.Enabled = true;
}
else
{
hlp.NavigateUrl = "?page=" + Convert.ToInt32(i-1);
}
if (i>n-2)
{
hln.Enabled = false;
hlla.Enabled = false;
hlp.Enabled = true;
}
else
{
hln.NavigateUrl = "?page=" + Convert.ToInt32(i+1);
}
}
}
}
}
显示效果如图:
总结:其实在前一段时间repeater控件用得挺多的,不过一些功能在做这个例子之前没有弄过,比如说通过代码实现分页(以前是用的分页控件。)、还有repeater的镶嵌、通过dataset让两个表建立关系、还有就是让repeater变得更加漂亮。(感觉那个订餐系统还可以再美观一下,呵呵。)