1
using System;
2
using System.Collections;
3
using System.Collections.Specialized;
4
using System.Web;
5
using System.Web.UI;
6
using System.Web.UI.WebControls;
7
using System.ComponentModel;
8
using System.IO;
9
10
namespace UC
11
{
12
/// <summary>
13
/// Pager 分页控件
14
/// </summary>
15
public class Pager : WebControl, INamingContainer
16
{
17
public Pager()
18
{
19
//在构造函数中创建控件并把控件加到该控件的Controls里
20
this.Controls.Add( this.GroupAllControls() ) ;
21
}
22
23
protected override void OnPreRender(EventArgs e)
24
{
25
this.GroupAllDisplayControls() ;
26
}
27
28
29
#region 成员属性定义
30
private Label currentPage ;
31
private TextBox txtPageSize ;
32
private TextBox txtPageIndex ;
33
private LinkButton lbtnFirst ;
34
private LinkButton lbtnPrev ;
35
private LinkButton lbtnNext ;
36
private LinkButton lbtnLast ;
37
//样式属性
38
//分页控件文本的呈现样式
39
const string defaultTextStyle = "FONT-SIZE: 12px; COLOR: #333333; FONT-FAMILY: \"宋体\"; TEXT-DECORATION: none" ;
40
//分页控件里的textbox的样式
41
const string defaultTextBoxStyle = "FONT-SIZE: 12px; COLOR: #333333; FONT-FAMILY: \"宋体\"; TEXT-DECORATION: none" ;
42
//分页控件里的TABLE的样式
43
const string defaultTableStyle = "BORDER-RIGHT: #4F9AE1 1px SOLID;MARGIN: 0px;BORDER-LEFT: #4F9AE1 1px SOLID;BORDER-BOTTOM: #4F9AE1 1px SOLID;PADDING:0px;" ;
44
/// <summary>
45
/// 控件文本的呈现样式
46
/// </summary>
47
[
48
Category("Appearance"),
49
Description("控件文本的呈现样式")
50
]
51
public string TextCssClass
52
{
53
get
54
{
55
if(ViewState["TextCssClass"] == null)
56
return "";
57
return ViewState["TextCssClass"].ToString() ;
58
}
59
set
60
{
61
ViewState["TextCssClass"] = value ;
62
}
63
}
64
65
/// <summary>
66
/// 分页控件里的textbox的样式
67
/// </summary>
68
[
69
Category("Appearance") ,
70
Description("分页控件里的textbox的样式")
71
]
72
public string TextBoxCssClass
73
{
74
get
75
{
76
if(ViewState["TextBoxCssClass"] == null)
77
return "";
78
return ViewState["TextBoxCssClass"].ToString() ;
79
}
80
set
81
{
82
ViewState["TextBoxCssClass"] = value ;
83
}
84
}
85
/// <summary>
86
/// 分页控件里的TABLE样式
87
/// </summary>
88
[
89
Category("Appearance") ,
90
Description("分页控件里的TABLE的样式")
91
]
92
public string TableCssClass
93
{
94
get
95
{
96
if(ViewState["TableCssClass"] == null)
97
return "";
98
return ViewState["TableCssClass"].ToString() ;
99
}
100
set
101
{
102
ViewState["TableCssClass"] = value ;
103
}
104
}
105
106
/// <summary>
107
/// 控件文本的呈现样式
108
/// </summary>
109
[
110
Category("Appearance"),
111
Description("控件文本的呈现样式")
112
]
113
public string TextStyle
114
{
115
get
116
{
117
if(ViewState["TextStyle"] == null)
118
return defaultTextStyle ;
119
120
return ViewState["TextStyle"].ToString() ;
121
}
122
set
123
{
124
ViewState["TextStyle"] = value ;
125
}
126
}
127
128
/// <summary>
129
/// 分页控件里的textbox的样式
130
/// </summary>
131
[
132
Category("Appearance") ,
133
Description("分页控件里的textbox的样式")
134
]
135
public string TextBoxStyle
136
{
137
get
138
{
139
if(ViewState["TextBoxStyle"] == null)
140
return defaultTextBoxStyle ;
141
142
return ViewState["TextBoxStyle"].ToString() ;
143
}
144
set
145
{
146
ViewState["TextBoxStyle"] = value ;
147
}
148
}
149
/// <summary>
150
/// 分页控件里的TABLE样式
151
/// </summary>
152
[
153
Category("Appearance") ,
154
Description("分页控件里的TABLE的样式")
155
]
156
public string TableStyle
157
{
158
get
159
{
160
if(ViewState["TableStyle"] == null)
161
return defaultTableStyle ;
162
163
return ViewState["TableStyle"].ToString() ;
164
}
165
set
166
{
167
ViewState["TableStyle"] = value ;
168
}
169
}
170
171
//分页核心属性
172
int totalPages = 0 ; //总页数
173
const int defaultPageIndex = 0 ; //默认页下标
174
const int defaultTotalRecords = 0 ;//默认总记录数
175
/// <summary>
176
/// 每页显示记录的数量
177
/// </summary>
178
[
179
Category("Required"),
180
Description("指定每页显示记录的数量")
181
]
182
public int PageSize
183
{
184
get
185
{
186
if (ViewState["PageSize"] == null)
187
return 20 ;
188
189
return Convert.ToInt32(ViewState["PageSize"]) ;
190
}
191
set
192
{
193
ViewState["PageSize"] = value;
194
}
195
}
196
/// <summary>
197
/// 当前所在的页码,从0开始表示第一页
198
/// </summary>
199
[
200
Browsable(false),
201
Description("指定当前所在的页码")
202
]
203
public int PageIndex
204
{
205
get
206
{
207
if (ViewState["PageIndex"] == null)
208
return defaultPageIndex;
209
210
return Convert.ToInt32(ViewState["PageIndex"]);
211
}
212
set
213
{
214
ViewState["PageIndex"] = value;
215
}
216
}
217
218
/// <summary>
219
/// 总页数
220
/// </summary>
221
[Browsable(false)]
222
public int TotalPages
223
{
224
get
225
{
226
return totalPages ;
227
}
228
set
229
{
230
totalPages = value ;
231
}
232
}
233
234
/// <summary>
235
/// 指定一共有多少记录
236
/// </summary>
237
[
238
Category("Required"),
239
Description("指定一共有多少记录")
240
]
241
public int TotalRecords
242
{
243
get
244
{
245
if (ViewState["TotalRecords"] == null)
246
return defaultTotalRecords;
247
248
return Convert.ToInt32(ViewState["TotalRecords"].ToString());
249
}
250
set
251
{
252
TotalPages = CalculateTotalPages(value, PageSize);
253
254
ViewState["TotalRecords"] = value;
255
}
256
}
257
258
/// <summary>
259
/// 分页控件里的控件分割符
260
/// </summary>
261
[
262
Category("Required"),
263
Description("分页控件里的控件分割符")
264
]
265
public string Separator
266
{
267
get
268
{
269
if (ViewState["Separator"] == null)
270
return "||" ;
271
272
return ViewState["Separator"].ToString() ;
273
}
274
set
275
{
276
ViewState["Separator"] = value;
277
}
278
}
279
#endregion
280
281
#region 方法
282
/// <summary>
283
/// 计算总页数
284
/// </summary>
285
/// <param name="totalRecords">记录总数</param>
286
/// <param name="pageSize">每页记录数</param>
287
/// <returns></returns>
288
public static int CalculateTotalPages(int totalRecords, int pageSize)
289
{
290
int totalPagesAvailable;
291
292
totalPagesAvailable = totalRecords / pageSize;
293
294
if ((totalRecords % pageSize) > 0)
295
totalPagesAvailable++;
296
297
return totalPagesAvailable;
298
}
299
/// <summary>
300
/// 创建控件 把所有子控件组装为一个table
301
/// </summary>
302
/// <returns></returns>
303
private Control GroupAllControls()
304
{
305
Table table;
306
TableRow tr;
307
TableCell td;
308
309
table = new Table();
310
// if(this.TableCssClass != "")
311
// table.CssClass = this.TableCssClass ;
312
// else
313
// table.Attributes["style"] = this.TableStyle;
314
table.CellPadding = 0;
315
table.CellSpacing = 0;
316
table.Width = Unit.Percentage(100) ;
317
318
tr = new TableRow() ;
319
320
td = new TableCell() ;
321
if(this.TableCssClass != "")
322
td.CssClass = this.TableCssClass ;
323
else
324
td.Attributes["style"] = this.TableStyle;
325
td.HorizontalAlign = HorizontalAlign.Center ;
326
td.Controls.Add( this.CreatePrevNextNavigation() ) ;
327
tr.Controls.Add( td ) ;
328
329
td = new TableCell() ;
330
if(this.TableCssClass != "")
331
td.CssClass = this.TableCssClass ;
332
else
333
td.Attributes["style"] = this.TableStyle;
334
td.HorizontalAlign = HorizontalAlign.Center ;
335
td.Controls.Add( this.CreateCurrentPage() ) ;
336
tr.Controls.Add( td ) ;
337
338
td = new TableCell() ;
339
if(this.TableCssClass != "")
340
td.CssClass = this.TableCssClass ;
341
else
342
td.Attributes["style"] = this.TableStyle;
343
td.HorizontalAlign = HorizontalAlign.Center ;
344
td.Controls.Add( this.CreatePageSize() ) ;
345
tr.Controls.Add( td ) ;
346
347
table.Controls.Add( tr ) ;
348
349
return table ;
350
}
351
352
/// <summary>
353
/// 创建用于显示当前分页情况的控件
354
/// </summary>
355
private Control CreateCurrentPage()
356
{
357
currentPage = new Label() ;
358
if(this.TextCssClass != "")
359
currentPage.CssClass = this.TextCssClass ;
360
else
361
currentPage.Attributes["style"] = this.TextStyle;
362
return currentPage ;
363
}
364
365
/// <summary>
366
/// 创建用于供用户设置每页显示记录条数的控件
367
/// </summary>
368
/// <returns></returns>
369
private Control CreatePageSize()
370
{
371
PlaceHolder pageSizeControls = new PlaceHolder();
372
Label lbTemp = new Label() ;
373
lbTemp.Text = "每页记录数:" ;
374
if(this.TextCssClass != "")
375
lbTemp.CssClass = this.TextCssClass ;
376
else
377
lbTemp.Attributes["style"] = this.TextStyle;
378
txtPageSize = new TextBox() ;
379
if(this.TextBoxCssClass != "")
380
txtPageSize.CssClass = this.TextBoxCssClass ;
381
else
382
txtPageSize.Attributes["style"] = this.TextBoxCssClass;
383
txtPageSize.Width = Unit.Point( 20 ) ;
384
txtPageSize.TextChanged += new System.EventHandler(this.TextBox_TextChanged);
385
txtPageSize.AutoPostBack = true;
386
387
pageSizeControls.Controls.Add(lbTemp) ;
388
pageSizeControls.Controls.Add(txtPageSize) ;
389
return pageSizeControls ;
390
}
391
392
/// <summary>
393
/// 创建用于四个分页控件列表以及供用户设置每页记录数的控件
394
/// </summary>
395
/// <returns></returns>
396
private Control CreatePrevNextNavigation()
397
{
398
PlaceHolder prevNextControls = new PlaceHolder();
399
400
//第一页,上一页,下一页,最后页的控件
401
lbtnFirst = new LinkButton() ;
402
this.lbtnFirst.Click += new System.EventHandler(this.PrevNext_Click);
403
lbtnFirst.Text = "首页";
404
lbtnFirst.ToolTip = "首页" ;
405
if(this.TextCssClass != "")
406
lbtnFirst.CssClass = this.TextCssClass ;
407
else
408
lbtnFirst.Attributes["style"] = this.TextStyle;
409
410
lbtnPrev = new LinkButton() ;
411
lbtnPrev.Click += new EventHandler(PrevNext_Click);
412
lbtnPrev.Text = "上一页" ;
413
lbtnPrev.ToolTip = "上一页" ;
414
if(this.TextCssClass != "")
415
lbtnPrev.CssClass = this.TextCssClass ;
416
else
417
lbtnPrev.Attributes["style"] = this.TextStyle;
418
419
lbtnNext = new LinkButton() ;
420
lbtnNext.Click += new EventHandler(PrevNext_Click);
421
lbtnNext.Text = "下一页" ;
422
lbtnNext.ToolTip = "下一页" ;
423
if(this.TextCssClass != "")
424
lbtnNext.CssClass = this.TextCssClass ;
425
else
426
lbtnNext.Attributes["style"] = this.TextStyle;
427
428
lbtnLast = new LinkButton() ;
429
lbtnLast.Click += new EventHandler(PrevNext_Click);
430
lbtnLast.Text = "末页" ;
431
lbtnLast.ToolTip = "末页" ;
432
if(this.TextCssClass != "")
433
lbtnLast.CssClass = this.TextCssClass ;
434
else
435
lbtnLast.Attributes["style"] = this.TextStyle;
436
437
438
//供用户设置和显示当前页码的控件
439
Label lbPageIndexPreTitle = new Label() ;
440
lbPageIndexPreTitle.Text = "转到:第" ;
441
if(this.TextCssClass != "")
442
lbPageIndexPreTitle.CssClass = this.TextCssClass ;
443
else
444
lbPageIndexPreTitle.Attributes["style"] = this.TextStyle;
445
txtPageIndex = new TextBox() ;
446
if(this.TextBoxCssClass != "")
447
txtPageIndex.CssClass = this.TextBoxCssClass ;
448
else
449
txtPageIndex.Attributes["style"] = this.TextBoxCssClass;
450
txtPageIndex.Width = Unit.Point( 20 ) ;
451
txtPageIndex.TextChanged += new System.EventHandler(this.TextBox_TextChanged);
452
txtPageIndex.AutoPostBack = true;
453
Label lbPageIndexNextTitle = new Label() ;
454
lbPageIndexNextTitle.Text = "页" ;
455
if(this.TextCssClass != "")
456
lbPageIndexNextTitle.CssClass = this.TextCssClass ;
457
else
458
lbPageIndexNextTitle.Attributes["style"] = this.TextStyle;
459
460
prevNextControls.Controls.Add( lbtnFirst ) ;
461
prevNextControls.Controls.Add( this.GetWhiteSpace(1) ) ;
462
prevNextControls.Controls.Add( lbtnPrev ) ;
463
prevNextControls.Controls.Add( this.GetWhiteSpace(1) ) ;
464
prevNextControls.Controls.Add( lbtnNext ) ;
465
prevNextControls.Controls.Add( this.GetWhiteSpace(1) ) ;
466
prevNextControls.Controls.Add( lbtnLast ) ;
467
prevNextControls.Controls.Add( this.GetWhiteSpace(1) ) ;
468
prevNextControls.Controls.Add(lbPageIndexPreTitle) ;
469
prevNextControls.Controls.Add( txtPageIndex ) ;
470
prevNextControls.Controls.Add(lbPageIndexNextTitle) ;
471
472
return prevNextControls ;
473
}
474
475
/// <summary>
476
/// 按设定空格数的文本控件,用于间隔控件间的距离
477
/// </summary>
478
/// <param name="num">空格数</param>
479
/// <returns></returns>
480
private Control GetWhiteSpace(int num)
481
{
482
Label lbSeparator = new Label() ;
483
lbSeparator.Text = this.Separator ;
484
if(this.TextCssClass != "")
485
lbSeparator.CssClass = this.TextCssClass ;
486
else
487
lbSeparator.Attributes["style"] = this.TextStyle;
488
return lbSeparator ;
489
}
490
491
/// <summary>
492
/// 把下面的显示控件组合在一起成为一个完整的分页控件显示元素
493
/// </summary>
494
private void GroupAllDisplayControls()
495
{
496
TotalPages = CalculateTotalPages(TotalRecords, PageSize);
497
498
if(PageIndex >= this.TotalPages)
499
{
500
this.PageIndex = this.TotalPages - 1 ;
501
}
502
if(PageIndex < 0) //这里不能用else if
503
{
504
this.PageIndex = 0 ;
505
}
506
507
this.DisplayPageSize() ;
508
this.DisplayPrevNext() ;
509
this.DisplayCurrentIndex() ;
510
this.DisplayCurrentPage() ;
511
}
512
513
/// <summary>
514
/// 显示当前页的情况
515
/// </summary>
516
private void DisplayCurrentPage()
517
{
518
string tempStr = @"第{0}页/共{1}页 总记录数:{2}" ;
519
currentPage.Text = string.Format(tempStr,TotalPages!=0 ? (PageIndex + 1):PageIndex,TotalPages,TotalRecords) ;
520
}
521
522
/// <summary>
523
/// 在指定控件上显示当前页码
524
/// </summary>
525
private void DisplayCurrentIndex()
526
{
527
txtPageIndex.Text = string.Empty ;
528
if(this.TotalPages == 0)
529
{
530
txtPageIndex.Text = this.PageIndex.ToString() ;
531
txtPageIndex.Enabled = false ;
532
return ;
533
}
534
else
535
{
536
txtPageIndex.Text = Convert.ToString(this.PageIndex + 1) ;
537
txtPageIndex.Enabled = true ;
538
}
539
}
540
/// <summary>
541
/// 在指定控件上显示每页记录数
542
/// </summary>
543
private void DisplayPageSize()
544
{
545
txtPageSize.Text = this.PageSize.ToString() ;
546
}
547
548
/// <summary>
549
/// 前后翻页控件的显示情况
550
/// </summary>
551
private void DisplayPrevNext()
552
{
553
554
if ( TotalPages == 0 || TotalPages ==1 )
555
{
556
lbtnFirst.Enabled = false ;
557
lbtnPrev.Enabled = false ;
558
lbtnNext.Enabled = false ;
559
lbtnLast.Enabled = false ;
560
return ;
561
}
562
563
lbtnFirst.CommandArgument = "0" ;
564
lbtnPrev.CommandArgument = (PageIndex - 1).ToString();
565
lbtnNext.CommandArgument = (PageIndex + 1).ToString();
566
lbtnLast.CommandArgument = (TotalPages - 1 ).ToString() ;
567
568
569
//根据不同情况决定那些控件可用与否
570
if ((PageIndex > 0) && ((PageIndex + 1) < TotalPages))
571
{
572
lbtnFirst.Enabled = true ;
573
lbtnPrev.Enabled = true ;
574
lbtnNext.Enabled = true ;
575
lbtnLast.Enabled = true ;
576
}
577
else if (PageIndex == 0 && TotalPages==1)
578
{
579
lbtnFirst.Enabled = false ;
580
lbtnPrev.Enabled = false ;
581
lbtnNext.Enabled = false ;
582
lbtnLast.Enabled = false ;
583
}
584
else if (PageIndex == 0)
585
{
586
lbtnFirst.Enabled = false ;
587
lbtnPrev.Enabled = false ;
588
lbtnNext.Enabled = true ;
589
lbtnLast.Enabled = true ;
590
}
591
else if ((PageIndex + 1) == TotalPages)
592
{
593
lbtnFirst.Enabled = true ;
594
lbtnPrev.Enabled = true ;
595
lbtnNext.Enabled = false ;
596
lbtnLast.Enabled = false ;
597
}
598
}
599
600
#endregion
601
602
#region 公开和处理事件
603
public event System.EventHandler PageIndex_Changed ;
604
605
/// <summary>
606
/// 上下翻页控件点击事件处理,同时对控件外触发PageIndex_Changed事件
607
/// </summary>
608
private void PrevNext_Click(Object sender, EventArgs e)
609
{
610
this.PageIndex = Convert.ToInt32( ((LinkButton)sender).CommandArgument ) ;
611
612
this.PageSize = Convert.ToInt32( this.txtPageSize.Text ) ;
613
614
this.txtPageIndex.Text = this.PageIndex.ToString() ;
615
616
if (null != PageIndex_Changed)
617
PageIndex_Changed(sender, e);
618
}
619
620
/// <summary>
621
/// 当用户手工更改每页分页数,并按enter键提交时重置PageSize和PageIndex,并同时对控件外触发PageIndex_Changed事件
622
/// </summary>
623
private void btnReIndex_Click(Object sender, System.EventArgs e)
624
{
625
this.PageSize = Convert.ToInt32( txtPageSize.Text.Trim() ) ;
626
this.PageIndex = Convert.ToInt32( txtPageIndex.Text.Trim() ) - 1 ;
627
628
if (null != PageIndex_Changed)
629
PageIndex_Changed(sender, e);
630
}
631
632
private void TextBox_TextChanged(object sender, System.EventArgs e)
633
{
634
this.PageSize = Convert.ToInt32( txtPageSize.Text.Trim() ) ;
635
this.PageIndex = Convert.ToInt32( txtPageIndex.Text.Trim() ) - 1 ;
636
637
if (null != PageIndex_Changed)
638
PageIndex_Changed(sender, e);
639
}
640
#endregion
641
642
}
643
}
644
using System;2
using System.Collections;3
using System.Collections.Specialized;4
using System.Web;5
using System.Web.UI;6
using System.Web.UI.WebControls;7
using System.ComponentModel;8
using System.IO;9

