【干货】数据分页控件 ━ 更加灵活,更加实用

 关于数据分页的文章太多了,各有各的一套方案,但大多都很类似,要么使用存储过程,要么直接使用代码进行分页。各种方案分页的效率也不尽相同,我们不一定要找一个最高效的(根据实际的项目情况),找一个最合适的就OK了。下面我要谈的分页控件非常灵活,可以支持任意类型的数据库,同时可以支持存储过程或代码分页(会自动判断),也支持多表的分页,非常的方便。对于数据分页的相关文章,在我的博客中可以找到很多,下面我做一个简单的汇总,方便大家查阅。

1、 原创企业级控件库之大数据量分页控件

2、 再上数据分页控件(不用存储过程)

3、 RDIFramework.NET 中多表关联查询分页实例

  下面要给大家分享的分页控件只做分页的处理,不做与数据库相关的操作。直接提供分页的数据给分页控件即可。它不关心你的数据来源是什么,也不关心你采用的数据分页的方式(存储过程或代码等)。这个分页控件我取名为:UcPagerEx,如下图所示:

  实现分页控件的代码非常的简单,下面直接给出全部源码,大家可以参考下,整个分页控件的源码如下:

using System;
using System.ComponentModel;
using System.Windows.Forms;
namespace RDIFramework.Controls
{
public delegate void PageChangedEventHandler(object sender, EventArgs e);
/// <summary>
/// 分页用户控件,仅提供分页信息显示及改变页码操作
/// </summary>
public partial class UcPagerEx : UserControl
{
public event PageChangedEventHandler PageChanged;
private int _pageSize;
private int m_PageCount;
private int _recordCount;
private int _pageIndex;

    public UcPagerEx()
    {
        InitializeComponent();
        this._pageSize = 10;
        this._recordCount = 0;
        this._pageIndex = 1; //默认为第一页
    }
    /// <summary> 
    /// 带参数的构造函数
    /// <param name="pageSize">每页记录数</param>
    /// <param name="recordCount">总记录数</param>
    /// </summary>
    public UcPagerEx(int recordCount, int pageSize)
    {
        InitializeComponent();

        this._pageSize = pageSize;
        this._recordCount = recordCount;
        this._pageIndex = 1; //默认为第一页
        this.InitPageInfo();
    }
    protected virtual void OnPageChanged(EventArgs e)
    {
        if (PageChanged != null)
        {
            InitPageInfo();
            PageChanged(this, e);
        }
    }
    [Description("设置或获取一页中显示的记录数目"), DefaultValue(20), Category("分页")]
    public int PageSize
    {
        set
        {
            this._pageSize = value;
        }
        get
        {
            return this._pageSize;
        }
    }

    [Description("获取记录总页数"), DefaultValue(0), Category("分页")]
    public int PageCount
    {
        get
        {
            return this.m_PageCount;
        }
    }

    [Description("设置或获取记录总数"), Category("分页")]
    public int RecordCount
    {
        set
        {
            this._recordCount = value;
        }
        get
        {
            return this._recordCount;
        }
    }

    [Description("当前的页面索引, 开始为1"), DefaultValue(0), Category("分页")]
    [Browsable(false)]
    public int PageIndex
    {
        set
        {
            this._pageIndex = value;
        }
        get
        {
            return this._pageIndex;
        }
    }

    /// <summary> 
    /// 初始化分页信息
    /// <param name="pageSize">每页记录数</param>
    /// <param name="recordCount">总记录数</param>
    /// </summary>
    public void InitPageInfo(int recordCount, int pageSize)
    {
        this._recordCount = recordCount;
        this._pageSize = pageSize;
        this.InitPageInfo();
    }

