WebForms Repeater学习笔记

WebForms Repeater是ASP.NET Web Forms中的一个数据绑定控件,它可以将数据源中的数据按照指定的模板进行展示。它通常用于展示数据库中的数据,如列表、表格等。

使用Repeater进行数据绑定

使用Repeater进行数据绑定非常简单,步骤如下:

  1. 在aspx页面中添加Repeater控件,并设置其DataSource属性为需要绑定的数据源。
Copy Code
<asp:Repeater ID="rptData" runat="server" DataSource='<%# Data %>'>
  1. 在Repeater中定义模板,用于展示每一条记录。例如,我们看一下一个简单的例子。假设我们有一个Person类,其中包含Name和Age两个属性。我们想要在Repeater中展示一组Person对象的姓名和年龄信息。那么我们可以这样定义模板:
Copy Code
<asp:Repeater ID="rptData" runat="server" DataSource='<%# Data %>'> <ItemTemplate> <div> <%# Eval("Name") %> : <%# Eval("Age") %> </div> </ItemTemplate> </asp:Repeater>
  1. 最后,在Code Behind中给Data属性赋值,触发数据绑定。
Copy Code
protected void Page_Load(object sender, EventArgs e) { if(!IsPostBack) { List<Person> persons = GetPersons(); rptData.DataSource = persons; rptData.DataBind(); } }

Repeater的常用属性和方法

在使用Repeater时,我们经常需要用到一些其它属性和方法,例如:

  1. SeparatorTemplate:定义数据项之间的分隔符模板。
Copy Code
<SeparatorTemplate> <hr /> </SeparatorTemplate>
  1. HeaderTemplate和FooterTemplate:定义表头和表尾模板。
Copy Code
<HeaderTemplate> <div> <h1>人员列表</h1> </div> </HeaderTemplate> <FooterTemplate> <div> <p>共有 <%# Data.Count %> 个人员记录。</p> </div> </FooterTemplate>
  1. OnItemDataBound事件:处理每一个数据项绑定时触发的事件。
Copy Code
protected void rptData_ItemDataBound(object sender, RepeaterItemEventArgs e) { if(e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem) { Label lblName = (Label)e.Item.FindControl("lblName"); Person person = (Person)e.Item.DataItem; lblName.Text = person.Name.ToUpper(); } }

Repeater实例

最后,让我们看一个完整的Repeater实例,它展示了Employee对象的姓名、年龄和职位信息,并且包含分页。代码如下:

htmlCopy Code
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="RepeaterExample.aspx.cs" Inherits="WebFormsDemo.RepeaterExample" %> <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head runat="server"> <title></title> </head> <body> <form id="form1" runat="server"> <div> <asp:Repeater ID="rptEmployees" runat="server" DataSource='<%# Employees %>' OnItemDataBound="rptEmployees_ItemDataBound"> <HeaderTemplate> <table border="1"> <tr> <th>姓名</th> <th>年龄</th> <th>职位</th> </tr> </HeaderTemplate> <ItemTemplate> <tr> <td><%# Eval("Name") %></td> <td><%# Eval("Age") %></td> <td><%# Eval("Title") %></td> </tr> </ItemTemplate> <FooterTemplate> </table> <asp:Literal ID="litPager" runat="server"></asp:Literal> </FooterTemplate> </asp:Repeater> </div> </form> </body> </html>
csharpCopy Code
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; namespace WebFormsDemo { public partial class RepeaterExample : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { if(!IsPostBack) { BindData(); } } private List<Employee> _allEmployees; private const int PAGE_SIZE = 10; private void BindData() { _allEmployees = GetEmployees(); rptEmployees.DataSource = _allEmployees.Take(PAGE_SIZE); rptEmployees.DataBind(); BuildPager(); } private void BuildPager() { int currentPage = GetCurrentPage(); int pageCount = GetPageCount(); string pagerHtml = "<ul>"; if(currentPage > 1) { pagerHtml += $"<li><a href='?page={currentPage-1}'>上一页</a></li>"; } for(int i=1;i<=pageCount;i++) { pagerHtml += $"<li><a href='?page={i}'>{i}</a></li>"; } if(currentPage < pageCount) { pagerHtml += $"<li><a href='?page={currentPage+1}'>下一页</a></li>"; } pagerHtml += "</ul>"; litPager.Text = pagerHtml; } private int GetCurrentPage() { return string.IsNullOrEmpty(Request.QueryString["page"]) ? 1 : Convert.ToInt32(Request.QueryString["page"]); } private int GetPageCount() { return (int)Math.Ceiling((double)_allEmployees.Count / PAGE_SIZE); } private List<Employee> GetEmployees() { List<Employee> employees = new List<Employee>(); employees.Add(new Employee() { Name = "Tom", Age = 28, Title = "CEO" }); employees.Add(new Employee() { Name = "Jerry", Age = 25, Title = "Manager" }); //...省略其它员工信息... return employees; } protected void rptEmployees_ItemDataBound(object sender, RepeaterItemEventArgs e) { if(e.Item.ItemType == ListItemType.Header || e.Item.ItemType == ListItemType.Footer) { return; } Employee employee = (Employee)e.Item.DataItem; if(employee.Title == "CEO") { e.Item.BackColor = System.Drawing.Color.Yellow; } } protected List<Employee> Employees { get { int currentPage = GetCurrentPage(); int startIndex = (currentPage - 1) * PAGE_SIZE; return _allEmployees.Skip(startIndex).Take(PAGE_SIZE).ToList(); } } } public class Employee { public string Name { get; set; } public int Age { get; set; } public string Title { get; set; } } }

这个实例演示了如何在Repeater中展示Employee对象的信息,并且支持分页。在Page_Load方法中,我们先获取所有的Employee信息,然后根据当前需要展示的页码取出一部分数据进行展示。同时,我们还通过BuildPager方法构建了一个分页控件,并通过OnItemDataBound事件处理了CEO的特殊样式。