10
namespace UC11
{12
/// <summary>13
/// Pager 分页控件14
/// </summary>15
public class Pager : WebControl, INamingContainer 16
{17
public Pager()18
{19
//在构造函数中创建控件并把控件加到该控件的Controls里20
this.Controls.Add( this.GroupAllControls() ) ;21
}22

23
protected override void OnPreRender(EventArgs e) 24
{25
this.GroupAllDisplayControls() ;26
}27

28

29
#region 成员属性定义30
private Label currentPage ;31
private TextBox txtPageSize ;32
private TextBox txtPageIndex ;33
private LinkButton lbtnFirst ;34
private LinkButton lbtnPrev ;35
private LinkButton lbtnNext ;36
private LinkButton lbtnLast ;37
//样式属性38
//分页控件文本的呈现样式39
const string defaultTextStyle = "FONT-SIZE: 12px; COLOR: #333333; FONT-FAMILY: \"宋体\"; TEXT-DECORATION: none" ; 40
//分页控件里的textbox的样式41
const string defaultTextBoxStyle = "FONT-SIZE: 12px; COLOR: #333333; FONT-FAMILY: \"宋体\"; TEXT-DECORATION: none" ; 42
//分页控件里的TABLE的样式43
const string defaultTableStyle = "BORDER-RIGHT: #4F9AE1 1px SOLID;MARGIN: 0px;BORDER-LEFT: #4F9AE1 1px SOLID;BORDER-BOTTOM: #4F9AE1 1px SOLID;PADDING:0px;" ; 44
/// <summary>45
/// 控件文本的呈现样式46
/// </summary>47
[48
Category("Appearance"),49
Description("控件文本的呈现样式")50
]51
public string TextCssClass52
{53
get54
{55
if(ViewState["TextCssClass"] == null)56
return "";57
return ViewState["TextCssClass"].ToString() ;58
}59
set60
{61
ViewState["TextCssClass"] = value ;62
}63
}64

65
/// <summary>66
/// 分页控件里的textbox的样式67
/// </summary>68
[69
Category("Appearance") ,70
Description("分页控件里的textbox的样式")71
]72
public string TextBoxCssClass73
{74
get75
{76
if(ViewState["TextBoxCssClass"] == null)77
return "";78
return ViewState["TextBoxCssClass"].ToString() ;79
}80
set81
{82
ViewState["TextBoxCssClass"] = value ;83
}84
}85
/// <summary>86
/// 分页控件里的TABLE样式87
/// </summary>88
[89
Category("Appearance") ,90
Description("分页控件里的TABLE的样式")91
]92
public string TableCssClass93
{94
get95
{96
if(ViewState["TableCssClass"] == null)97
return "";98
return ViewState["TableCssClass"].ToString() ;99
}100
set101
{102
ViewState["TableCssClass"] = value ;103
}104
}105

106
/// <summary>107
/// 控件文本的呈现样式108
/// </summary>109
[110
Category("Appearance"),111
Description("控件文本的呈现样式")112
]113
public string TextStyle114
{115
get116
{117
if(ViewState["TextStyle"] == null)118
return defaultTextStyle ;119

120
return ViewState["TextStyle"].ToString() ;121
}122
set123
{124
ViewState["TextStyle"] = value ;125
}126
}127

128
/// <summary>129
/// 分页控件里的textbox的样式130
/// </summary>131
[132
Category("Appearance") ,133
Description("分页控件里的textbox的样式")134
]135
public string TextBoxStyle136
{137
get138
{139
if(ViewState["TextBoxStyle"] == null)140
return defaultTextBoxStyle ;141

142
return ViewState["TextBoxStyle"].ToString() ;143
}144
set145
{146
ViewState["TextBoxStyle"] = value ;147
}148
}149
/// <summary>150
/// 分页控件里的TABLE样式151
/// </summary>152
[153
Category("Appearance") ,154
Description("分页控件里的TABLE的样式")155
]156
public string TableStyle157
{158
get159
{160
if(ViewState["TableStyle"] == null)161
return defaultTableStyle ;162

163
return ViewState["TableStyle"].ToString() ;164
}165
set166
{167
ViewState["TableStyle"] = value ;168
}169
}170

171
//分页核心属性172
int totalPages = 0 ; //总页数173
const int defaultPageIndex = 0 ; //默认页下标174
const int defaultTotalRecords = 0 ;//默认总记录数175
/// <summary>176
/// 每页显示记录的数量177
/// </summary>178
[179
Category("Required"),180
Description("指定每页显示记录的数量")181
]182
public int PageSize 183
{184
get 185
{186
if (ViewState["PageSize"] == null)187
return 20 ;188

189
return Convert.ToInt32(ViewState["PageSize"]) ;190
}191
set 192
{193
ViewState["PageSize"] = value;194
}195
}196
/// <summary>197
/// 当前所在的页码,从0开始表示第一页198
/// </summary>199
[200
Browsable(false),201
Description("指定当前所在的页码")202
]203
public int PageIndex 204
{205
get 206
{207
if (ViewState["PageIndex"] == null)208
return defaultPageIndex;209

210
return Convert.ToInt32(ViewState["PageIndex"]);211
}212
set 213
{214
ViewState["PageIndex"] = value;215
}216
}217

218
/// <summary>219
/// 总页数220
/// </summary>221
[Browsable(false)]222
public int TotalPages 223
{224
get 225
{226
return totalPages ;227
}228
set 229
{230
totalPages = value ;231
}232
}233

234
/// <summary>235
/// 指定一共有多少记录236
/// </summary>237
[238
Category("Required"),239
Description("指定一共有多少记录")240
]241
public int TotalRecords 242
{243
get 244
{245
if (ViewState["TotalRecords"] == null)246
return defaultTotalRecords;247

248
return Convert.ToInt32(ViewState["TotalRecords"].ToString());249
}250
set 251
{252
TotalPages = CalculateTotalPages(value, PageSize);253

254
ViewState["TotalRecords"] = value;255
}256
}257

258
/// <summary>259
/// 分页控件里的控件分割符260
/// </summary>261
[262
Category("Required"),263
Description("分页控件里的控件分割符")264
]265
public string Separator 266
{267
get 268
{269
if (ViewState["Separator"] == null)270
return "||" ;271

272
return ViewState["Separator"].ToString() ;273
}274
set 275
{276
ViewState["Separator"] = value;277
}278
}279
#endregion280

281
#region 方法282
/// <summary>283
/// 计算总页数284
/// </summary>285
/// <param name="totalRecords">记录总数</param>286
/// <param name="pageSize">每页记录数</param>287
/// <returns></returns>288
public static int CalculateTotalPages(int totalRecords, int pageSize) 289
{290
int totalPagesAvailable;291

292
totalPagesAvailable = totalRecords / pageSize;293

294
if ((totalRecords % pageSize) > 0)295
totalPagesAvailable++;296

297
return totalPagesAvailable;298
}299
/// <summary>300
/// 创建控件 把所有子控件组装为一个table301
/// </summary>302
/// <returns></returns>303
private Control GroupAllControls()304
{305
Table table;306
TableRow tr;307
TableCell td;308

309
table = new Table();310
// if(this.TableCssClass != "")311
// table.CssClass = this.TableCssClass ;312
// else313
// table.Attributes["style"] = this.TableStyle;314
table.CellPadding = 0;315
table.CellSpacing = 0;316
table.Width = Unit.Percentage(100) ;317

318
tr = new TableRow() ;319

320
td = new TableCell() ;321
if(this.TableCssClass != "")322
td.CssClass = this.TableCssClass ;323
else324
td.Attributes["style"] = this.TableStyle;325
td.HorizontalAlign = HorizontalAlign.Center ;326
td.Controls.Add( this.CreatePrevNextNavigation() ) ;327
tr.Controls.Add( td ) ;328
329
td = new TableCell() ;330
if(this.TableCssClass != "")331
td.CssClass = this.TableCssClass ;332
else333
td.Attributes["style"] = this.TableStyle;334
td.HorizontalAlign = HorizontalAlign.Center ;335
td.Controls.Add( this.CreateCurrentPage() ) ;336
tr.Controls.Add( td ) ;337
338
td = new TableCell() ;339
if(this.TableCssClass != "")340
td.CssClass = this.TableCssClass ;341
else342
td.Attributes["style"] = this.TableStyle;343
td.HorizontalAlign = HorizontalAlign.Center ;344
td.Controls.Add( this.CreatePageSize() ) ;345
tr.Controls.Add( td ) ;346

347
table.Controls.Add( tr ) ;348

349
return table ;350
}351

352
/// <summary>353
/// 创建用于显示当前分页情况的控件354
/// </summary>355
private Control CreateCurrentPage()356
{357
currentPage = new Label() ;358
if(this.TextCssClass != "")359
currentPage.CssClass = this.TextCssClass ;360
else361
currentPage.Attributes["style"] = this.TextStyle;362
return currentPage ;363
}364

365
/// <summary>366
/// 创建用于供用户设置每页显示记录条数的控件367
/// </summary>368
/// <returns></returns>369
private Control CreatePageSize()370
{371
PlaceHolder pageSizeControls = new PlaceHolder();372
Label lbTemp = new Label() ;373
lbTemp.Text = "每页记录数:" ;374
if(this.TextCssClass != "")375
lbTemp.CssClass = this.TextCssClass ;376
else377
lbTemp.Attributes["style"] = this.TextStyle;378
txtPageSize = new TextBox() ;379
if(this.TextBoxCssClass != "")380
txtPageSize.CssClass = this.TextBoxCssClass ;381
else382
txtPageSize.Attributes["style"] = this.TextBoxCssClass;383
txtPageSize.Width = Unit.Point( 20 ) ;384
txtPageSize.TextChanged += new System.EventHandler(this.TextBox_TextChanged);385
txtPageSize.AutoPostBack = true;386

387
pageSizeControls.Controls.Add(lbTemp) ;388
pageSizeControls.Controls.Add(txtPageSize) ;389
return pageSizeControls ;390
}391

392
/// <summary>393
/// 创建用于四个分页控件列表以及供用户设置每页记录数的控件394
/// </summary>395
/// <returns></returns>396
private Control CreatePrevNextNavigation()397
{398
PlaceHolder prevNextControls = new PlaceHolder();399

400
//第一页,上一页,下一页,最后页的控件401
lbtnFirst = new LinkButton() ;402
this.lbtnFirst.Click += new System.EventHandler(this.PrevNext_Click);403
lbtnFirst.Text = "首页";404
lbtnFirst.ToolTip = "首页" ;405
if(this.TextCssClass != "")406
lbtnFirst.CssClass = this.TextCssClass ;407
else408
lbtnFirst.Attributes["style"] = this.TextStyle;409

410
lbtnPrev = new LinkButton() ;411
lbtnPrev.Click += new EventHandler(PrevNext_Click);412
lbtnPrev.Text = "上一页" ;413
lbtnPrev.ToolTip = "上一页" ;414
if(this.TextCssClass != "")415
lbtnPrev.CssClass = this.TextCssClass ;416
else417
lbtnPrev.Attributes["style"] = this.TextStyle;418

419
lbtnNext = new LinkButton() ;420
lbtnNext.Click += new EventHandler(PrevNext_Click);421
lbtnNext.Text = "下一页" ;422
lbtnNext.ToolTip = "下一页" ;423
if(this.TextCssClass != "")424
lbtnNext.CssClass = this.TextCssClass ;425
else426
lbtnNext.Attributes["style"] = this.TextStyle;427

428
lbtnLast = new LinkButton() ;429
lbtnLast.Click += new EventHandler(PrevNext_Click);430
lbtnLast.Text = "末页" ;431
lbtnLast.ToolTip = "末页" ;432
if(this.TextCssClass != "")433
lbtnLast.CssClass = this.TextCssClass ;434
else435
lbtnLast.Attributes["style"] = this.TextStyle;436

437

438
//供用户设置和显示当前页码的控件439
Label lbPageIndexPreTitle = new Label() ;440
lbPageIndexPreTitle.Text = "转到:第" ;441
if(this.TextCssClass != "")442
lbPageIndexPreTitle.CssClass = this.TextCssClass ;443
else444
lbPageIndexPreTitle.Attributes["style"] = this.TextStyle;445
txtPageIndex = new TextBox() ;446
if(this.TextBoxCssClass != "")447
txtPageIndex.CssClass = this.TextBoxCssClass ;448
else449
txtPageIndex.Attributes["style"] = this.TextBoxCssClass;450
txtPageIndex.Width = Unit.Point( 20 ) ;451
txtPageIndex.TextChanged += new System.EventHandler(this.TextBox_TextChanged);452
txtPageIndex.AutoPostBack = true;453
Label lbPageIndexNextTitle = new Label() ;454
lbPageIndexNextTitle.Text = "页" ;455
if(this.TextCssClass != "")456
lbPageIndexNextTitle.CssClass = this.TextCssClass ;457
else458
lbPageIndexNextTitle.Attributes["style"] = this.TextStyle;459

460
prevNextControls.Controls.Add( lbtnFirst ) ;461
prevNextControls.Controls.Add( this.GetWhiteSpace(1) ) ;462
prevNextControls.Controls.Add( lbtnPrev ) ;463
prevNextControls.Controls.Add( this.GetWhiteSpace(1) ) ;464
prevNextControls.Controls.Add( lbtnNext ) ;465
prevNextControls.Controls.Add( this.GetWhiteSpace(1) ) ;466
prevNextControls.Controls.Add( lbtnLast ) ;467
prevNextControls.Controls.Add( this.GetWhiteSpace(1) ) ;468
prevNextControls.Controls.Add(lbPageIndexPreTitle) ;469
prevNextControls.Controls.Add( txtPageIndex ) ;470
prevNextControls.Controls.Add(lbPageIndexNextTitle) ;471

472
return prevNextControls ;473
}474

475
/// <summary>476
/// 按设定空格数的文本控件,用于间隔控件间的距离477
/// </summary>478
/// <param name="num">空格数</param>479
/// <returns></returns>480
private Control GetWhiteSpace(int num)481
{482
Label lbSeparator = new Label() ;483
lbSeparator.Text = this.Separator ;484
if(this.TextCssClass != "")485
lbSeparator.CssClass = this.TextCssClass ;486
else487
lbSeparator.Attributes["style"] = this.TextStyle;488
return lbSeparator ;489
}490

491
/// <summary>492
/// 把下面的显示控件组合在一起成为一个完整的分页控件显示元素493
/// </summary>494
private void GroupAllDisplayControls()495
{496
TotalPages = CalculateTotalPages(TotalRecords, PageSize); 497

498
if(PageIndex >= this.TotalPages)499
{500
this.PageIndex = this.TotalPages - 1 ;501
}502
if(PageIndex < 0) //这里不能用else if503
{504
this.PageIndex = 0 ;505
}506

507
this.DisplayPageSize() ;508
this.DisplayPrevNext() ;509
this.DisplayCurrentIndex() ;510
this.DisplayCurrentPage() ;511
}512

513
/// <summary>514
/// 显示当前页的情况515
/// </summary>516
private void DisplayCurrentPage()517
{518
string tempStr = @"第{0}页/共{1}页 总记录数:{2}" ;519
currentPage.Text = string.Format(tempStr,TotalPages!=0 ? (PageIndex + 1):PageIndex,TotalPages,TotalRecords) ;520
}521

522
/// <summary>523
/// 在指定控件上显示当前页码524
/// </summary>525
private void DisplayCurrentIndex()526
{527
txtPageIndex.Text = string.Empty ;528
if(this.TotalPages == 0)529
{530
txtPageIndex.Text = this.PageIndex.ToString() ;531
txtPageIndex.Enabled = false ;532
return ;533
}534
else535
{536
txtPageIndex.Text = Convert.ToString(this.PageIndex + 1) ;537
txtPageIndex.Enabled = true ;538
}539
}540
/// <summary>541
/// 在指定控件上显示每页记录数542
/// </summary>543
private void DisplayPageSize()544
{545
txtPageSize.Text = this.PageSize.ToString() ;546
}547

548
/// <summary>549
/// 前后翻页控件的显示情况550
/// </summary>551
private void DisplayPrevNext()552
{553

554
if ( TotalPages == 0 || TotalPages ==1 )555
{556
lbtnFirst.Enabled = false ;557
lbtnPrev.Enabled = false ;558
lbtnNext.Enabled = false ;559
lbtnLast.Enabled = false ;560
return ;561
}562

563
lbtnFirst.CommandArgument = "0" ;564
lbtnPrev.CommandArgument = (PageIndex - 1).ToString();565
lbtnNext.CommandArgument = (PageIndex + 1).ToString();566
lbtnLast.CommandArgument = (TotalPages - 1 ).ToString() ;567

568

569
//根据不同情况决定那些控件可用与否570
if ((PageIndex > 0) && ((PageIndex + 1) < TotalPages)) 571
{572
lbtnFirst.Enabled = true ;573
lbtnPrev.Enabled = true ;574
lbtnNext.Enabled = true ;575
lbtnLast.Enabled = true ;576
} 577
else if (PageIndex == 0 && TotalPages==1) 578
{579
lbtnFirst.Enabled = false ;580
lbtnPrev.Enabled = false ;581
lbtnNext.Enabled = false ;582
lbtnLast.Enabled = false ;583
} 584
else if (PageIndex == 0) 585
{586
lbtnFirst.Enabled = false ;587
lbtnPrev.Enabled = false ;588
lbtnNext.Enabled = true ;589
lbtnLast.Enabled = true ;590
} 591
else if ((PageIndex + 1) == TotalPages) 592
{593
lbtnFirst.Enabled = true ;594
lbtnPrev.Enabled = true ;595
lbtnNext.Enabled = false ;596
lbtnLast.Enabled = false ;597
}598
}599

600
#endregion601

602
#region 公开和处理事件603
public event System.EventHandler PageIndex_Changed ;604

605
/// <summary>606
/// 上下翻页控件点击事件处理,同时对控件外触发PageIndex_Changed事件607
/// </summary>608
private void PrevNext_Click(Object sender, EventArgs e) 609
{610
this.PageIndex = Convert.ToInt32( ((LinkButton)sender).CommandArgument ) ;611

612
this.PageSize = Convert.ToInt32( this.txtPageSize.Text ) ;613

614
this.txtPageIndex.Text = this.PageIndex.ToString() ;615

616
if (null != PageIndex_Changed)617
PageIndex_Changed(sender, e);618
}619

620
/// <summary>621
/// 当用户手工更改每页分页数,并按enter键提交时重置PageSize和PageIndex,并同时对控件外触发PageIndex_Changed事件622
/// </summary>623
private void btnReIndex_Click(Object sender, System.EventArgs e)624
{625
this.PageSize = Convert.ToInt32( txtPageSize.Text.Trim() ) ;626
this.PageIndex = Convert.ToInt32( txtPageIndex.Text.Trim() ) - 1 ;627

628
if (null != PageIndex_Changed)629
PageIndex_Changed(sender, e);630
}631

632
private void TextBox_TextChanged(object sender, System.EventArgs e)633
{634
this.PageSize = Convert.ToInt32( txtPageSize.Text.Trim() ) ;635
this.PageIndex = Convert.ToInt32( txtPageIndex.Text.Trim() ) - 1 ;636

637
if (null != PageIndex_Changed)638
PageIndex_Changed(sender, e);639
}640
#endregion641

642
}643
}644



浙公网安备 33010602011771号