    /// <summary> 
    /// 初始化分页信息
    /// <param name="recordCount">总记录数</param>
    /// </summary>
    public void InitPageInfo(int recordCount)
    {
        this._recordCount = recordCount;
        this.InitPageInfo();
    }
    /// <summary> 
    /// 初始化分页信息
    /// </summary>
    public void InitPageInfo()
    {
        if (this._pageSize < 1)
            this._pageSize = 10; //如果每页记录数不正确,即更改为10
        if (this._recordCount < 0)
            this._recordCount = 0; //如果记录总数不正确,即更改为0

        //取得总页数
        if (this._recordCount % this._pageSize == 0)
        {
            this.m_PageCount = this._recordCount / this._pageSize;
        }
        else
        {
            this.m_PageCount = this._recordCount / this._pageSize + 1;
        }

        //设置当前页
        if (this._pageIndex > this.m_PageCount)
        {
            this._pageIndex = this.m_PageCount;
        }
        if (this._pageIndex < 1)
        {
            this._pageIndex = 1;
        }

        //设置上一页按钮的可用性
        bool enable = (this.PageIndex > 1);
        this.btnPrevious.Enabled = enable;

        //设置首页按钮的可用性
        enable = (this.PageIndex > 1);
        this.btnFirst.Enabled = enable;

        //设置下一页按钮的可用性
        enable = (this.PageIndex < this.PageCount);
        this.btnNext.Enabled = enable;

        //设置末页按钮的可用性
        enable = (this.PageIndex < this.PageCount);
        this.btnLast.Enabled = enable;
        this.txtPageIndex.Text = this._pageIndex.ToString();
        this.lblPageInfo.Text = string.Format("共 {0} 条记录,每页 {1} 条,共 {2} 页", this._recordCount, this._pageSize, this.m_PageCount);
    }

    public void RefreshData(int page)
    {
        this._pageIndex = page;
        EventArgs e = new EventArgs();
        OnPageChanged(e);
    }

    private void btnFirst_Click(object sender, System.EventArgs e)
    {
        this.RefreshData(1);
    }

    private void btnPrevious_Click(object sender, System.EventArgs e)
    {
        if (this._pageIndex > 1)
        {
            this.RefreshData(this._pageIndex - 1);
        }
        else
        {
            this.RefreshData(1);
        }
    }
    private void btnNext_Click(object sender, System.EventArgs e)
    {
        if (this._pageIndex < this.m_PageCount)
        {
            this.RefreshData(this._pageIndex + 1);
        }
        else if (this.m_PageCount < 1)
        {
            this.RefreshData(1);
        }
        else
        {
            this.RefreshData(this.m_PageCount);
        }
    }

    private void btnLast_Click(object sender, System.EventArgs e)
    {
        this.RefreshData(this.m_PageCount > 0 ? this.m_PageCount : 1);
    }

    private void txtPageIndex_KeyDown(object sender, System.Windows.Forms.KeyEventArgs e)
    {
        if (e.KeyCode == Keys.Enter)
        {
            int num;
            try
            {
                num = Convert.ToInt16(this.txtPageIndex.Text);
            }
            catch
            {
                num = 1;
            }

            if (num > this.m_PageCount)
                num = this.m_PageCount;
            if (num < 1)
                num = 1;

            this.RefreshData(num);
        }
    }
}

}
代码基本没有什么难度,相信大家都能看得懂,那么如何使用这个控件呢?

  首先在生成的工具箱中拖动这个分页控件到界面上,再后再做数据绑定的代码即可。我直接展示一个已经做成的界面,如下图所示:

上面就是分页的效果,如何实现的呢?下面给出实现代码。

  我们可以在Load事件中调用下面的Search()方法对数据进行绑定,如下代码所示:

private void Search()
{
var recordCount = 0;
this.DTProductInfo = GetData(out recordCount, ucPager.PageIndex, ucPager.PageSize, this.searchValue);
ucPager.RecordCount = recordCount;
ucPager.InitPageInfo();
// 加载绑定数据
this.GetList();
}

private DataTable GetData(out int recordCount, int pageIndex, int pageSize,string search)
{
return new ProductInfoManager(dbProvider).GetDTByPage(out recordCount, pageIndex, pageSize, search,ProductInfoTable.FieldCreateOn + " DESC ");
}

public override void GetList()
{
this.dgvProductInfo.AutoGenerateColumns = false;
if (this.DTProductInfo.Columns.Count > 0)
{
this.DTProductInfo.DefaultView.Sort = ProductInfoTable.FieldCreateOn;
}

this.dgvProductInfo.DataSource = this.DTProductInfo.DefaultView;
this.SetControlState();

}
  同时需要对UcPagerEx的PageChanged事件做处理,以启用用户分页的需求,代码如下:

private void ucPager_PageChanged(object sender, EventArgs e)
{
var holdCursor = this.Cursor;
this.Cursor = Cursors.WaitCursor;
Search();
this.Cursor = holdCursor;
}
附注:对于上面的“GetDTByPage”方法可以任意实现,可以调用存储过程,也可以使用代码进行分页。只要返回分页的数据即可。

转载于:https://blog.51cto.com/13952394/2296383

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值