您的位置:首页 > 编程语言 > ASP

Asp.Net自定义分页控件(前台/后台)有图

2009-03-31 11:38 756 查看
Asp.Net自定义分页控件(前台/后台)有图
2008年10月15日 星期三 05:42 P.M.

用了一天的时间整理了上一家公司后台用的分页类和分页控件,然后结合网上的一些事例,因此有了前台分页控件,很实用的控件,在这里跟大家分享下。

前序:分页控件.ascx和页面之间沟通的方式有很多(读者可以去网上找找),这里的分页后台控件跟页面间的沟通方式是用了ViewState来记录当前的CurrentPage,通过分页类获取PageCount,ItemCount返回给分页控件。(当数据上百万(我测试的时候是250万)的时候,这个分页控件有点慢2-5秒,主要是由于绑定后面的DropDownList,读者可以自己改成输入数字的方式,我正在修改)。

前台分页控件就非常好用,做的时候参考了张子阳的分页控件,测试的时候翻页页面几乎不动。^_^,其实这些跟控件没有关系,就跟分页的SQL有关系,控件只是展示用的。btw,我用的是SQL语句,没有用存储过程。

<1>先来看后台控件:

1.1.截图:



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>";

希望对你有帮助,谢谢!

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: