上博客园也有2个月的时间了,一直都只是看别人写的帖子。今天终于注册了个ID。

这次把我写的一个分页控件贴上来。前阵子写了一个winform的数据库管理程序,用一个dataGrid显示数据库表中的所有内容,后来发现当数据库中的条目增多的时候,程序运行速度明显下降,系统占用内存也很大,决定对dataGrid做个分页,每次只取出要显示页的内容。上网搜了一下,没有找到我需要的,于是自己写了一个分页控件。

程序很简单,用的时候需要提供pageCount(页数),pageShow(显示的页数),currPage(当前页号)
控件提供一个自定义的事件LnkLblClicked,当用户点击页面链接的时候就会触发这个事件。下面是程序的源码。

 

using System;
 using System.Collections;
 using System.ComponentModel;
 using System.Drawing;
 using System.Data;
 using System.Windows.Forms;namespace ActiveButton
 { 
 
     /** <summary>
     /// Summary description for PageControl.
     /// </summary>
     public class PageControl : System.Windows.Forms.UserControl
     { 
 
         /** <summary> 
         /// Required designer variable.
         /// </summary>
         private int pageCount;
         private int currPage;
     //    private int pageSize;
         private int pageShow;
         private int xDistance;
         private bool bolPrev;
         private bool bolNext;
         private int start, end;        private EventHandler lnkLblClicked;
        public event EventHandler LnkLblClicked
         { 
 
             add{lnkLblClicked += value;}
             remove{lnkLblClicked -= value;}
         }
         protected virtual void OnLnkLblClicked(EventArgs e)
         { 
 
             if (lnkLblClicked != null)
                 lnkLblClicked(this,e);                
         }        Field#region Field
         public int PageCount
         { 
 
             get{return pageCount;}
             set{pageCount = value;}        
         }
         public int CurrPage
         { 
 
             get{return currPage;}
             set{currPage = value;}
         }
 //        public int PageSize
 //        { 
 
 //            get{return pageSize;}
 //            set{pageSize = value;}
 //        }
         public int PageShow
         { 
 
             get{return pageShow;}
             set{pageShow = value;}
         }
         public int XDistance
         { 
 
             get{return xDistance;}
             set{xDistance = value;}
         }
         #endregion
                 private System.ComponentModel.Container components = null;
        public PageControl()
         { 
 
             // This call is required by the Windows.Forms Form Designer.
             InitializeComponent();            // TODO: Add any initialization after the InitializeComponent call
        }
         public PageControl(int pageCount,int pageSize,int pageShow):this()
         { 
 
             this.pageCount = pageCount;
         //    this.pageSize = pageSize;
             this.pageShow = pageShow;
         }        /** <summary> 
         /// Clean up any resources being used.
         /// </summary>
         protected override void Dispose( bool disposing )
         { 
 
             if( disposing )
             { 
 
                 if(components != null)
                 { 
 
                     components.Dispose();
                 }
             }
             base.Dispose( disposing );
         }        Component Designer generated code#region Component Designer generated code
         /** <summary> 
         /// Required method for Designer support - do not modify 
         /// the contents of this method with the code editor.
         /// </summary>
         private void InitializeComponent()
         { 
 
             this.SuspendLayout();
             // 
             // PageControl
             // 
              = "PageControl";
             this.Size = new System.Drawing.Size(320, 24);
             this.Load += new System.EventHandler(this.PageControl_Load);
             this.ResumeLayout(false);        }
         #endregion        private void PageControl_Load(object sender, System.EventArgs e)
         { 
 
             xDistance = 0;
             bolPrev = pageCount > pageShow;
         //    currPage = pageCount;
             end = pageCount;
             start = Math.Max(1,end - pageShow + 1);
             DrawControl();
         }
         private void DrawControl()
         { 
 
             this.Controls.Clear();
             System.Windows.Forms.Label lblPageCount = new Label();
             lblPageCount.Text = "共" + pageCount + "页";
             this.AddControl(lblPageCount,new Point(8,8),new Size(40,16));
             int x = lblPageCount.Bounds.Right;
             int y = lblPageCount.Location.Y;
             System.Windows.Forms.Control currCtl = lblPageCount;            //calculate page start and end
             int pageShowCount = Math.Min(pageCount,pageShow);
 //            start = Math.Max(1,currPage - pageShow/2);
 //            end = start + pageShowCount -1;
 //            if (pageCount - currPage < pageShow/2)
 //            { 
 
 //                end = pageCount;
 //                start = pageCount - pageShowCount + 1;
 //            }
             bolPrev = start != 1;
             bolNext = end != pageCount;            if (bolPrev)
             {//add Linklabel "prev"
                 System.Windows.Forms.LinkLabel lblPrev = new LinkLabel();
                 lblPrev.Text = "前一页";
                 x += xDistance;
                 ((LinkLabel)lblPrev).LinkClicked += new LinkLabelLinkClickedEventHandler(lblCtl_Clicked);
                 this.AddControl(lblPrev,new Point(x,y),new Size(45, 16));
                 currCtl = lblPrev;
             }
             
             for (int i = start; i <= end; i ++)
             {// add linklabel "page"
                 x = currCtl.Bounds.Right;
                 System.Windows.Forms.Control lblCtl = null;
                 if ( i == currPage)
                     lblCtl = new System.Windows.Forms.Label();
                 else
                 { 
 
                     lblCtl = new System.Windows.Forms.LinkLabel();
                     ((LinkLabel)lblCtl).LinkClicked += new LinkLabelLinkClickedEventHandler(lblCtl_Clicked);
                 }
                 lblCtl.Text = i.ToString();
                 x += xDistance;
                 this.AddControl(lblCtl,new Point(x,y),new Size(10, 16));
                 currCtl = lblCtl;
             }
             if (bolNext)
             {// add linklabel "next"
                 System.Windows.Forms.LinkLabel lblNext = new LinkLabel();
                 lblNext.Text = "后一页";
                 x = currCtl.Bounds.Right;
                 x += xDistance;
                 ((LinkLabel)lblNext).LinkClicked += new LinkLabelLinkClickedEventHandler(lblCtl_Clicked);
                 this.AddControl(lblNext,new Point(x,y),new Size(45, 16));
             }
         }
         private void AddControl(Control ctlObj,Point point,Size size)
         { 
 
             ctlObj.Anchor = ((System.Windows.Forms.AnchorStyles)((( | System.Windows.Forms.AnchorStyles.Bottom) 
                 | System.Windows.Forms.AnchorStyles.Left)));
             ctlObj.Location = point;
             int x = ctlObj.Text.Length * 10;
             if (ctlObj.Text.IndexOf("页") > 0 )
             { 
 
                 if (ctlObj.Text.IndexOf("共") >= 0)
                     x += 10;
                 else
                     x *= 2;
             }
             ctlObj.Size = new Size(x,16);
             this.Controls.Add(ctlObj);
         }        private void lblCtl_Clicked(object sender, System.Windows.Forms.LinkLabelLinkClickedEventArgs e)
         { 
 
             if (sender is LinkLabel)
             { 
 
                 try
                 { 
 
                     string lblText = ((LinkLabel)sender).Text;
                     if (lblText == "前一页")
                     { 
 
                         end = start -1;
                         start = Math.Max(1,end - pageShow + 1);
                         currPage = end;
                     }
                     else if (lblText == "后一页")
                     { 
 
                         start = end + 1;
                         end = Math.Min(pageCount,start + pageShow -1);
                         currPage = end;
                     }
                     else
                     { 
 
                         int page = Convert.ToInt32(lblText);
                         currPage = page;
                     }
                     this.DrawControl();
                     this.OnLnkLblClicked(e);
                 }
                 catch{}
             }
         }        public void ReDraw()
         { 
 
             bolPrev = pageCount > pageShow;
         //    currPage = pageCount;
             end = pageCount;
             start = Math.Max(1,end - pageShow + 1);
             this.DrawControl();
             this.OnLnkLblClicked(null);
         }
     }
 }