C#自己写的一个自定义分页控件

C#自己写的一个自定义分页控件(源码下载,没有DEMO)

分页以前一直是用第三方分页控件AspNetPager.dll,使用起来也挺方便的,就是样式设置起来感觉不是很好,于是经理决定我们自己做一个分页控件,这个任务就交到我的手上。这个自定义分页控件是模仿58同城的分页及结合我们现在项目的需要写的。感觉比较实用,没什么亮点。

  其实分页控件也没啥,就是生成相关的HTML代码,你需要啥HTML代码,用你的代码生成就是了,不管是AspNetPager.dll还是58同城也都是生成分页相关的HTML代码,其实就是一堆a标签,点分页的时候,分页控件所在的页面会刷新。

一:用AspNetPager.dll实现的分页

图:

 

生成的源码
<div id="ctl00_Content_AspNetPager1">
<a disabled="disabled" style="margin-right:5px;">首页</a>
<a disabled="disabled" style="margin-right:5px;">上一页</a>
<span class="al" style="margin-right:5px;">1</span>
<a href="NewsList.aspx?page=2" style="margin-right:5px;">2</a>
<a href="NewsList.aspx?page=3" style="margin-right:5px;">3</a>
<a href="NewsList.aspx?page=4" style="margin-right:5px;">4</a>
<a href="NewsList.aspx?page=5" style="margin-right:5px;">5</a>
<a href="NewsList.aspx?page=6" style="margin-right:5px;">6</a>
<a href="NewsList.aspx?page=7" style="margin-right:5px;">7</a>
<a href="NewsList.aspx?page=2" style="margin-right:5px;">下一页</a>
<a href="NewsList.aspx?page=7" style="margin-right:5px;">尾页</a>
</div>

  二:58同城的分页

  图:

  

生成的源码
<div class="pager">
<strong><span>1</span></strong><a href="/zufang/pn2/"><span>2</span></a>
<a href="/zufang/pn3/"><span>3</span></a>
<a href="/zufang/pn4/"><span>4</span></a>
<a href="/zufang/pn5/"><span>5</span></a>
<a href="/zufang/pn6/"><span>6</span></a>
<a href="/zufang/pn7/"><span>7</span></a>
<a href="/zufang/pn8/"><span>8</span></a>
<a href="/zufang/pn9/"><span>9</span></a>
<a href="/zufang/pn10/"><span>10</span></a>
<a href="/zufang/pn11/"><span>11</span></a>
<a href="/zufang/pn12/"><span>12</span></a>
<a class="next" href="/zufang/pn2/"><span>下一页</span></a>
</div>

 

  三:我的分页控件 

程序代码
<os:PagingControl runat="server" ID="paginglist" PageSize="4" CssCurrent="curpage"  ImgFirst="/images/index/btn_first.jpg" 
ImgPrev="/images/index/btn_prev.jpg" ImgNext="/images/index/btn_next.jpg" ImgLast="/images/index/btn_end.jpg" CssClass="pagelist">
</os:PagingControl>
paginglist.RecordCount = 200;
paginglist.LoadControl();
生成源码
 <div class='pagelist'>
<a href='/CommonQuestion/QuestionListContent.aspx?questionTypeID=0&page=1'><img src=/images/index/btn_first.jpg/></a>
<a href='/CommonQuestion/QuestionListContent.aspx?questionTypeID=0&page=23'><img src=/images/index/btn_prev.jpg/></a>
<a href='/CommonQuestion/QuestionListContent.aspx?questionTypeID=0&page=14'>14</a>
<a href='/CommonQuestion/QuestionListContent.aspx?questionTypeID=0&page=15'>15</a>
<a href='/CommonQuestion/QuestionListContent.aspx?questionTypeID=0&page=16'>16</a>
<a href='/CommonQuestion/QuestionListContent.aspx?questionTypeID=0&page=17'>17</a>
<a href='/CommonQuestion/QuestionListContent.aspx?questionTypeID=0&page=18'>18</a>
<a href='/CommonQuestion/QuestionListContent.aspx?questionTypeID=0&page=19'>19</a>
<a href='/CommonQuestion/QuestionListContent.aspx?questionTypeID=0&page=20'>20</a>
<a href='/CommonQuestion/QuestionListContent.aspx?questionTypeID=0&page=21'>21</a>
<a href='/CommonQuestion/QuestionListContent.aspx?questionTypeID=0&page=22'>22</a>
<a href='/CommonQuestion/QuestionListContent.aspx?questionTypeID=0&page=23'>23</a>
<span class=curpage>24</span>
</div>

程序源码
using System.Text;
using System.Web;
using System.Web.UI;
using System.ComponentModel;
using System.Collections.Generic;
using System.Web.UI.WebControls;

