winform 分页控件

上博客园也有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
            // 
            this.Name = "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.Top | 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);
        }
    }
}

posted on 2004-08-20 15:41 flood 阅读(126)

Contributors: FHL