一个简单的分页控件,内置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"><</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">></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
1
using System;
2
using System.Collections.Generic;
3
using System.ComponentModel;
4
using System.Text;
5
using System.Web;
6
using System.Web.UI;
7
using System.Web.UI.WebControls;
8
using System.IO;
9
using System.Reflection;
10
11
namespace 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 = "<<";
79
/**//// <summary>
80
/// 首页链接显示的字符
81
/// </summary>
82
public string FirstPageText
83
{
84
get
{ return firstPageText; }
85
set
{ firstPageText = value; }
86
}
87
88
string lastPageText = ">>";
89
/**//// <summary>
90
/// 尾页链接显示的字符
91
/// </summary>
92
public string LastPageText
93
{
94
get
{ return lastPageText; }
95
set
{ lastPageText = value; }
96
}
97
98
string previousPageText = "<";
99
/**//// <summary>
100
/// 上一页链接显示的字符
101
/// </summary>
102
public string PreviousPageText
103
{
104
get
{ return previousPageText; }
105
set
{ previousPageText = value; }
106
}
107
108
string nextPageText = ">";
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 == 0) return 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) - ";
556
public string CurrentPageStringFormat
557
{
558
get
{ return currentPageStringFormat; }
559
set
{ currentPageStringFormat = value; }
560
}
561
}
562
}
563
如果有比我还懒的人,可以直接下载下面的DLL:
/Files/bqrm/BqrmPager.rar