ASP.NET Repeater_02_完整分页
本文内容
- 分页基本1
- 分页基本2
- 分页按钮在 Repeater 控件内
- 分页按钮在 Repeater 控件外
分页基本1
<%@ Page Language="C#" %>
<%@ Import Namespace="System.Data" %>
<!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>
<script runat="server">1:
2: private void BindData()3: {
4: DataTable dt = ASPDotNetRepeater.DataSource.CreateEMPDataSource();
5: PagedDataSource pds = new PagedDataSource();6: pds.DataSource = dt.DefaultView;
7: pds.AllowPaging = true;8: pds.PageSize = 2;
9: int CurPage;10: if (Request.QueryString["Page"] != null)11: {
12: CurPage = Convert.ToInt32(Request.QueryString["Page"]);13: }
14: else15: {
16: CurPage = 1;
17: }
18: pds.CurrentPageIndex = CurPage - 1;
19: int Count = pds.PageCount;20: CurrentPage.Text = "当前页:" + CurPage.ToString();21: PageSize.Text = Count.ToString();
22: if (!pds.IsFirstPage)23: {
24: this.First.NavigateUrl = Request.CurrentExecutionFilePath + "?Page=1";25: this.Last.NavigateUrl = Request.CurrentExecutionFilePath + "?Page=" + Convert.ToString(Count - 1); ;26: Front.NavigateUrl = Request.CurrentExecutionFilePath + "?Page=" + Convert.ToString(CurPage - 1);27: }
28: else29: {
30: this.First.Visible = false;31: this.Last.Visible = false;32: }
33: if (!pds.IsLastPage)34: {
35: Next.NavigateUrl = Request.CurrentExecutionFilePath + "?Page=" + Convert.ToString(CurPage + 1);36: }
37: else38: {
39: this.First.Visible = false;40: this.Last.Visible = false;41: }
42: Repeater1.DataSource = pds;
43: Repeater1.DataBind();
44: }
45: protected void Page_Load(object sender, EventArgs e)46: {
47: if (!IsPostBack)48: {
49: if (!IsPostBack)50: {
51: BindData();
52: this.First.Visible = true;53: this.Last.Visible = true;54: }
55: }
56: }
57:
</script>
</head>
<body>
<form id="form1" runat="server">
<table>
<tr>
<td align="left">
Repeater 控件
</td>
</tr>
<tr>
<td>
<asp:Repeater ID="Repeater1" runat="server">
<HeaderTemplate>
<table>
<tr>
<td>
自定义头模板
</td>
</tr>
</HeaderTemplate>
<ItemTemplate>
<tr>
<td>
<a href='Rec.aspx?id=<%#Eval("EMPNO") %>' target="_blank">
<%1: #Eval("ENAME")%></a>
</td>
</tr>
</ItemTemplate>
<AlternatingItemTemplate>
<tr>
<td>
<a href='Rec.aspx?id=<%#Eval("EMPNO") %>' target="_blank">
<%1: #Eval("ENAME")%></a>
</td>
</tr>
</AlternatingItemTemplate>
<FooterTemplate>
<tr>
<td>
自定义尾模板
</td>
</tr>
</table>
</FooterTemplate>
</asp:Repeater>
</td>
</tr>
<tr>
<td>
<asp:HyperLink ID="First" runat="server">首页</asp:HyperLink>
<asp:HyperLink ID="Front" runat="server">上一页</asp:HyperLink>
<asp:HyperLink ID="Next" runat="server">下一页</asp:HyperLink>
<asp:HyperLink ID="Last" runat="server">尾页</asp:HyperLink>
</td>
</tr>
<tr>
<td>
当前页为:<asp:Label ID="CurrentPage" runat="server" Text="Label"></asp:Label><br />
共
<asp:Label ID="PageSize" runat="server" Text="Label"></asp:Label>页
</td>
</tr>
</table>
</form>
</body>
</html>
说明
(1) Repeater 控件本身没有分页功能,但与其他类似的控件相比,它是比较底层的控件,尤其是它的分页功能;
(2) PagedDataSource 类的数据源必须是视图,如 DataTable.DefaultView,不能是 DataTable;
(3) 下一页、上一页等分页按钮不在 Repeater 里,而且分页的操作都在 BindData() 方法。
分页基本2
<%@ Page Language="C#" %>
<%@ Import Namespace="System.Data" %>
<!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>
<script runat="server">1:
2: public void BindData()3: {
4: DataTable dt = ASPDotNetRepeater.DataSource.CreateEMPDataSource();
5: PagedDataSource pds = new PagedDataSource();6: pds.DataSource = dt.DefaultView;
7: pds.AllowPaging = true;8: pds.PageSize = 2;
9:
10: int curpage = Convert.ToInt32(CurrentPage.Text);11: this.Next.Enabled = true;12: this.Front.Enabled = true;13: pds.CurrentPageIndex = curpage - 1;
14: if (curpage == 1)15: {
16: this.Front.Enabled = false;17: }
18: if (curpage == pds.PageCount)19: {
20: this.Next.Enabled = false;21: }
22: this.Repeater1.DataSource = pds;23: this.Repeater1.DataBind();24: }
25: protected void Page_Load(object sender, EventArgs e)26: {
27: if (!IsPostBack)28: {
29: CurrentPage.Text = "1";30: BindData();
31: }
32: }
33: protected void Front_Click(object sender, EventArgs e)34: {
35: this.CurrentPage.Text = Convert.ToString(Convert.ToInt32(CurrentPage.Text) - 1);36: BindData();
37: }
38: protected void Next_Click(object sender, EventArgs e)39: {
40: this.CurrentPage.Text = Convert.ToString(Convert.ToInt32(CurrentPage.Text) + 1);41: BindData();
42: }
43:
</script>
</head>
<body>
<form id="form1" runat="server">
<asp:Repeater ID="Repeater1" runat="server">
<HeaderTemplate>
<table>
<tr>
<td>
自定义头模板
</td>
</tr>
</HeaderTemplate>
<ItemTemplate>
<tr>
<td>
员工编号:<%1: # Eval("EMPNO")%>
</td>
<td>
员工姓名:<%1: # Eval("ENAME")%>
</td>
</tr>
</ItemTemplate>
<FooterTemplate>
<tr>
<td>
自定义脚模板
</td>
</tr>
</table>
</FooterTemplate>
</asp:Repeater>
当前页:<asp:Label ID="CurrentPage" runat="server"></asp:Label>
<br />
<asp:Button ID="Front" runat="server" OnClick="Front_Click" Text="上一页" />
<asp:Button ID="Next" runat="server" OnClick="Next_Click" Text="下一页" />
</form>
</body>
</html>
说明
(1) 本例通过单击两个按钮,查看上一页和下一页的内容;
(2) Repeater 控件通过 PagedDataSource 实现分页功能。一些本身具有分页功能的控件,如 GridView,也都是使用了 PagedDataSource 类,所以 PagedDataSource 是比较底层的一个类;
分页按钮在 Repeater 控件内
<%@ Page Language="C#" %>
<%@ Import Namespace="System.Data" %>
<!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>
<script runat="server">1:
2: private PagedDataSource pds()3: {
4: DataTable dt = ASPDotNetRepeater.DataSource.CreateEMPDataSource();
5: PagedDataSource pds = new PagedDataSource();6: pds.DataSource = dt.DefaultView;
7: pds.AllowPaging = true;8: pds.PageSize = 2;
9: pds.CurrentPageIndex = Convert.ToInt32(Request.QueryString["page"]);10: return pds;11: }
12: protected void Page_Load(object sender, EventArgs e)13: {
14: if (!IsPostBack)15: {
16: Repeater1.DataSource = pds();
17: Repeater1.DataBind();
18: }
19: }
20: protected void Repeater1_ItemDataBound(object sender, RepeaterItemEventArgs e)21: {
22: if (e.Item.ItemType == ListItemType.Footer)23: {
24: DropDownList jump = (DropDownList)e.Item.FindControl("Jump");25: HyperLink first = (HyperLink)e.Item.FindControl("First");26: HyperLink front = (HyperLink)e.Item.FindControl("Front");27: HyperLink next = (HyperLink)e.Item.FindControl("Next");28: HyperLink last = (HyperLink)e.Item.FindControl("Last");29: Label currentPage = (Label)e.Item.FindControl("CurrentPage");30: Label pageSize = (Label)e.Item.FindControl("PageSize");31:
32: PagedDataSource pds = this.pds();33: pds.CurrentPageIndex = jump.SelectedIndex;
34: int n = Convert.ToInt32(pds.PageCount);35: int i = Convert.ToInt32(pds.CurrentPageIndex);36: currentPage.Text = Convert.ToString(pds.CurrentPageIndex + 1);
37: pageSize.Text = n.ToString();
38:
39: if (!IsPostBack)40: {
41: for (int j = 0; j < n; j++)42: {
43: jump.Items.Add(Convert.ToString(j + 1));
44: }
45: }
46: if (i <= 0)47: {
48: first.Enabled = false;49: front.Enabled = false;50: last.Enabled = true;51: next.Enabled = true;52: }
53: else54: {
55: front.NavigateUrl = "?page=" + (i - 1);56: }
57: if (i >= n - 1)58: {
59: first.Enabled = true;60: last.Enabled = false;61: next.Enabled = false;62: front.Enabled = true;63: }
64: else65: {
66: next.NavigateUrl = "?page=" + (i + 1);67: }
68: first.NavigateUrl = "?page=0";69: last.NavigateUrl = "?page=" + (n - 1);70: jump.SelectedIndex = Convert.ToInt32(pds.CurrentPageIndex);
71: }
72: }
73: protected void Jump_SelectedIndexChanged(object sender, EventArgs e)74: {
75: string pageIndex = Convert.ToString((Convert.ToInt32(((DropDownList)sender).SelectedValue) - 1));76: Response.Redirect("PagingUsingRepeaterHandle.aspx?page=" + pageIndex);77: }
78:
</script>
</head>
<body>
<form id="form1" runat="server">
<asp:Repeater ID="Repeater1" runat="server" OnItemDataBound="Repeater1_ItemDataBound">
<HeaderTemplate>
<table width="500">
<tr>
<td>
员工姓名
</td>
<td>
出生日期
</td>
</tr>
</HeaderTemplate>
<ItemTemplate>
<tr>
<td>
<a href='Rec.aspx?id=<%# Eval("EMPNO")%>'>
<%1: # Eval("ENAME")%></a>
</td>
<td>
<%1: # Eval("HIREDATE")%>
</td>
</tr>
</ItemTemplate>
<SeparatorTemplate>
<tr>
<td colspan="2">
<hr style="border-top: 1pt;" />
</td>
</tr>
</SeparatorTemplate>
<FooterTemplate>
<tr>
<td colspan="2" style="font-size: 12pt">
<asp:HyperLink ID="First" runat="server" Text="首页"></asp:HyperLink>
<asp:HyperLink ID="Front" runat="server" Text="上一页"></asp:HyperLink>
<asp:HyperLink ID="Next" runat="server" Text="下一页"></asp:HyperLink>
<asp:HyperLink ID="Last" runat="server" Text="尾页"></asp:HyperLink>
第
<asp:Label ID="CurrentPage" runat="server" Text="Label"></asp:Label>页 共<asp:Label
ID="PageSize" runat="server" Text="Label"></asp:Label>页 跳至第<asp:DropDownList ID="Jump"
runat="server" AutoPostBack="true" OnSelectedIndexChanged="Jump_SelectedIndexChanged">
</asp:DropDownList>
页
</td>
</tr>
</table>
</FooterTemplate>
</asp:Repeater>
</form>
</body>
</html>
分页按钮在 Repeater 控件外
<%@ Page Language="C#" %>
<%@ Import Namespace="System.Data" %>
<!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>
<script runat="server">1:
2: protected void Page_Load(object sender, EventArgs e)3: {
4: if (!IsPostBack)5: {
6: this.CurrentPage.Text = "1";7: this.BindData();8: }
9: }
10: public void BindData()11: {
12: DataTable dt = ASPDotNetRepeater.DataSource.CreateEMPDataSource();
13: PagedDataSource pds = new PagedDataSource();14: pds.DataSource = dt.DefaultView;
15: pds.AllowPaging = true;16: pds.PageSize = 2;
17: pds.CurrentPageIndex = Convert.ToInt32(this.CurrentPage.Text) - 1;18:
19: PageSize.Text = pds.PageCount.ToString();
20: CurrentPage.Text = (pds.CurrentPageIndex + 1).ToString();
21: this.Front.Enabled = true;22: this.First.Enabled = true;23: this.Next.Enabled = true;24: this.Last.Enabled = true;25:
26:
27: if (!IsPostBack)28: {
29: for (int j = 0; j < pds.PageCount; j++)30: {
31: this.Jump.Items.Add(Convert.ToString(j + 1));32: }
33: }
34:
35: if (pds.CurrentPageIndex < 1)36: {
37: this.Front.Enabled = false;38: this.First.Enabled = false;39: }
40: if (pds.CurrentPageIndex == pds.PageCount - 1)41: {
42: this.Next.Enabled = false;43: this.Last.Enabled = false;44: }
45: Repeater1.DataSource = pds;
46: Repeater1.DataBind();
47: }
48: protected void First_Click(object sender, EventArgs e)49: {
50: this.CurrentPage.Text = "1";51: this.BindData();52: }
53: protected void Front_Click(object sender, EventArgs e)54: {
55: this.CurrentPage.Text = Convert.ToString(Convert.ToInt32(CurrentPage.Text) - 1);56: this.BindData();57: }
58: protected void Next_Click(object sender, EventArgs e)59: {
60: this.CurrentPage.Text = Convert.ToString(Convert.ToInt32(CurrentPage.Text) + 1);61: this.BindData();62: }
63: protected void Last_Click(object sender, EventArgs e)64: {
65: this.CurrentPage.Text = this.PageSize.Text;66: this.BindData();67: }
68: protected void Jump_SelectedIndexChanged(object sender, EventArgs e)69: {
70: string pageIndex = Convert.ToString((Convert.ToInt32(((DropDownList)sender).SelectedValue) - 1));71: this.CurrentPage.Text = pageIndex;72: this.BindData();73: }
74:
</script>
</head>
<body>
<form id="form1" runat="server">
<table>
<asp:Repeater ID="Repeater1" runat="server">
<ItemTemplate>
<tr>
<% 1: --前台也可以调用后台的自定义函数--
%>
<td>
<a href="">
<%1: # DataBinder.Eval(Container.DataItem,"[EMPNO]")%></a>
</td>
<td>
<a href="">
<%1: # DataBinder.Eval(Container.DataItem,"[ENAME]")%></a>
</td>
</tr>
</ItemTemplate>
</asp:Repeater>
</table>
<table border="1">
<tr>
<td>
<asp:LinkButton ID="First" runat="server" OnClick="First_Click">页首</asp:LinkButton>
<asp:LinkButton ID="Front" runat="server" OnClick="Front_Click">上一页</asp:LinkButton>
<asp:LinkButton ID="Next" runat="server" OnClick="Next_Click">下一页</asp:LinkButton>
<asp:LinkButton ID="Last" runat="server" OnClick="Last_Click">页尾</asp:LinkButton>
第<asp:Label ID="CurrentPage" runat="server" Text="Label"></asp:Label>页/共<asp:Label
ID="PageSize" runat="server" Text="Label"></asp:Label>页 跳至<asp:DropDownList ID="Jump"
runat="server" AutoPostBack="true" OnSelectedIndexChanged="Jump_SelectedIndexChanged">
</asp:DropDownList>
</td>
</tr>
</table>
</form>
</body>
</html>
说明
(1) 将分页按钮放在了 Repeater 的 FooterTemplate,所以要实现分页功能,就需要 Repeater 的 ItemDataBound 事件,该事件在数据绑定后,并在数据显示前出发;
(2) 必须用视图 DataTable.DefaultView 给 PagedDataSource.DataSource 赋值;
(3) 传递页码的方式是采用通过超链接向当前页面传参数。