当前位置: 首页 > 图文教程 > 网络编程 > ASP.NET > ASP.Net分页控件源码

ASP.NET
FreeTextBox(版本3.1.6)在ASP.Net 2.0中使用方法
.NET 常用功能和代码小结
在 .NET Framework 2.0 中未处理的异常导致基于 ASP.NET 的应用程序意外退出
asp.net IList查询数据后格式化数据再绑定控件
asp.net sql存储过程
asp.net 简单实现禁用或启用页面中的某一类型的控件
asp.net(c#)获取内容第一张图片地址的函数
The remote procedure call failed and did not execute的解决办法
ASP.NET 在线文件管理
asp.net 读取并修改config文件实现代码
ASP.NET Cookie 操作实现
asp.net Silverlight中的模式窗体
Silverlight中动态获取Web Service地址
asp.net Silverlight应用程序中获取载体aspx页面参数
asp.net 水晶报表隔行换色实现方法
asp.net 获取Gridview隐藏列的值
手动把asp.net的类生成dll文件的方法
asp.net 使用ObjectDataSource控件在ASP.NET中实现Ajax真分页
动态指定任意类型的ObjectDataSource对象的查询参数
asp.net Md5的用法小结

ASP.NET 中的 ASP.Net分页控件源码


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-09-13   浏览: 64 ::
收藏到网摘: n/a

由于.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(" ");
89 l.RenderControl(writer);
90 }
91
92 void RenderFirst (HtmlTextWriter writer)
93 {
94 firstButton.RenderControl(writer);
95
96 LiteralControl l = new LiteralControl(" ");
97 l.RenderControl(writer);
98 }
99
100 void RenderLast (HtmlTextWriter writer)
101 {
102 lastButton.RenderControl(writer);
103
104 LiteralControl l = new LiteralControl(" ");
105 l.RenderControl(writer);
106 }
107
108 void RenderPrevious (HtmlTextWriter writer)
109 {
110 previousButton.RenderControl(writer);
111
112 LiteralControl l = new LiteralControl(" ");
113 l.RenderControl(writer);
114 }
115
116 void RenderNext(HtmlTextWriter writer)
117 {
118 nextButton.RenderControl(writer);
119
120 LiteralControl l = new LiteralControl(" ");
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.RenderControl(writer);
138 }
139 if (i < (end - 1))
140 writer.Write(" ");
141 }
142
143 LiteralControl l1 = new LiteralControl(" ");
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 = new HyperLink();
198 pagingLinkButtons.EnableViewState = false;
199 pagingLinkButtons.Text = (i + 1).ToString();
200 pagingLinkButtons.ID = i.ToString();
201 pagingLinkButtons.CssClass = linkCss;
202 pagingLinkButtons.NavigateUrl = GetHrefString(i);
203
204 Controls.Add(pagingLinkButtons);
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 {
text = value;
}
}
#endregion
}
}
在页面上只需要向下面这样写:
1 <%@ Control Language="c#" %>
2 <%@ Register TagPrefix="Anchor" Namespace="MyCompany.Controls" Assembly="MyCompany.Controls" %>
3 <ANCHOR:PAGER id="Pager1" runat="server"></ANCHOR:PAGER>