//自定义分页控件
namespace ObjectCommon.Libary.Component
{
[ToolboxData(
"<{0}:PagingControl runat=\"server\"></{0}:PagingControl>"), DefaultProperty("")]
public class PagingControl : Literal
{
#region 分页属性
private int pageSize = 10;
public int PageSize
{
set {
if (value > 0)
{
pageSize
= value;
}
}
get { return pageSize; }
}

private int pageIndex = 1;
public int PageIndex
{
set
{
if (value > 0)
{
pageIndex
= value;
}
}
get { return pageIndex; }
}

public int RecordCount
{
set;
get;
}

private int PageCount = 0;

//分页参数
private string paraName = "page";
public string ParaName
{
set
{
if (value != null && value.Trim() != "")
{
paraName
= value.Trim();
}
}
get {
return paraName;
}
}
#endregion

#region Css
//分页控件的样式
public string CssClass
{
set;
get;
}

//上一页样式
public string CssPrev
{
set;
get;
}

//下一页样式
public string CssNext
{
set;
get;
}

//当前页样式
public string CssCurrent
{
set;
get;
}

//首页样式
public string CssFirst
{
set;
get;
}

//尾页样式
public string CssLast
{
set;
get;
}

//其它页样式
public string CssOther
{
set;
get;
}
#endregion

#region Img
//首页图片
public string ImgFirst
{
set;
get;
}

//上一页页图片
public string ImgPrev
{
set;
get;
}

//下一页页图片
public string ImgNext
{
set;
get;
}

//尾页
public string ImgLast
{
set;
get;
}
#endregion

// A标签的HRef
private string ATargetHref
{
set;
get;
}

//获取paraname之外的请求参数
private void GetUrl()
{
HttpContext ctx
= HttpContext.Current;
string hostName ="http://"+ ctx.Request.Url.Host + ":" + ctx.Request.Url.Port ;
string url = ctx.Request.Url.ToString().Substring(hostName.Length).Split('?')[0] + "?";
StringBuilder query
= new StringBuilder(url);
foreach (string key in ctx.Request.QueryString)
{
if (key!=null && key.ToLower() != this.ParaName)
{
query.Append(
string.Format("{0}={1}&", key, ctx.Request.QueryString[key]));
}
}
this.ATargetHref = query.ToString();
}

private string GetUrl(int pageIndex)
{
return string.Format("{0}{1}={2}", this.ATargetHref,this.paraName, pageIndex);
}

//初始化属性
private void Initializtion()
{
GetUrl();
this.PageCount = (this.RecordCount - 1) / this.PageSize + 1;
if (!string.IsNullOrEmpty(HttpContext.Current.Request[this.ParaName]))
{
this.PageIndex = int.Parse(HttpContext.Current.Request[this.ParaName]);
}
}

//生成控件
private void LoadControl(List<Tag> divPaging)
{
if (divPaging == null || divPaging.Count == 0)
{
this.Text = null;
return;
}
StringBuilder sb
= new StringBuilder(256);
if (this.CssClass == null || this.CssClass.Trim() == "")
{
sb.Append(
"<div>");
}
else
{
sb.Append(
string.Format("<div class='{0}'>", this.CssClass));
}
for (int i = 0; i < divPaging.Count;i++)
{
if (divPaging[i] == null)
{
sb.Append(GetCurrentPage());
}
else
{
sb.Append(divPaging[i].ToString());
}
}
sb.Append(
"</div>");
this.Text = sb.ToString();
}

private string GetCurrentPage()
{
if (this.CssCurrent == null || this.CssCurrent.Trim() == "")
{
return string.Format("<span>{0}</span>", this.PageIndex);
}
else {
return string.Format("<span class={0}>{1}</span>", this.CssCurrent, this.PageIndex);
}
}

/// <summary>
/// 加载控件
/// </summary>
public void LoadControl()
{
if (this.RecordCount<=this.PageSize)
{
this.Text = null;
}
else
{
Initializtion();
LoadControl(AddATarget());
}
}

#region 创建标签
private Tag CreateATarget(string img,string css,int pageIndex,string content)
{
Tag a
= new Tag();
a.HRef
= GetUrl(pageIndex);
if (img == null || img.Trim() == "")
{
a.InnerHtml
= content;
}
else {
a.InnerHtml
= string.Format("<img src={0}/>",img);
}

if (css != null && css.Trim() != "")
{
a.CssClass
= css;
}
return a;
}


#endregion

// 向集合中添加标签
private List<Tag> AddATarget()
{
List
<Tag> divPaging = new List<Tag>();

if (this.PageIndex > 1)//添加上一页
{
divPaging.Add(CreateATarget(
this.ImgFirst, this.CssFirst, 1, "首页"));//添加首页
divPaging.Add(CreateATarget(this.ImgPrev, this.CssPrev, this.PageIndex - 1, "上一页"));
}

int end = this.PageIndex + 5;
if (end < 11)
{
end
= 11;
}
if (end > this.PageCount)
{
end
= this.PageCount;
}

int start = end - 10 > 0 ? end - 10 : 1;

for (int i = start; i <= end; i++)
{
if (i == this.PageIndex)
{
divPaging.Add(
null);
}
else
{
divPaging.Add(CreateATarget(
null, this.CssOther, i, i.ToString()));
}
}

if (this.PageIndex < this.PageCount)
{
divPaging.Add(CreateATarget(
this.ImgNext, this.CssNext, this.PageIndex + 1, "下一页"));//添加下一页
divPaging.Add(CreateATarget(this.ImgLast, this.CssLast, this.PageCount, "尾页"));//添加尾页
}

return divPaging;
}

// 标签实体
private class Tag
{
//链接
public string HRef
{
set;
get;
}

//链接显示的内容
public string InnerHtml
{
set;
get;
}

//样式
public string CssClass
{
set;
get;
}

public override string ToString()
{
if (this.CssClass != null && this.CssClass.Trim() != "")
{
this.CssClass = string.Format(" class='{0}'", this.CssClass);
}
return string.Format("<a href='{0}'{1}>{2}</a>", this.HRef, this.CssClass, this.InnerHtml);
}
}

}
}

  自定义控件注册:

  在web.config中,节点<pages> <controls>中加入:

    <add tagPrefix="os" namespace="ObjectCommon.Libary.Component" assembly="ObjectCommon.Libary"/>

