花两个小时,做了个分页控件

本文介绍了一款简单实用的分页控件,内置四种显示风格,并提供了详细的代码实现及自定义方法。用户可通过设置StyleName来切换不同样式。

一个简单的分页控件,内置4种显示风格,主要是将AspNetForums的分页跟一个朋友(小熊)的合一块了,ANF的单调了点,小熊的吧,用起来有点麻烦,我人懒,就整一块了.:)
内置四种风格,通过设置StyleName(BasePager,CoolPager,DiscuzPager,SmallPager)就行,不过要注意大小写,CSS是从Assembly里面取的.
下面是效果,

如果想定制一些更炫的效果,就将StyleName设置成其它的任意名字.自己写CSS:
生成的HTML代码如下:

<script type="text/javascript">
//<![CDATA[

                function xiaokui_pager_go(){
                 var n=event.srcElement;
                 if(event.keyCode==13)
                 {
                  var strUrl=location.href.toLowerCase();
                  strUrl=strUrl.replace(/(\&)?pageindex=\d+/gi,'');
                  if(location.search=='')
                            strUrl=strUrl+'?pageindex='+n.value;
                        else
                            strUrl=strUrl+'&pageindex='+n.value;
                        strUrl=strUrl.replace('?&','?');
                  location.href=strUrl;
                        return false;
               }
                }//]]>
</script>
<div id="Pager1" class="SmallPager Left">
<span class="SmallPager_pre">
<a id="Pager1" class="" id="Prev" href="http://localhost:2625/WebSite/Default.aspx?PageIndex=1">&lt;</a>
</span>
<span class="SmallPager_curr">1</span>
<span class="SmallPager_number"><a id="2" href="http://localhost:2625/WebSite/Default.aspx?PageIndex=2">2</a></span>
<span class="SmallPager_number"><a id="3" href="http://localhost:2625/WebSite/Default.aspx?PageIndex=3">3</a></span>
<span class="SmallPager_number"><a id="4" href="http://localhost:2625/WebSite/Default.aspx?PageIndex=4">4</a></span>
<span class="SmallPager_number"><a id="5" href="http://localhost:2625/WebSite/Default.aspx?PageIndex=5">5</a></span>
<span class="SmallPager_next"><a id="Next" href="http://localhost:2625/WebSite/Default.aspx?PageIndex=2">&gt;</a></span>
    GO:<input name="txtCustom" type="text" id="txtCustom" onkeydown="return xiaokui_pager_go();" onkeyup="this.value=this.value.replace(/[^0-9]/gi,'');" />
</div>

都在Span里面包着.想怎么改,就怎么改.

代码如下:

