路过秋天

同样的3年,有的人从学生到当了MVP了,而我却在原地,卖弄当年的代码,秋天的风,有点凄,有点凉!

公告信息
内涵是很强大的~~~别看外表~~~当犀利哥入侵不了的时候,感觉有种莫名的失落~~~
文章档案
最新评论

C#Winform通用分页控件实战篇(提供源码下载)

在Web中,以前写过相关的分页控件的实例教程,如: 分页控件 实战 Post篇 (包源码的)

在Winform中,分页有时候也是必不可少的一项,因此, 新手Mark一下有时候是必要的。

下面开始简单介绍一下:

既然是分页控件,说明它是个控件,因此,继承控件继承自用户控件如下:

 public partial class PagerControl : UserControl
 {
        #region 构造函数

        public PagerControl()
        {
            InitializeComponent();
        }

然后就是对界面拉一些控件了,如下图:

 

 各个控件的ID就不一个个打了,下面的代码看名称就知道了。

 按下来定义几个属性(第几页,每页几条,记录总数,这几个是国际性惯例必须的)

    public partial class PagerControl : UserControl
    {
        #region 构造函数

        public PagerControl()
        {
            InitializeComponent();
        }

        #endregion

        #region 分页字段和属性

        private int pageIndex = 1;
        /// <summary>
        
/// 当前页面
        
/// </summary>
        public virtual int PageIndex
        {
            get { return pageIndex; }
            set { pageIndex = value; }
        }

        private int pageSize = 100;
        /// <summary>
        
/// 每页记录数
        
/// </summary>
        public virtual int PageSize
        {
            get { return pageSize; }
            set { pageSize = value; }
        }

        private int recordCount = 0;
        /// <summary>
        
/// 总记录数
        
/// </summary>
        public virtual int RecordCount
        {
            get { return recordCount; }
            set { recordCount = value; }
        }

        private int pageCount = 0;
        /// <summary>
        
/// 总页数
        
/// </summary>
        public int PageCount
        {
            get
            {
                if (pageSize != 0)
                {
                    pageCount = GetPageCount();
                }
                return pageCount;
            }
        }
        /// <summary>
        /// 计算总页数
        /// </summary>
        /// <returns></returns>
        private int GetPageCount()
        {
            if (PageSize == 0)
            {
                return 0;
            }
            int pageCount = RecordCount / PageSize;
            if (RecordCount % PageSize == 0)
            {
                pageCount = RecordCount / PageSize;
            }
            else
            {
                pageCount = RecordCount / PageSize + 1;
            }
            return pageCount;
        }
       #endregion

上面顺带多了一个计算页总数的代码。

接着定义一个事件,用于在引发分页时,方便外部重新获取数据绑定:

public event EventHandler OnPageChanged; 

再往下就是点击按钮的分页和引发的控件重绘了:

看“首页,上一页,下一页,尾页”事件:

        private void lnkFirst_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
        {
            PageIndex = 1;
            DrawControl(true);
        }

        private void lnkPrev_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
        {
            PageIndex = Math.Max(1, PageIndex - 1);
            DrawControl(true);
        }

        private void lnkNext_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
        {
            PageIndex = Math.Min(PageCount, PageIndex + 1);
            DrawControl(true);
        }

        private void lnkLast_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
        {
            PageIndex = PageCount;
            DrawControl(true);

        } 

代码是在分页类里,这里就不重复再写上面的写过的代码了。

然后是重绘控件的代码:

        /// <summary>
        
/// 外部调用
        
/// </summary>
        public void DrawControl(int count)
        {
            recordCount = count;
            DrawControl(false);
        }
        /// <summary>
        
/// 页面控件呈现
        
/// </summary>
        private void DrawControl(bool callEvent)
        {
            btnGo.Text = JumpText;
            lblCurrentPage.Text = PageIndex.ToString();
            lblPageCount.Text = PageCount.ToString();
            lblTotalCount.Text = RecordCount.ToString();
            txtPageSize.Text = PageSize.ToString();

            if (callEvent && OnPageChanged != null)
            {
                OnPageChanged(thisnull);//当前分页数字改变时,触发委托事件
            }
            SetFormCtrEnabled();
            if (PageCount == 1)//有且仅有一页
            {
                lnkFirst.Enabled = false;
                lnkPrev.Enabled = false;
                lnkNext.Enabled = false;
                lnkLast.Enabled = false;
                btnGo.Enabled = false;
            }
            else if (PageIndex == 1)//第一页
            {
                lnkFirst.Enabled = false;
                lnkPrev.Enabled = false;
            }
            else if (PageIndex == PageCount)//最后一页
            {
                lnkNext.Enabled = false;
                lnkLast.Enabled = false;
            }
        }
        private void SetFormCtrEnabled()
        {
            lnkFirst.Enabled = true;
            lnkPrev.Enabled = true;
            lnkNext.Enabled = true;
            lnkLast.Enabled = true;
            btnGo.Enabled = true;

        } 

OK,分页的代码基本就完了,为了提升一点小用户体验,包括改变分页大小,或在输入跳转页后按加车也能执行事件,这里加多一点处理代码:

 

        /// <summary>
        
/// enter键功能
        
/// </summary>
        private void txtPageNum_KeyPress(object sender, KeyPressEventArgs e)
        {
            btnGo_Click(nullnull);
        }

        /// <summary>
        
/// 跳转页数限制
        
/// </summary>
        private void txtPageNum_TextChanged(object sender, EventArgs e)
        {
            int num = 0;
            if (int.TryParse(txtPageNum.Text.Trim(), out num) && num > 0)
            {
                if (num > PageCount)
                {
                    txtPageNum.Text = PageCount.ToString();
                }
            }
        }

        /// <summary>
        
/// 跳转
        
/// </summary>
        
/// <param name="sender"></param>
        
/// <param name="e"></param>
        private void btnGo_Click(object sender, EventArgs e)
        {
            int num = 0;
            if (int.TryParse(txtPageNum.Text.Trim(), out num) && num > 0)
            {
                PageIndex = num;
                DrawControl(true);
            }
        }

        #endregion
        bool isTextChanged = false;
        /// <summary>
        
/// 分页属性改变了。
        
/// </summary>
        private void txtPageSize_TextChanged(object sender, EventArgs e)
        {
            int num = 0;
            if (!int.TryParse(txtPageSize.Text.Trim(), out num) || num <= 0)
            {
                num = 100;
                txtPageSize.Text = "100";
            }
            else
            {
                isTextChanged = true;
            }
            pageSize = num;
        }
        /// <summary>
        
/// 光标离开分页属性
        private void txtPageSize_Leave(object sender, EventArgs e)
        {
            if (isTextChanged)
            {
                isTextChanged = false;
                lnkFirst_LinkClicked(nullnull);
            }
        }

 

到这里,分页的源码就写完了,各位自己有空也多写写,就那么几个事件和步骤。

 

控件出来了,接下就是弄个简单的界面示例意思意思一下,然后提供下源码了。

 

新建winform项目、往里拖一个DataGridView+刚才的分页控件,如下图:

 

 

接下来是winform的测试代码,这里引用CYQ.Data操作文本数据库进行简单示例:

private void StartForm_Load(object sender, EventArgs e)
        {
            //创建文件数据库表。
            MDataTable.CreateSchema("Users.txt"falsenew string[] { "UserName""Password""Enabled" }, SqlDbType.NVarChar, SqlDbType.NVarChar, SqlDbType.Bit);
            for (int i = 0; i < 200; i++)//插入200条数据。
            {
                using (MAction action = new MAction("Users.txt""Txt Path={0}"))
                {
                    action.Set("UserName""UserName_" + i);
                    action.Set("Password""Password_" + i);
                    action.Set("Enabled", i%2==0);
                    action.Insert(InsertOp.None);
                }
            }
            pagerControl1.OnPageChanged += new EventHandler(pagerControl1_OnPageChanged);
            LoadData();
        }

        void pagerControl1_OnPageChanged(object sender, EventArgs e)
        {
            LoadData();
        }
        void LoadData()
        {
            int count;
            using (MAction action = new MAction("Users.txt""Txt Path={0}"))
            {
                action.Select(pagerControl1.PageIndex, pagerControl1.PageSize, string.Empty, out count).Bind(gvUsers);
                pagerControl1.DrawControl(count);
            }
        }

 代码很简单,重点在

pagerControl1.OnPageChanged事件里调用LoadData来绑定数据,重绘分布控件时调用
pagerControl1.DrawControl(传进记录总数);

 

 于是数据出来了,效果如下图:

 

 

 夜有点深,最后提供源码打包下载: winform 分页控件源码

  

秋色园是QBlog的官方站点,由路过秋天创建,基于cyqdata数据层框架开发的支持多用户、多语言、多数据库(access,mssql,oracle)、目录级url等功能强大的博客系统
新浪微博粉丝精灵,刷粉丝、刷评论、刷转发、企业商家微博营销必备工具"

2012/6/12 2:23:01 | C# Winform基础 | |

#5wang0620sen[116.6.94.*]2016/3/8 15:53:38
学习了
#4wang0620sen2016/3/3 12:09:03
不错,多谢楼主分享
#3游客[注册][111.164.193.*]2014/8/14 13:10:15
用数据库,怎么使用!有例子吗,不要存储过程……
#2游客[注册][36.250.229.*]2014/5/29 13:19:05
不错,多谢楼主分享
#1saoian28302014/3/8 5:58:40
你好,我是新手,看了你这个控件真的很实用,不过我下载下来在本地做测试时遇到一个问题,希望给予帮助,我新建了两个Form,分别是Form1和Form2,在Form1中放了一些控件用来查询数据,在Form2中放了一个DataGridView控件和你做的分页控件;在没加分页控件前,当在Form1中输入查询条件,单击Form1中的查询按钮,就会将查询出来的数据绑定到Form2的DataGridView控件中显示,现在加了分页控件后,就不知道怎么弄了,麻烦讲一下要如何处理?谢谢!
回复文章下面有源码下载。
  • 发表评论