分页是Web应用程序中最常用到的功能之一,在asp.net中,虽然自带了一些可以分页的数据控件,但其分页功能并不尽如人意。本文对于这些数据控件的假分页暂且不表,如有不明白的同学请百Google度之。
本文中实现的分页控件是在手动分页基础上做的改善,将分页实现的逻辑部分和数据控件的绑定尽可能分开,以克服手工编写分页代码任务繁琐、代码重用率低等问题。
本文依旧是一粒粟子。
本文中将介绍两种将分页实现逻辑与数据控件绑定分离的实现方式:
PagingHelper.ascx:
<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="PagingHelper.ascx.cs" Inherits="PagingHelper.Controls.PagingHelper" %>
<div style="width:100%">
<asp:LinkButton ID="lbtnFirstPage" runat="server" CausesValidation="false" onclick="lbtnPage_Click" >首页</asp:LinkButton>
<asp:LinkButton ID="lbtnPRevPage" runat="server" CausesValidation="false" onclick="lbtnPage_Click" >上一页</asp:LinkButton>
第<asp:Label ID="lbPageIndex" runat="server" Text=""></asp:Label>
页/共<asp:Label ID="lbTotalPages" runat="server" Text=""></asp:Label>
页
<asp:LinkButton ID="lbtnNextPage" runat="server" CausesValidation="false" onclick="lbtnPage_Click" >下一页</asp:LinkButton>
<asp:LinkButton ID="lbtnLastPage" runat="server" CausesValidation="false" onclick="lbtnPage_Click" >尾页</asp:LinkButton>
</div>
PagingHelper.ascx.cs:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.HtmlControls;
using System.Reflection;
namespace PagingHelper.Controls
{
public partial class PagingHelper : System.Web.UI.UserControl
{
#region 属性
private int m_PageSize;
public int PageSize //每页显示记录数
{
set
{
m_PageSize = value;
}
get
{
if (m_PageSize.Equals(0))
{
m_PageSize = 10;
}
return m_PageSize;
}
}
private int m_PageIndex;
public int PageIndex //当前页页码
{
set
{
m_PageIndex = value;
}
get
{
if (m_PageIndex.Equals(0))
{
m_PageIndex = 1;
}
return m_PageIndex;
}
}
public int TotalItemCount //记录总数
{
set;
private get;
}
public string BindDataMethodName //绑定数据的方法名
{
set;
private get;
}
#endregion
#region 受保护的方法
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
BindPagingHelperControl();
}
}
protected void lbtnPage_Click(object sender, EventArgs e)
{
LinkButton lbtn = sender as LinkButton;
ReBindData(lbtn.CommandArgument);
}
#endregion
#region 公共方法
#endregion
#region 私有方法
private void BindPagingHelperControl()
{
int totalPages = (TotalItemCount % PageSize) == 0 ? TotalItemCount / PageSize : TotalItemCount / PageSize + 1;
//显示
lbPageIndex.Text = PageIndex.ToString();
lbTotalPages.Text = totalPages.ToString();
//使能
lbtnFirstPage.Enabled = PageIndex > 1;
lbtnPrevPage.Enabled = PageIndex > 1;
lbtnLastPage.Enabled = PageIndex < totalPages;
lbtnNextPage.Enabled = PageIndex < totalPages;
//命令
lbtnFirstPage.CommandArgument = "1";
lbtnPrevPage.CommandArgument = (PageIndex - 1).ToString();
lbtnNextPage.CommandArgument = (PageIndex + 1).ToString();
lbtnLastPage.CommandArgument = totalPages.ToString();
}
private void ReBindData(string pageIndex)
{
PageIndex = int.Parse(pageIndex);
Object obj = null; //空间所在的容器
if (base.Parent is HtmlForm)
{
obj = this.Page;
}
else if (base.Parent is ContentPlaceHolder)
{
obj = this.Page.Master.Page;
}
else
{
obj = base.Parent;
}
MethodInfo methodInfo = obj.GetType().GetMethod(BindDataMethodName, BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic);
methodInfo.Invoke(obj, null);
BindPagingHelperControl();
}
#endregion
}
}
Default.aspx:
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="PagingHelper.Default" %>
<%@ Register src="Controls/PagingHelper.ascx" tagname="PagingHelper" tagprefix="uc1" %>
<!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:GridView ID="gvDemo" runat="server">
</asp:GridView>
<br />
<uc1:PagingHelper ID="PagingHelper1" runat="server" PageSize="2" />
</div>
</form>
</body>
</html>
Default.aspx.cs:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Data;
namespace PagingHelper
{
public partial class Default : System.Web.
新闻热点
疑难解答