当前位置: 移动技术网 > IT编程>开发语言>c# > winform分页控件 附源码下载

winform分页控件 附源码下载

2019年07月18日  | 移动技术网IT编程  | 我要评论
以前都是从事b/s开发,由于公司有个比较大的c/s项目,在使用datagridview的时候,显示数据量比较大,所以才用分页模式,也不知道这样是否正确。 

以前都是从事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(@strsortcolumn, 0, charindex('.',@strsortcolumn))
set @sortname = substring(@strsortcolumn, charindex('.',@strsortcolumn) + 1, len(@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 + 1) as 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();
    }


效果如下

源码下载:

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持移动技术网。

如您对本文有疑问或者有任何想说的,请 点击进行留言回复,万千网友为您解惑!

相关文章:

验证码:
移动技术网