DATAGRID的自定义分页控件

Posted on 2005-08-26 09:27  杨柳  阅读(223)  评论(0)    收藏  举报
  1using System;
  2using System.Collections;
  3using System.Collections.Specialized;
  4using System.Web;
  5using System.Web.UI;
  6using System.Web.UI.WebControls;
  7using System.ComponentModel;
  8using System.IO;
  9
 10namespace 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}页&nbsp;总记录数:{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

博客园  ©  2004-2026
浙公网安备 33010602011771号 浙ICP备2021040463号-3