zoukankan      html  css  js  c++  java
  • Winform 分页控件(转)

    原链接:http://www.cnblogs.com/flood/archive/2004/08/20/35166.html

    上博客园也有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
            

            
    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

            
    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(4516));
                    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(1016));
                    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(4516));
                }

            }

            
    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);
            }

        }

    }

  • 相关阅读:
    Vue3+Element-Plus-admin
    uniapp UI库推荐 uView官网/文档
    js 获取本月月初和月末时间操作
    el-dialog 无法弹出来
    Vue核心技术 Vue+Vue-Router+Vuex+SSR实战精讲
    sed 相关命令
    docker 启动 ubuntu
    vue 配置 history 模式
    typescript 相关
    fiddler 图片下载
  • 原文地址:https://www.cnblogs.com/glacier/p/1423545.html
Copyright © 2011-2022 走看看