Code
  1using System;
  2using System.Collections.Generic;
  3using System.ComponentModel;
  4using System.Text;
  5using System.Web;
  6using System.Web.UI;
  7using System.Web.UI.WebControls;
  8using System.IO;
  9using System.Reflection;
 10
 11namespace Bqrm.Web.UI.WebControls
 12{
 13    对齐方式 enum#region 对齐方式 enum
 14    /**//// <summary>
 15    /// 对齐方式
 16    /// </summary>

 17    public enum Align
 18    {
 19        /**//// <summary>
 20        /// 左对齐
 21        /// </summary>

 22        Left = 0,
 23        /**//// <summary>
 24        /// 居中
 25        /// </summary>

 26        Center,
 27        /**//// <summary>
 28        /// 右对齐
 29        /// </summary>

 30        Right
 31    }

 32    #endregion

 33    /**//// <summary>
 34    /// 分页显示类
 35    /// </summary>

 36    [ToolboxData("<{0}:Pager runat=server></{0}:Pager>")]
 37    public class Pager:WebControl
 38    {
 39
 40        私有成员#region 私有成员
 41        private int _PageIndex;
 42        private string _StyleName;
 43        private Align _Align;
 44        private StringBuilder sbData = new StringBuilder();
 45        HyperLink previousLink;
 46        HyperLink nextLink;
 47        HyperLink firstLink;
 48        HyperLink lastLink;
 49        HyperLink[] pagingHyperLinks;
 50        TextBox txtCustom;
 51        private string preString = "<span class=\"{0}_{1}\">";
 52        private string lastString = "</span>";
 53        private string currentPageString = "<span class=\"{0}_curr\">{1}</span>";
 54        private bool showTextBox = true;
 55        #endregion

 56
 57        构造函数#region 构造函数
 58        /**//// <summary>
 59        /// 构造函数
 60        /// </summary>

 61        public Pager()
 62        {
 63            this._StyleName = "BasePager";
 64            this._Align = Align.Left;
 65        }

 66        #endregion

 67
 68                bool showCurrentPage = true;
 69        /**//// <summary>
 70        /// 显示当前页统计信息.如:当前页 1/10 共有1000条记录
 71        /// </summary>

 72        public bool ShowCurrentPage
 73        {
 74            get return showCurrentPage; }
 75            set { showCurrentPage = value; }
 76        }

 77
 78        string firstPageText = "&lt;&lt;";
 79        /**//// <summary>
 80        /// 首页链接显示的字符
 81        /// </summary>

 82        public string FirstPageText
 83        {
 84            get return firstPageText; }
 85            set { firstPageText = value; }
 86        }

 87
 88        string lastPageText = "&gt;&gt;";
 89        /**//// <summary>
 90        /// 尾页链接显示的字符
 91        /// </summary>

 92        public string LastPageText
 93        {
 94            get return lastPageText; }
 95            set { lastPageText = value; }
 96        }

 97
 98        string previousPageText = "&lt;";
 99        /**//// <summary>
100        /// 上一页链接显示的字符
101        /// </summary>

102        public string PreviousPageText
103        {
104            get return previousPageText; }
105            set { previousPageText = value; }
106        }

107
108        string nextPageText = "&gt;";
109        /**//// <summary>
110        /// 下一页链接显示的字符.默认">"
111        /// </summary>

112        public string NextPageText
113        {
114            get return nextPageText; }
115            set { nextPageText = value; }
116        }

117
118        /**//// <summary>
119        /// 当前页码
120        /// </summary>