posted @ 2011-08-19 13:28 啊汉 阅读(3255) 评论(29) 编辑 收藏

 回复 引用 查看   
#1楼 2011-08-19 13:55 小易V      
可以考虑在获取路径那个地方
多做一些处理方便路径重写或者AJAX分页
ReWriteUrl="host/index/*"
ReWriteUrl="javascript:AjaxPager(*)"

如果自定义了路径
里面就用页面替换*
当然页面的其他参数 看着处理

 回复 引用 查看   
#2楼 2011-08-19 14:07 gzlxm      
楼主弄个demo下载啊,谢谢
 回复 引用 查看   
#3楼 2011-08-19 14:09 zdming      
这个年代你写的已经落后了
 回复 引用 查看   
#4楼[楼主] 2011-08-19 14:09 啊汉      
@小易V
意见不错,有空再研究

 回复 引用 查看   
#5楼 2011-08-19 14:11 澜紫癜青      
AspNetPager 有你说的效果,楼主多在园里搜索下啊
http://www.cnblogs.com/zengxiangzhan/archive/2010/03/03/1677460.html

 回复 引用 查看   
#6楼[楼主] 2011-08-19 14:19 啊汉      
@澜紫癜青
看来是我对AspNetPager不熟啊,不是自己写的感觉就差了那么一点点,AspNetPager功能比较强大,属性太多,不多用还真用不好

 回复 引用 查看   
#7楼 2011-08-19 14:22 澜紫癜青      
@啊汉
AspNetPager 最新版本功能很多啊,而且支持功能很多呢,作者特意写了DEMO的,可以去作者上去看看,而且我最喜欢的就是作者在CSS下的功夫,和我提供的园子里的搜索一样,你想实现什么效果,如淘宝效果,58同城效果,就只需要做个CSS就行了,省的写代码哈,非常方便

 回复 引用 查看   
#8楼 2011-08-19 14:24 A区炸蛋已安放      
怎么没有提供下载啊。。。
 回复 引用 查看   
#9楼 2011-08-19 14:31 Leaf1      
代码量太大,根本。,,,
 回复 引用 查看   
#10楼[楼主] 2011-08-19 14:36 啊汉      
@A区炸蛋已安放
现在有了,没有DEMO

 回复 引用 查看   
#11楼[楼主] 2011-08-19 14:39 啊汉      
@Leaf1
代码量不到10K呢,效率我还真有点担心,希望可以提出建设性意见,想把Tag改为struct

 回复 引用 查看   
#12楼 2011-08-19 15:05 从小就很拽      
能做成无刷新的吗
 回复 引用 查看   
#13楼[楼主] 2011-08-19 15:12 啊汉      
@从小就很拽
因为生成的就是a标签,点击a标签,必刷页面,如果把分页控件所在的页面当做一个子页面,用iframe嵌套到父页面中,就无刷新了

 回复 引用 查看   
#14楼 2011-08-19 15:38 刘彦亭      
哦,现在还有人用服务器端控件啊。
 回复 引用 查看   
