• winform 分页控件


    以前都是从事B/S开发,由于公司有个比较大的C/S项目,在使用DATAGRIDVIEW的时候,显示数据量比较大,所以才用分页模式,也不知道这样是否正确。

    想找个C/S下面的分页控件,都没有什么好的,就自己跟B/S下的分页控件,修改成WINFORM下面的。

    首先创建一个用户控件名称为pager,在控件中拖入bindingNavigator和bindingSource,修改bindingNavigator,加入必要的一些控件。

    效果如下:

    代码实现如下:

    namespace WindowsApp.MyControl
    {
        
    /// <summary>
        
    /// 申明委托
        
    /// </summary>
        
    /// <param name="e"></param>
        
    /// <returns></returns>

        public delegate int EventPagingHandler(EventPagingArg e);
        
    /// <summary>
        
    /// 分页控件呈现
        
    /// </summary>

        public partial class Pager : UserControl
        
    {
            
    public Pager()
            
    {
                InitializeComponent();
            }

            
    public event EventPagingHandler EventPaging;
            
    /// <summary>
            
    /// 每页显示记录数
            
    /// </summary>

            private int _pageSize = 20;
            
    /// <summary>
            
    /// 每页显示记录数
            
    /// </summary>

            public int PageSize
            
    {
                
    get return _pageSize; }
                
    set
                
    {
                    _pageSize 
    = value;
                    GetPageCount();
                }

            }


            
    private int _nMax = 0;
            
    /// <summary>
            
    /// 总记录数
            
    /// </summary>

            public int NMax
            
    {
                
    get return _nMax; }
                
    set
                
    {
                    _nMax 
    = value;
                    GetPageCount();
                }

            }


            
    private int _pageCount = 0;
            
    /// <summary>
            
    /// 页数=总记录数/每页显示记录数
            
    /// </summary>

            public int PageCount
            
    {
                
    get return _pageCount; }
                
    set { _pageCount = value; }
            }


            
    private int _pageCurrent = 0;
            
    /// <summary>
            
    /// 当前页号
            
    /// </summary>

            public int PageCurrent
            
    {
                
    get return _pageCurrent; }
                
    set { _pageCurrent = value; }
            }



            
    private void GetPageCount()
            
    {
                
    if (this.NMax > 0)
                
    {
                    
    this.PageCount = Convert.ToInt32(Math.Ceiling(Convert.ToDouble(this.NMax) / Convert.ToDouble(this.PageSize)));
                }

                
    else
                
    {
                    
    this.PageCount = 0;
                }

            }


            
    /// <summary>
            
    /// 翻页控件数据绑定的方法
            
    /// </summary>

            public void Bind()
            
    {
                
    if (this.EventPaging != null)
                
    {
                    
    this.NMax = this.EventPaging(new EventPagingArg(this.PageCurrent));
                }


                
    if (this.PageCurrent > this.PageCount)
                
    {
                    
    this.PageCurrent = this.PageCount;
                }

                
    if (this.PageCount == 1)
                
    {
                    
    this.PageCurrent = 1;
                }

                lblPageCount.Text 
    = this.PageCount.ToString();
                
    this.lblMaxPage.Text = ""+this.NMax.ToString()+"条记录";
                
    this.txtCurrentPage.Text = this.PageCurrent.ToString();

                
    if (this.PageCurrent == 1)
                
    {
                    
    this.btnPrev.Enabled = false;
                    
    this.btnFirst.Enabled = false;
                }

                
    else
                
    {
                    btnPrev.Enabled 
    = true;
                    btnFirst.Enabled 
    = true;
                }


                
    if (this.PageCurrent == this.PageCount)
                
    {
                    
    this.btnLast.Enabled = false;
                    
    this.btnNext.Enabled = false;
                }

                
    else
                
    {
                    btnLast.Enabled 
    = true;
                    btnNext.Enabled 
    = true;
                }


                
    if (this.NMax == 0)
                
    {
                    btnNext.Enabled 
    = false;
                    btnLast.Enabled 
    = false;
                    btnFirst.Enabled 
    = false;
                    btnPrev.Enabled 
    = false;
                }

            }


            
    private void btnFirst_Click(object sender, EventArgs e)
            
    {
                PageCurrent 
    = 1;
                
    this.Bind();
            }


            
    private void btnPrev_Click(object sender, EventArgs e)
            
    {
                PageCurrent 
    -= 1;
                
    if (PageCurrent <= 0)
                
    {
                    PageCurrent 
    = 1;
                }

                
    this.Bind();
            }


            
    private void btnNext_Click(object sender, EventArgs e)
            
    {
                
    this.PageCurrent += 1;
                
    if (PageCurrent > PageCount)
                
    {
                    PageCurrent 
    = PageCount;
                }

                
    this.Bind();
            }


            
    private void btnLast_Click(object sender, EventArgs e)
            
    {
                PageCurrent 
    = PageCount;
                
    this.Bind();
            }


            
    private void btnGo_Click(object sender, EventArgs e)
            
    {
                
    if (this.txtCurrentPage.Text != null && txtCurrentPage.Text != "")
                
    {
                    
    if (Int32.TryParse(txtCurrentPage.Text, out _pageCurrent))
                    
    {
                        
    this.Bind();
                    }

                    
    else
                    
    {
                        Common.MessageProcess.ShowError(
    "输入数字格式错误!");
                    }

                }

            }


        }

        
    /// <summary>
        
    /// 自定义事件数据基类
        
    /// </summary>

        public class EventPagingArg : EventArgs
        
    {
            
    private int _intPageIndex;
            
    public EventPagingArg(int PageIndex)
            
    {
                _intPageIndex 
    = PageIndex;
            }

        }

    }

    控件功能基本实现。

    如何绑定数据呢?

    大数量分页,使用存储过程。

    这个存储过程是网络上考的,呵呵。我把它给贴出来,希望原作者别砸我砖头。。。。。




    ALTER    PROCEDURE SP_Pagination
    /*
    ***************************************************************
    ** 千万数量级分页存储过程 **
    ***************************************************************
    参数说明:
    1.Tables :表名称,视图
    2.PrimaryKey :主关键字
    3.Sort :排序语句,不带Order By 比如:NewsID Desc,OrderRows Asc
    4.CurrentPage :当前页码
    5.PageSize :分页尺寸
    6.Filter :过滤语句,不带Where 
    7.Group :Group语句,不带Group By
    效果演示:http://www.cn5135.com/_App/Enterprise/QueryResult.aspx
    **************************************************************
    */

    (
    @Tables varchar(2000),
    @PrimaryKey varchar(500),
    @Sort varchar(500= NULL,
    @CurrentPage int = 1,
    @PageSize int = 10,
    @Fields varchar(2000= '*',
    @Filter varchar(1000= NULL,
    @Group varchar(1000= NULL
    )
    AS
    /*默认排序*/
    IF @Sort IS NULL OR @Sort = ''
    SET @Sort = @PrimaryKey
    DECLARE @SortTable varchar(1000)
    DECLARE @SortName varchar(1000)
    DECLARE @strSortColumn varchar(1000)
    DECLARE @operator char(2)
    DECLARE @type varchar(1000)
    DECLARE @prec int
    /*设定排序语句.*/
    IF CHARINDEX('DESC',@Sort)>0
    BEGIN
    SET @strSortColumn = REPLACE(@Sort'DESC''')
    SET @operator = '<='
    END
    ELSE
    BEGIN
    IF CHARINDEX('ASC'@Sort= 0
    SET @strSortColumn = REPLACE(@Sort'ASC''')
    SET @operator = '>='
    END
    IF CHARINDEX('.'@strSortColumn> 0
    BEGIN
    SET @SortTable = SUBSTRING(@strSortColumn0CHARINDEX('.',@strSortColumn))
    SET @SortName = SUBSTRING(@strSortColumnCHARINDEX('.',@strSortColumn+ 1LEN(@strSortColumn))
    END
    ELSE
    BEGIN
    SET @SortTable = @Tables
    SET @SortName = @strSortColumn
    END
    SELECT @type=t.name, @prec=c.prec
    FROM sysobjects o 
    JOIN syscolumns c on o.id=c.id
    JOIN systypes t on c.xusertype=t.xusertype
    WHERE o.name = @SortTable AND c.name = @SortName
    IF CHARINDEX('char'@type> 0
    SET @type = @type + '(' + CAST(@prec AS varchar+ ')'
    DECLARE @strPageSize varchar(500)
    DECLARE @strStartRow varchar(500)
    DECLARE @strFilter varchar(1000)
    DECLARE @strSimpleFilter varchar(1000)
    DECLARE @strGroup varchar(1000)
    /*默认当前页*/
    IF @CurrentPage < 1
    SET @CurrentPage = 1
    /*设置分页参数.*/
    SET @strPageSize = CAST(@PageSize AS varchar(500))
    SET @strStartRow = CAST(((@CurrentPage - 1)*@PageSize + 1AS varchar(500))
    /*筛选以及分组语句.*/
    IF @Filter IS NOT NULL AND @Filter != ''
    BEGIN
    SET @strFilter = ' WHERE ' + @Filter + ' '
    SET @strSimpleFilter = ' AND ' + @Filter + ' '
    END
    ELSE
    BEGIN
    SET @strSimpleFilter = ''
    SET @strFilter = ''
    END
    IF @Group IS NOT NULL AND @Group != ''
    SET @strGroup = ' GROUP BY ' + @Group + ' '
    ELSE
    SET @strGroup = ''
    /*执行查询语句*/
    EXEC(
    '
    DECLARE @SortColumn 
    ' + @type + '
    SET ROWCOUNT 
    ' + @strStartRow + '
    SELECT @SortColumn=
    ' + @strSortColumn + ' FROM ' + @Tables + @strFilter + ' ' + @strGroup + ' ORDER BY ' + @Sort + '
    SET ROWCOUNT 
    ' + @strPageSize + '
    SELECT 
    ' + @Fields + ' FROM ' + @Tables + ' WHERE ' + @strSortColumn + @operator + ' @SortColumn ' + @strSimpleFilter + ' ' + @strGroup + ' ORDER BY ' + @Sort + '
    '
    )


    使用该存储过陈,得到数据,将数据绑定到数据控件,提供了一个pageData类

        /// <summary>
        
    /// 数据源提供
        
    /// </summary>

        public class PageData
        
    {
            
    private int _PageSize = 10;
            
    private int _PageIndex = 1;
            
    private int _PageCount = 0;
            
    private int _TotalCount = 0;
            
    private string _TableName;//表名
            private string _QueryFieldName = "*";//表字段FieldStr
            private string _OrderStr = string.Empty; //排序_SortStr
            private string _QueryCondition = string.Empty;//查询的条件 RowFilter
            private string _PrimaryKey = string.Empty;//主键
            /// <summary>
            
    /// 显示页数
            
    /// </summary>

            public int PageSize
            
    {
                
    get
                
    {
                    
    return _PageSize;

                }

                
    set
                
    {
                    _PageSize 
    = value;
                }

            }

            
    /// <summary>
            
    /// 当前页
            
    /// </summary>

            public int PageIndex
            
    {
                
    get
                
    {
                    
    return _PageIndex;
                }

                
    set
                
    {
                    _PageIndex 
    = value;
                }

            }

            
    /// <summary>
            
    /// 总页数
            
    /// </summary>

            public int PageCount
            
    {
                
    get
                
    {
                    
    return _PageCount;
                }

            }

            
    /// <summary>
            
    /// 总记录数
            
    /// </summary>

            public int TotalCount
            
    {
                
    get
                
    {
                    
    return _TotalCount;
                }

            }

            
    /// <summary>
            
    /// 表名,包括视图
            
    /// </summary>

            public string TableName
            
    {
                
    get
                
    {
                    
    return _TableName;
                }

                
    set
                
    {
                    _TableName 
    = value;
                }

            }

            
    /// <summary>
            
    /// 表字段FieldStr
            
    /// </summary>

            public string QueryFieldName
            
    {
                
    get
                
    {
                    
    return _QueryFieldName;
                }

                
    set
                
    {
                    _QueryFieldName 
    = value;
                }

            }

            
    /// <summary>
            
    /// 排序字段
            
    /// </summary>

            public string OrderStr
            
    {
                
    get
                
    {
                    
    return _OrderStr;
                }

                
    set
                
    {
                    _OrderStr 
    = value;
                }

            }

            
    /// <summary>
            
    /// 查询条件
            
    /// </summary>

            public string QueryCondition
            
    {
                
    get
                
    {
                    
    return _QueryCondition;
                }

                
    set
                
    {
                    _QueryCondition 
    = value;
                }

            }

            
    /// <summary>
            
    /// 主键
            
    /// </summary>

            public string PrimaryKey
            
    {
                
    get {
                    
    return _PrimaryKey;
                }

                
    set {
                    _PrimaryKey 
    = value;
                }

            }

            
    public DataSet QueryDataTable()
            
    {
                SqlParameter[] parameters 
    = {
                        
    new SqlParameter("@Tables", SqlDbType.VarChar, 255),
                        
    new SqlParameter("@PrimaryKey" , SqlDbType.VarChar , 255),    
                        
    new SqlParameter("@Sort", SqlDbType.VarChar , 255 ),
                        
    new SqlParameter("@CurrentPage", SqlDbType.Int),
                        
    new SqlParameter("@PageSize", SqlDbType.Int),                                    
                        
    new SqlParameter("@Fields", SqlDbType.VarChar, 255),
                        
    new SqlParameter("@Filter", SqlDbType.VarChar,1000),
                        
    new SqlParameter("@Group" ,SqlDbType.VarChar , 1000 )
                        }
    ;
                parameters[
    0].Value = _TableName;
                parameters[
    1].Value = _PrimaryKey;
                parameters[
    2].Value = _OrderStr;
                parameters[
    3].Value = PageIndex;
                parameters[
    4].Value = PageSize;
                parameters[
    5].Value =_QueryFieldName;
                parameters[
    6].Value = _QueryCondition;
                parameters[
    7].Value = string.Empty;
                DataSet ds 
    = DbHelperSQL.RunProcedure("SP_Pagination", parameters, "dd");
                _TotalCount 
    = GetTotalCount();
                
    if (_TotalCount == 0)
                
    {
                    _PageIndex 
    = 0;
                    _PageCount 
    = 0;
                }

                
    else
                
    {
                    _PageCount 
    = _TotalCount % _PageSize == 0 ? _TotalCount / _PageSize : _TotalCount / _PageSize + 1;
                    
    if (_PageIndex > _PageCount)
                    
    {
                        _PageIndex 
    = _PageCount;

                        parameters[
    4].Value = _PageSize;

                        ds 
    = QueryDataTable();
                    }

                }

                
    return ds;
            }


            
    public int GetTotalCount()
            
    {
                
    string strSql = " select count(1) from "+_TableName;
                
    if (_QueryCondition != string.Empty)
                
    {
                    strSql 
    +=" where " + _QueryCondition;
                }

                
    return int.Parse(DbHelperSQL.GetSingle(strSql).ToString());
            }

        }

    好了,在页面放个DATAGRIDVIEW 拖入控件pager

      private void ReceiveOrderJLForm_Load(object sender, EventArgs e)
            
    {
                
    this.pager1.PageCurrent = 1;
                
    this.pager1.Bind();
            }

            
    private int dgvBind()
            
    {
                WindowsApp.MyControl.PageData pageData 
    = new WindowsApp.MyControl.PageData();
                pageData.TableName 
    = "T_ReceiveOrder";
                pageData.PrimaryKey 
    = "ReceiveOrderID";
                pageData.OrderStr 
    = "ReceiveOrderID desc";
                pageData.PageIndex 
    = this.pager1.PageCurrent;
                pageData.PageSize 
    = this.pager1.PageSize;
                pageData.QueryCondition 
    = _strSql + strWhere.ToString();
                pageData.QueryFieldName 
    = "*";

                
    this.pager1.bindingSource.DataSource = pageData.QueryDataTable().Tables[0];
                
    this.pager1.bindingNavigator.BindingSource = pager1.bindingSource;
                dgvReceiveOrder.AutoGenerateColumns 
    = false;
                dgvReceiveOrder.DataSource 
    = this.pager1.bindingSource;
                
    return pageData.TotalCount;
            }

            
    private int pager1_EventPaging(WindowsApp.MyControl.EventPagingArg e)
            
    {
                
    return dgvBind();
            }

     效果如下

     

    https://files.cnblogs.com/nosnowwolf/Pager.rar 控件下载

  • 相关阅读:
    clientHeight和offsetHeight
    bus事件总线传值
    解决英文溢出不换行
    小程序熏染可滑动动态导航
    个人样式小结
    数组删除元素
    vue封装swiper
    大佬的接口玩玩
    Java探针技术-JVM的动态agent机制:在main函数启动之后运行agent
    Java探针技术-Instrumentation与ClassFileTransformer--字节码转换工具
  • 原文地址:https://www.cnblogs.com/jordan2009/p/1867133.html
Copyright © 2020-2023  润新知