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