前序:分页控件.ascx和页面之间沟通的方式有很多(读者可以去网上找找),这里的分页后台控件跟页面间的沟通方式是用了ViewState来记录当前的CurrentPage,通过分页类获取PageCount,ItemCount返回给分页控件。(当数据上百万(我测试的时候是250万)的时候,这个分页控件有点慢2-5秒,主要是由于绑定后面的DropDownList,读者可以自己改成输入数字的方式,我正在修改)。
前台分页控件就非常好用,做的时候参考了张子阳的分页控件,测试的时候翻页页面几乎不动。^_^,其实这些跟控件没有关系,就跟分页的SQL有关系,控件只是展示用的。btw,我用的是SQL语句,没有用存储过程。
![分页效果图](https://i-blog.csdnimg.cn/blog_migrate/e56c9b8fc3b22d19450cf006ca810f12.jpeg)
1.2.控件用法:
//四个LinkButton的代码:
protected void lbFirstPage_Click(object sender, EventArgs e)
{
CurrentPage = 1;
}
protected void lbPreviousPage_Click(object sender, EventArgs e)
{
if (CurrentPage > 1)
{
CurrentPage = CurrentPage - 1;
}
}
protected void lbNextPage_Click(object sender, EventArgs e)
{
if (CurrentPage < PageCount)
{
CurrentPage = CurrentPage + 1;
}
}
protected void lbLastPage_Click(object sender, EventArgs e)
{
CurrentPage = PageCount;
}
//1.3控件属性
private bool mbChanged = false;
#region property
public int PageCount
{
get
{
if (ViewState["PageCount"] == null) return 1;
else return (int)ViewState["PageCount"];
}
set
{
ddlPage.Items.Clear();
if (value < 1) value = 1;
for (int i = 1; i <= value; i++)
{
ddlPage.Items.Add(new ListItem("第" + i + "/" + value + "页", i.ToString()));
}
ViewState["PageCount"] = value;
}
}
public int ItemCount
{
set
{
lblPageInfo.Text = "(" + value + "条)";
}
}
public int CurrentPage
{
get
{
if (ViewState["CurrentPage"] == null) CurrentPage = 1;
return (int)ViewState["CurrentPage"];
}
set
{
ViewState["CurrentPage"] = value;
mbChanged = true;
}
}
public bool Changed
{
get { return mbChanged; }
}
#endregion
//1.4页面调用
private const int miPageSize = 10;
private bool mbRebind = false;
protected void Page_PreRender(object sender, EventArgs e)
{
if (myPaging.Changed) mbRebind = true;
if (!IsPostBack || mbRebind) BindData();
}
private void BindData()
{
string sKeyword = string.Empty;
string sOrderBy = string.Empty;
int iPageSize = miPageSize;
int? iTopCount = null; //当iTopCount<iPageSize,取后者.为null时获取所有数据.
int iCurrentPage = myPaging.CurrentPage;
int iItemCount;
int iPageCount;
MyPage.BLL.User user = new MyPage.BLL.User();
IList<UserInfo> userList = user.GetUserList("", sKeyword, sOrderBy, iPageSize, ref iTopCount, ref iCurrentPage, out iItemCount, out iPageCount);
rptMain.DataSource = userList;
rptMain.DataBind();
myPaging.CurrentPage = iCurrentPage;
myPaging.ItemCount = iItemCount;
myPaging.PageCount = iPageCount;
}
<2>前台控件
2.1还是先看效果图
2.2代码贴上来可能太多,放不下。该控件没有使用ViewState
2.3大致思路:控件可以设置当前页面的前后几页,比如当前1996页,计算出1996的前三页,后四页,然后做一个for循环:
list.InnerHtml += "共<font color=blue>" + itemCount + "</font>条 ";
list.InnerHtml += string.Format("第{0}页/共{1}页", currentPage, pageCount);
list.InnerHtml += "<a href=" + pageUrl + "Page=1>«</a> ";
list.InnerHtml += "<a href=" + pageUrl + "Page=" + GetPage(currentPage - 1) + "><</a> ";
ShowStartPage(); //计算当前页的前三页.
ShowEndPage(); //计算当前页的后四页.
for (int i = startPage; i <= endPage; i++)
{
if (i == currentPage)
{
list.InnerHtml += "<a href=" + pageUrl + "Page=" + i.ToString() + "><font style='color:red;'>" + i.ToString() + "</font></a> ";
}
else
{
list.InnerHtml += "<a href=" + pageUrl + "Page=" + i.ToString() + ">" + i.ToString() + "</a> ";
}
}
list.InnerHtml += "<a href=" + pageUrl + "Page=" + (currentPage + 1).ToString() + ">></a> ";
list.InnerHtml += "<a href=" + pageUrl + "Page=" + pageCount.ToString() + ">»</a>";
希望对你有帮助,谢谢!