121        public virtual int PageIndex
122        {
123            get
124            {
125                HttpContext context = HttpContext.Current;
126
127                if (Page.IsPostBack && ViewState["PageIndex"!= null)
128                {
129                    _PageIndex = (int)ViewState["PageIndex"];
130                }

131                else
132                {
133                    int.TryParse(Page.Request.QueryString["pageindex"], out this._PageIndex);
134                    if (this._PageIndex == 0)
135                        this._PageIndex = 1;
136                }

137
138                if (_PageIndex < 0)
139                    return 0;
140                else
141                    return _PageIndex;
142            }

143            set
144            {
145                ViewState["PageIndex"= value;
146                _PageIndex = value;
147            }

148        }

149
150        /**//// <summary>
151        /// 一页显示的数据条数
152        /// </summary>

153        public virtual int PageSize
154        {
155            get
156            {
157                int pageSize = Convert.ToInt32(ViewState["PageSize"]);
158                if (pageSize == 0return 10;
159                return pageSize;
160            }

161            set
162            {
163                ViewState["PageSize"= value;
164            }

165        }

166
167       /**//// <summary>
168       /// 总记录数
169       /// </summary>

170        public int TotalRecord
171        {
172            get
173            {
174                return Convert.ToInt32(ViewState["TotalRecords"]);
175            }

176            set
177            {
178                ViewState["TotalRecords"= value;
179            }

180        }

181        /**//// <summary>
182        /// 生成指定页码的链接地址
183        /// </summary>
184        /// <param name="pageIndex"></param>
185        /// <returns></returns>

186        protected virtual string CreatePagerURL(string pageIndex)
187        {
188            HttpContext context = HttpContext.Current;
189            if (context.Request.Url.AbsoluteUri.IndexOf("?"== -1)
190            {
191                return context.Request.Url.AbsoluteUri.ToString() + "?PageIndex=" + pageIndex;
192            }

193            else
194            {
195                if (context.Request.Url.AbsoluteUri.ToLower().IndexOf("pageindex="== -1)
196                    return context.Request.Url.AbsoluteUri.ToString() + "&PageIndex=" + pageIndex;
197                else
198                {
199                    return System.Text.RegularExpressions.Regex.Replace(context.Request.Url.AbsoluteUri.ToLower().ToString(), @"pageindex=(\d+\.?\d*|\.\d+)""PageIndex=" + pageIndex);
200                }

201            }

202        }

203
204        /**//// <summary>
205        /// 总页数
206        /// </summary>

207        protected int TotalPage
208        {
209            get return this.CalculateTotalPages(); }
210        }

211        /**//// <summary>
212        /// 样式
213        /// </summary>

214        public string StyleName
215        {
216            set { _StyleName = value; }
217            get return _StyleName; }
218        }

219        /**//// <summary>
220        /// 对齐方式
221        /// </summary>

222        public Align HAlign
223        {
224            set { _Align = value; }
225        }

226        /**//// <summary>
227        /// 显示页码输入框
228        /// </summary>

229        public bool ShowTextBox
230        {
231            get return showTextBox; }
232            set { showTextBox = value; }
233        }

234
235        protected override void CreateChildControls()
236        {
237            Controls.Clear();
238            AddPageLinks();
239            AddPreviousNextLinks();
240            AddFirstLastLinks();
241            AddCustomPager();
242            Page.ClientScript.RegisterClientScriptBlock(this.GetType(), "customPager", GetScripts(), true);
243        }

244        String GetScripts()
245        {
246            StringBuilder sb = new StringBuilder();
247            sb.Append(@"
248                function xiaokui_pager_go(){
249                    var n=event.srcElement;
250                    if(event.keyCode==13)
251                    {
252                        var strUrl=location.href.toLowerCase();
253                        strUrl=strUrl.replace(/(\&)?pageindex=\d+/gi,'');
254                        if(location.search=='')
255                            strUrl=strUrl+'?pageindex='+n.value;
256                        else
257                            strUrl=strUrl+'&pageindex='+n.value;
258                        strUrl=strUrl.replace('?&','?');
259                        location.href=strUrl;
260                        return false;
261                     }
262                }");
263            return sb.ToString();
264        }

265
266        void AddCustomPager()
267        {
268            txtCustom = new TextBox();
269            txtCustom.ID = "txtCustom";
270            txtCustom.EnableViewState = false;
271            txtCustom.Attributes.Add("onkeydown""return xiaokui_pager_go();");
272            txtCustom.Attributes.Add("onkeyup""this.value=this.value.replace(/[^0-9]/gi,'');");
273            Controls.Add(txtCustom);
274        }

275        protected override void OnInit(EventArgs e)
276        {
277            base.OnInit(e);
278            AddStyle();
279        }

280        protected override void  OnLoad(EventArgs e)
281        {
282              base.OnInit(e);
283             if (this.Context.Request["pagerstylename"!= null)
284             {
285                 Assembly executingAssembly = Assembly.GetExecutingAssembly();
286                 Stream stream = executingAssembly.GetManifestResourceStream("Bqrm." + StyleName + ".css");
287                 stream.Position = 0L;
288                 string script = new StreamReader(stream).ReadToEnd();
289                 Page.Response.Write(script);
290                 Page.Response.End();
291             }

292        }

293
294        protected void AddStyle()
295        {
296            string str2 = this.Context.Request.Url.ToString();
297            str2 = str2 + ((str2.IndexOf("?">= 0? "&" : "?");
298            string s = StyleName.ToLower();
299            if (s == "basepager" || s == "coolpager" || s == "discuzpager" || s == "smallpager")
300            {
301                try
302                {
303                    Page.Header.Controls.Add(new LiteralControl("<link rel=\"stylesheet\" href=\"" + str2 + "PagerStyleName=" + StyleName + "\" type=\"text/css\" />"));
304                }

305                catch
306                {
307                    Page.Response.Write("<link rel=\"stylesheet\" href=\"" + str2 + "PagerStyleName=" + StyleName + "\" type=\"text/css\" />");
308                }

309            }

310        }

311
312        protected override void Render(HtmlTextWriter writer) 
313        {
314            writer.Write("<div id=\"" + this.ClientID + "\" class=\"" + this._StyleName + " " + this._Align + "\">");
315            int totalPages = CalculateTotalPages();
316
317            if (totalPages <= 1)
318                return;
319
320            if (ShowCurrentPage)
321                RenderCurrentPage(writer);
322
323            AddAttributesToRender(writer);
324
325            writer.AddAttribute(HtmlTextWriterAttribute.Class, this.CssClass, false);
326            RenderFirst(writer);
327
328            RenderPrevious(writer);
329            
330            RenderPagingButtons(writer);
331
332            RenderNext(writer);
333
334            RenderLast(writer);
335
336            RenderCustom(writer);
337
338            writer.Write("</div>");
339
340        }

341        void RenderCustom(HtmlTextWriter writer)
342        {
343            writer.Write("    GO:");
344            txtCustom.RenderControl(writer);
345        }

346
347        void RenderCurrentPage(HtmlTextWriter writer)
348        {
349            writer.Write(String.Format(preString, StyleName, "_total"));
350            writer.Write(string.Format(this.CurrentPageStringFormat, this.PageIndex, this.CalculateTotalPages(), this.TotalRecord));
351            writer.Write(lastString);
352        }

353
354        void RenderFirst(HtmlTextWriter writer) 
355        {
356            int totalPages = CalculateTotalPages();
357
358            if ((PageIndex >= 3&& (totalPages > 5)) 
359            {
360                writer.Write(String.Format(preString,this.StyleName,"first"));
361                firstLink.RenderControl(writer);
362                writer.Write(lastString);
363            }

364        }

365
366        void RenderLast(HtmlTextWriter writer) 
367        {
368            int totalPages = CalculateTotalPages();
369
370            if (((PageIndex + 3< totalPages) && (totalPages > 5)) 
371            {
372                writer.Write(String.Format(preString,this.StyleName,"last"));
373                lastLink.RenderControl(writer);
374                writer.Write(lastString);
375            }

376        }

377
378        void RenderPrevious(HtmlTextWriter writer) 
379        {
380            Literal l;
381
382            if (HasPrevious) 
383            {
384                writer.Write(String.Format(preString,this.StyleName,"pre"));
385                previousLink.RenderControl(writer);
386                writer.Write(lastString);
387            }

388        }

389
390        void RenderNext(HtmlTextWriter writer) 
391        {
392            if (HasNext) 
393            {
394                writer.Write(String.Format(preString,this.StyleName,"next"));
395                nextLink.RenderControl(writer);
396                writer.Write(lastString);
397            }

398        }

399
400        void RenderButtonRange(int start, int end, HtmlTextWriter writer) 
401        {
402            for (int i = start; i < end; i++
403            {
404                if (PageIndex == i+1
405                {
406                    writer.Write(String.Format(currentPageString,this.StyleName,(i+1).ToString()));
407                }
 
408                else 
409                {
410                    writer.Write(String.Format(preString,this.StyleName,"number"));
411                    pagingHyperLinks[i].RenderControl(writer);
412                    writer.Write(lastString);
413                }

414            }

415        }

416
417        void RenderPagingButtons(HtmlTextWriter writer) 
418        {
419            int totalPages;
420
421            totalPages = CalculateTotalPages();
422
423            if ( totalPages <= 5
424            {
425                RenderButtonRange(0, totalPages, writer);
426            }
 
427            else 
428            {
429                int lowerBound = (PageIndex - 3);
430                int upperBound = (PageIndex + 2);
431
432                if (lowerBound <= 0)
433                {
434                    lowerBound = 0;
435                    upperBound = 5;
436                }

437
438                if (PageIndex < (totalPages - 2))
439                    RenderButtonRange(lowerBound, upperBound, writer);
440
441                else if (PageIndex >= (totalPages - 2))
442                    RenderButtonRange((totalPages - 5), totalPages, writer);
443            }

444        }

445
446        void AddPageLinks() 
447        {
448            pagingHyperLinks = new HyperLink[CalculateTotalPages()];
449
450            for (int i = 0; i < pagingHyperLinks.Length; i++
451            {
452                pagingHyperLinks[i] = new HyperLink();
453                pagingHyperLinks[i].EnableViewState = false;
454                pagingHyperLinks[i].Text = (i + 1).ToString();
455                pagingHyperLinks[i].ID = (i + 1).ToString();
456                pagingHyperLinks[i].NavigateUrl = CreatePagerURL((i + 1).ToString());
457                Controls.Add(pagingHyperLinks[i]);
458            }

459        }

460
461        void AddFirstLastLinks() 
462        {
463            int start = 1;
464            firstLink = new HyperLink();
465            firstLink.ID = "First";
466            firstLink.Text = this.FirstPageText;
467            firstLink.NavigateUrl = CreatePagerURL(start.ToString());
468            Controls.Add(firstLink);
469
470            int last = CalculateTotalPages();
471            lastLink = new HyperLink();
472            lastLink.ID = "Last";
473            lastLink.Text = this.LastPageText;
474            lastLink.NavigateUrl = CreatePagerURL(last.ToString());
475            Controls.Add(lastLink);
476        }

477
478        void AddPreviousNextLinks() 
479        {
480            int previous;
481            
482            if (this.PageIndex < 2)
483                previous = 1;
484            else
485                previous = this.PageIndex-1;
486
487            previousLink = new HyperLink();
488            previousLink.ID = "Prev";
489            previousLink.Text = this.PreviousPageText;
490            previousLink.NavigateUrl = CreatePagerURL(previous.ToString());
491            Controls.Add(previousLink);
492
493            int next = this.PageIndex + 1;
494            nextLink = new HyperLink();
495            nextLink.ID = "Next";
496            nextLink.Text = this.NextPageText;
497            nextLink.NavigateUrl = CreatePagerURL(next.ToString());
498            Controls.Add(nextLink);
499        }

500        
501        /**//// <summary>
502        /// Override how this control handles its controls collection
503        /// </summary>

504        public override ControlCollection Controls
505        {
506            get
507            {
508                EnsureChildControls();
509                return base.Controls;
510            }

511
512        }

513
514        private bool HasPrevious 
515        {
516            get 
517            {
518                if (PageIndex > 0)
519                    return true;
520
521                return false;
522            }

523        }

524
525        private bool HasNext 
526        {
527            get 
528            {
529                if (PageIndex + 1 < CalculateTotalPages() )
530                    return true;
531
532                return false;
533            }

534        }

535
536        /**//// <summary>
537        /// 计算总页数
538        /// </summary>
539        /// 

540        public virtual int CalculateTotalPages() 
541        {
542            int totalPagesAvailable;
543
544            if (TotalRecord == 0)
545                return 0;
546
547            totalPagesAvailable = TotalRecord / PageSize;
548
549            if ((TotalRecord % PageSize) > 0)
550                totalPagesAvailable++;
551
552            return totalPagesAvailable;
553        }

554
555        string currentPageStringFormat = "当前页{0}/{1} 共有{2}条记录";// = "Page {0} of {1} ({2} records) &nbsp;-&nbsp; ";
556        public string CurrentPageStringFormat
557        {
558            get return currentPageStringFormat; }
559            set { currentPageStringFormat = value; }
560        }

561    }

562}

563



如果有比我还懒的人,可以直接下载下面的DLL:
/Files/bqrm/BqrmPager.rar

转载于:https://www.cnblogs.com/bqrm/archive/2008/04/26/1172477.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值