WebForms Repeater学习笔记
WebForms Repeater是ASP.NET Web Forms中的一个数据绑定控件,它可以将数据源中的数据按照指定的模板进行展示。它通常用于展示数据库中的数据,如列表、表格等。
使用Repeater进行数据绑定
使用Repeater进行数据绑定非常简单,步骤如下:
- 在aspx页面中添加Repeater控件,并设置其DataSource属性为需要绑定的数据源。
Copy Code<asp:Repeater ID="rptData" runat="server" DataSource='<%# Data %>'>
- 在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>
- 最后,在Code Behind中给Data属性赋值,触发数据绑定。
Copy Codeprotected void Page_Load(object sender, EventArgs e)
{
if(!IsPostBack)
{
List<Person> persons = GetPersons();
rptData.DataSource = persons;
rptData.DataBind();
}
}
Repeater的常用属性和方法
在使用Repeater时,我们经常需要用到一些其它属性和方法,例如:
- SeparatorTemplate:定义数据项之间的分隔符模板。
Copy Code<SeparatorTemplate>
<hr />
</SeparatorTemplate>
- HeaderTemplate和FooterTemplate:定义表头和表尾模板。
Copy Code<HeaderTemplate>
<div>
<h1>人员列表</h1>
</div>
</HeaderTemplate>
<FooterTemplate>
<div>
<p>共有 <%# Data.Count %> 个人员记录。</p>
</div>
</FooterTemplate>
- OnItemDataBound事件:处理每一个数据项绑定时触发的事件。
Copy Codeprotected 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 Codeusing 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的特殊样式。