#15楼 2011-08-19 15:42 小易V      
@啊汉
<a href="javascript:AjaxPager(1);">1</a>
这样就可以调用对应的JS方法 实现无刷新了啊
其实你需要改动的很少就办到,包括路径重写

 回复 引用 查看   
#16楼[楼主] 2011-08-19 15:48 啊汉      
@小易V
这样还真可以实现无刷新,以前ajax用的比较多,现在慢慢的少用了,考虑到网络速度,安全问题

 回复 引用 查看   
#17楼 2011-08-19 15:59 liuyilin888      
@刘彦亭
你怎么不用汇编呢

 回复 引用 查看   
#18楼 2011-08-20 08:49 john23.net      
顶个
 回复 引用 查看   
#19楼 2011-08-20 08:50 Matt.com      
如果有些控件原理就好了!!!
 回复 引用 查看   
#20楼 2011-08-20 11:02 羽之      
现在还有人用服务端控件???

你让ajax情何以堪啊。

你这个想法就相当于回归web1.0时代。也许说倒退更直接

 回复 引用 查看   
#21楼 2011-08-20 11:02 火地晋      
@澜紫癜青
用过,很不错。

 回复 引用 查看   
#22楼 2011-08-20 11:03 火地晋      
也支持楼主的分享,好好努力完善,与AspNetPager一决高下。
 回复 引用 查看   
#23楼 2011-08-20 12:25 lorgine      
 回复 引用 查看   
#24楼 2011-08-20 12:28 堕落的青春      
很好很强大。不过BS分页 有AspNetPager就基本能瞒住需求了!而且开源!
 回复 引用 查看   
#25楼 2011-08-20 12:31 欢喜禅      
楼主,你已经OUT了,这个年代还写这个玩意儿。。。都是3岁孩子玩的东西了。。。
 回复 引用 查看   
#26楼 2011-08-20 12:34 欢喜禅      
楼主,你能比得过ASPNETPAGER么?你不提供DEMO,还在此装逼。。。。去看看人家,都开源N年了。。。
 回复 引用 查看   
#27楼 2011-08-20 12:49 sxwgf      
引用欢喜禅:楼主,你能比得过ASPNETPAGER么?你不提供DEMO,还在此装逼。。。。去看看人家,都开源N年了。。。

楼上这位激动了,我觉得要顶lz的,自己动手,丰衣足食嘛,呵呵:)

 回复 引用 查看   
#28楼 2011-08-22 22:57 Jimmy.x.zhou      
建议楼主再加上一个属性(IsServerControl)用来设置是否点击某面回发..
如果设为true,,就是点击某面回发到服务器,和普通的button一样,触发事件
如果设为false就是ajax请求,还有加上可以直接输入页数跳转的框
如果只是上班完成任务做成这样也算可以了,如果个人举的话可以试试.
如果说时间比较多,还可以把它加到自定义列表控件里,用repeater重写,也很爽的哦.

 回复 引用 查看   
#29楼 2011-09-01 14:30 A区炸蛋已安放      
aspnetpager分页方式。12345...


/// <summary>
/// 显示分页数字个数
/// </summary>
private int showNumberCount = 5;

public int ShowNumberCount
{
get { return showNumberCount; }
set { showNumberCount = value; }
}



//数字向上翻页,上一页(...)。PageIndex>ShowNumberCount才出现数字向上翻页按钮
if (this.PageIndex / this.ShowNumberCount > 0 && this.PageIndex != this.ShowNumberCount)
{
divPaging.Add(CreateATag(null, this.CssOther, "...", ((this.PageIndex - 1) / this.ShowNumberCount) * this.ShowNumberCount));
}

//数字结束
int end = ((this.PageIndex - 1) / this.ShowNumberCount) * this.ShowNumberCount + this.ShowNumberCount;
if (end > this.PageCount)
{
end = this.PageCount;
}
//数字开始
int start = ((this.PageIndex - 1) / this.ShowNumberCount) * this.ShowNumberCount + 1;

for (int i = start; i <= end; i++)
{
//如果为当前页,则添加null到集合
if (i == this.PageIndex)
{
divPaging.Add(null);
}
else
{
divPaging.Add(CreateATag(null, this.CssOther, i.ToString(), i));
}
}

//数字向下翻页,下一页(...)。
if (this.PageCount > ((this.PageIndex - 1) / this.ShowNumberCount) * this.ShowNumberCount + this.ShowNumberCount)
{
divPaging.Add(CreateATag(null, this.CssOther, "...", ((this.PageIndex - 1) / this.ShowNumberCount) * this.ShowNumberCount + this.ShowNumberCount + 1));
}

发表评论

昵称: [登录] [注册]

主页:

邮箱:(仅博主可见)

评论内容:

  登录  注册

[使用Ctrl+Enter键快速提交评论]

0 2145608 ssffEYH1reY=