• ASP.Net分页控件发布(转)


    由于.net自带的分页功能极其死板,自定义性不强不能满足需求,俺花了一个多星期的时间 写成的一个.net分页控件。

      特性:

      1、支持datagrid,datalist等分种数据显示控件,理论上只要有datasource的控件都可以

      2、支持url方式分页,url分页的每一页都可以被搜索引擎搜到,并且支持url重写

      3、控件样式可自定义

      4、封装完全,使用过程序只需写一行代码

    1 /******************************************************************
    2 ** 文件名:Pager.cs
    3 ** 创建人:杨响武
    4 ** 日 期:2005年7月27日
    5 ** 修改人:
    6 ** 日 期:
    7 ** 描 述:
    8 **
    9 **----------------------------------------------------------------
    10 ******************************************************************/
    11
    12 using System;
    13 using System.Web.UI.WebControls;
    14 using System.Web.UI.HtmlControls;
    15 using System.Web;
    16 using System.Web.UI;
    17 using System.Text.RegularExpressions;
    18
    19 namespace MyCompany.Controls
    20 {
    21 /// <summary>
    22 /// 分页控件
    23 /// </summary>
    24 public class Pager : Label, INamingContainer
    25 {
    26 #region 成员变量和构造函数
    27 HttpContext context = HttpContext.Current;
    28 Label countLabel;
    29 HyperLink previousButton;
    30 HyperLink nextButton;
    31 HyperLink firstButton;
    32 HyperLink lastButton;
    33 HyperLink[] pagingLinkButtons;
    34
    35 public override ControlCollection Controls
    36 {
    37 get
    38 {
    39 EnsureChildControls();
    40 return base.Controls;
    41 }
    42 }
    43
    44 protected override void CreateChildControls()
    45 {
    46 Controls.Clear();
    47
    48 AddCountLabel();
    49
    50 AddPageButtons();
    51
    52 AddPreviousNextHyperLinks();
    53
    54 AddFirstLastHyperLinks();
    55 }
    56 #endregion
    57
    58 #region 呈现方法
    59 protected override void Render(HtmlTextWriter writer)
    60 {
    61 // 修改总页数小于等于1的时候不呈现任何控件
    62 // int totalPages = CalculateTotalPages();
    63 //
    64 // if (totalPages <= 1)
    65 // return;
    66
    67 AddAttributesToRender(writer);
    68
    69 writer.AddAttribute(HtmlTextWriterAttribute.Class, this.CssClass, false);
    70
    71 RenderCountLabel(writer);
    72
    73 RenderFirst(writer);
    74
    75 RenderPrevious(writer);
    76
    77 RenderPagingButtons(writer);
    78
    79 RenderNext(writer);
    80
    81 RenderLast(writer);
    82 }
    83
    84 void RenderCountLabel(HtmlTextWriter writer)
    85 {
    86 countLabel.RenderControl(writer);
    87
    88 LiteralControl l = new LiteralControl("&nbsp;");
    89 l.RenderControl(writer);
    90 }
    91
    92 void RenderFirst (HtmlTextWriter writer)
    93 {
    94 firstButton.RenderControl(writer);
    95
    96 LiteralControl l = new LiteralControl("&nbsp;");
    97 l.RenderControl(writer);
    98 }
    99
    100 void RenderLast (HtmlTextWriter writer)
    101 {
    102 lastButton.RenderControl(writer);
    103
    104 LiteralControl l = new LiteralControl("&nbsp;");
    105 l.RenderControl(writer);
    106 }
    107
    108 void RenderPrevious (HtmlTextWriter writer)
    109 {
    110 previousButton.RenderControl(writer);
    111
    112 LiteralControl l = new LiteralControl("&nbsp;");
    113 l.RenderControl(writer);
    114 }
    115
    116 void RenderNext(HtmlTextWriter writer)
    117 {
    118 nextButton.RenderControl(writer);
    119
    120 LiteralControl l = new LiteralControl("&nbsp;");
    121 l.RenderControl(writer);
    122 }
    123
    124 private void RenderButtonRange(int start, int end, HtmlTextWriter writer)
    125 {
    126 for (int i = start; i < end; i++)
    127 {
    128 if (PageIndex == i)
    129 {
    130 Literal l = new Literal();
    131 l.Text = "<font color =red>" + (i + 1).ToString() + "</font>";
    132
    133 l.RenderControl(writer);
    134 }
    135 else
    136 {
    137 pagingLinkButtons[i].RenderControl(writer);
    138 }
    139 if (i < (end - 1))
    140 writer.Write("&nbsp;");
    141 }
    142
    143 LiteralControl l1 = new LiteralControl("&nbsp;");
    144 l1.RenderControl(writer);
    145 }
    146
    147 private void RenderPagingButtons(HtmlTextWriter writer)
    148 {
    149 int totalPages;
    150
    151 totalPages = CalculateTotalPages();
    152
    153 if (totalPages <= 10)
    154 {
    155 RenderButtonRange(0, totalPages, writer);
    156 }
    157 else
    158 {
    159 int lowerBound = (PageIndex - 4);
    160 int upperBount = (PageIndex + 6);
    161
    162 if (lowerBound <= 0)
    163 lowerBound = 0;
    164
    165 if (PageIndex <= 4)
    166 RenderButtonRange(0, 10, writer);
    167
    168 else if (PageIndex < (totalPages - 5))
    169 RenderButtonRange(lowerBound, (PageIndex + 6), writer);
    170
    171 else if (PageIndex >= (totalPages - 5))
    172 RenderButtonRange((totalPages - 10), totalPages, writer);
    173 }
    174 }
    175
    176 #endregion
    177
    178 #region 控件树方法
    179 /// <summary>
    180 /// 信息标签
    181 /// </summary>
    182 void AddCountLabel()
    183 {
    184 countLabel = new Label();
    185 countLabel.ID = "countLabel";
    186 countLabel.Text = string.Format(text, CalculateTotalPages().ToString("n0"));
    187
    188 Controls.Add(countLabel);
    189 }
    190
    191 private void AddPageButtons()
    192 {
    193 pagingLinkButtons = new HyperLink[CalculateTotalPages()];
    194
    195 for (int i = 0; i < pagingLinkButtons.Length; i++)
    196 {
    197 pagingLinkButtons[i] = new HyperLink();
    198 pagingLinkButtons[i].EnableViewState = false;
    199 pagingLinkButtons[i].Text = (i + 1).ToString();
    200 pagingLinkButtons[i].ID = i.ToString();
    201 pagingLinkButtons[i].CssClass = linkCss;
    202 pagingLinkButtons[i].NavigateUrl = GetHrefString(i);
    203
    204 Controls.Add(pagingLinkButtons[i]);
    205 }
    206 }
    207
    208 /// <summary>
    209 /// 首页末页
    210 /// </summary>
    211 void AddFirstLastHyperLinks()
    212 {
    213 firstButton = new HyperLink();
    214 firstButton.ID = "First";
    215 firstButton.Text = "首页";
    216 if(PageIndex != 0 && CalculateTotalPages() > 0)
    217 {
    218 firstButton.NavigateUrl = GetHrefString(0);
    219 }
    220 else
    221 {
    222 firstButton.Enabled = false;
    223 }
    224
    225 Controls.Add(firstButton);
    226
    227 lastButton = new HyperLink();
    228 lastButton.ID = "Last";
    229 lastButton.Text = "末页";
    230 if(PageIndex != CalculateTotalPages() - 1)
    231 {
    232 lastButton.NavigateUrl = GetHrefString(CalculateTotalPages() - 1);
    233 }
    234 else
    235 {
    236 lastButton.Enabled = false;
    237 }
    238 Controls.Add(lastButton);
    239 }
    240
    241 /// <summary>
    242 /// 上一页下一页
    243 /// </summary>
    244 void AddPreviousNextHyperLinks()
    245 {
    246 previousButton = new HyperLink();
    247 previousButton.ID = "Prev";
    248 previousButton.Text = "上一页";
    249 if (HasPrevious)
    250 {
    251 previousButton.NavigateUrl = GetHrefString(PageIndex - 1);
    252 }
    253 else
    254 {
    255 previousButton.Enabled = false;
    256 }
    257 Controls.Add(previousButton);
    258
    259 nextButton = new HyperLink();
    260 nextButton.ID = "Next";
    261 nextButton.Text = "下一页";
    262 if(HasNext)
    263 {
    264 nextButton.NavigateUrl = GetHrefString(PageIndex + 1);
    265 }
    266 else
    267 {
    268 nextButton.Enabled = false;
    269 }
    270 Controls.Add(nextButton);
    271 }
    272 #endregion
    273
    274 #region 私有属性
    275 private bool HasPrevious
    276 {
    277 get
    278 {
    279 if (PageIndex > 0)
    280 return true;
    281
    282 return false;
    283 }
    284 }
    285
    286 private bool HasNext
    287 {
    288 get
    289 {
    290 if (PageIndex + 1 < CalculateTotalPages() )
    291 return true;
    292
    293 return false;
    294 }
    295 }
    296 #endregion
    297
    298 #region 帮助方法和公共属性
    299
    300 /// <summary>
    301 /// 获取分页导航按钮的超链接字符串
    302 /// </summary>
    303 /// <param name="pageIndex">该分页按钮相对应的页索引</param>
    304 /// <returns>分页导航按钮的超链接字符串</returns>
    305 private string GetHrefString(int pageIndex)
    306 {
    307 string url = Page.Request.RawUrl;
    308
    309 if (Regex.IsMatch(url, @"(\d+).shtml", RegexOptions.IgnoreCase))
    310 {
    311 url = Regex.Replace(url, @"(\d+).shtml", pageIndex + ".shtml");
    312 }
    313
    314 if (Regex.IsMatch(url, @"PageIndex=(\d+)", RegexOptions.IgnoreCase))
    315 {
    316 url = Regex.Replace(url, @"PageIndex=(\d+)", "PageIndex=" + pageIndex.ToString());
    317 }
    318
    319 return Page.Server.UrlPathEncode(url);
    320 }
    321
    322 public int CalculateTotalPages()
    323 {
    324 int totalPagesAvailable;
    325
    326 if (TotalRecords == 0)
    327 return 0;
    328
    329 totalPagesAvailable = TotalRecords / PageSize;
    330
    331 if ((TotalRecords % PageSize) > 0)
    332 totalPagesAvailable++;
    333
    334 return totalPagesAvailable;
    335 }
    336
    337 /// <summary>
    338 /// 当前页
    339 /// </summary>
    340 public int PageIndex
    341 {
    342 get
    343 {
    344 int _pageIndex = 0;
    345
    346 if ((!Page.IsPostBack) && (context.PageIndex > 0))
    347 _pageIndex = context.PageIndex;
    348 else
    349 _pageIndex = Convert.ToInt32(ViewState["PageIndex"]);
    350
    351 if (_pageIndex < 0)
    352 return 0;
    353 else
    354 {
    355 if (_pageIndex > CalculateTotalPages()-1)
    356 return CalculateTotalPages()-1;
    357 else
    358 return _pageIndex;
    359 }
    360 }
    361 set
    362 {
    363 ViewState["PageIndex"] = value;
    364 }
    365 }
    366
    367 /// <summary>
    368 /// 每页记录数
    369 /// </summary>
    370 public int PageSize
    371 {
    372 get
    373 {
    374 int pageSize = Convert.ToInt32(ViewState["PageSize"]);
    375
    376 if (pageSize == 0)
    377 {
    378 return 10;
    379 }
    380
    381 return pageSize;
    382 }
    383 set
    384 {
    385 ViewState["PageSize"] = value;
    386 }
    387
    388 }
    389
    390 /// <summary>
    391 /// 总记录数
    392 /// </summary>
    393 public int TotalRecords
    394 {
    395 get
    396 {
    397 return Convert.ToInt32(ViewState["TotalRecords"]);
    398 }
    399 set
    400 {
    401 ViewState["TotalRecords"] = value;
    402 }
    403 }
    404
    405 private string text = "共{0}页";
    406
    407 private string linkCss = "";
    408 /// <summary>
    409 /// 链接样式
    410 /// </summary>
    411 public string LinkCss
    412 {
    413 get { return linkCss; }
    414 set { linkCss = value;}
    415 }
    416
    417 private string textCss = "";
    418 /// <summary>
    419 /// 文字样式
    420 /// </summary>
    421 public string TextCss
    422 {
    423 get { return textCss; }
    424 set { textCss = value;}
    425 }
    426
    427 public string TextFormat
    428 {
    429 get
    430 {
    431 return text;
    432 }
    433 set
    434 {
    435 text = value;
    436 }
    437 }
    438
    439 #endregion
    440 }
    441 }
    442

      在页面上只需要向下面这样写:

    1 <%@ Control Language="c#" %>
    2 <%@ Register TagPrefix="Anchor" Namespace="MyCompany.Controls" Assembly="MyCompany.Controls" %>
    3 <ANCHOR:PAGER id="Pager1" runat="server"></ANCHOR:PAGER>

  • 相关阅读:
    hdu 6182A Math Problem(快速幂)
    861. 二分图的最大匹配(匈牙利算法模板)
    860. 染色法判定二分图(模板)
    859. Kruskal算法求最小生成树(模板)
    858. Prim算法求最小生成树(模板)
    洛谷 P2577 [ZJOI2005]午餐
    洛谷 P2286 [HNOI2004]宠物收养场
    【模板】Splay
    P2234 [HNOI2002]营业额统计
    洛谷 P3369 【模板】普通平衡树
  • 原文地址:https://www.cnblogs.com/juan/p/1440605.html
Copyright © 2020-2023  润新知