WinForm中利用用户控件封装分页

1、创建分页控件

右击项目,添加

2、创建分页时所需要的按钮

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

EventHandler即事件委托,表示用于处理不具有事件数据的事件的方法。 字面上理解就是一个事件处理器,将一个事件与处理事件的方法联系起来的一种 机制 EventHandler委托有两个参数:sender和e,分别表示事件的发送者和传递的事件参数。

4、定义分页中需要用的属性,用来存储分页控件对应的一些值,并在该用户控件的加载事件中设置该属性对应初始值

5、定义一个计算总页数方法GetPageCount()

此处定义的getPageCount()方法,用于在获取到数据总条数后,通过设定的每页条数(PageSize)得到对应数据的总页数

6、定义了一个激活按钮的方法:用于在每次对数据进行重新查询后 ,保证按钮处于激活状态

7、定义一个DrawContal()方法(重载方法),这里给了一个int count的参数,该方法用于在窗体中使用

DrawControl()方法,这里参数为bool 型的,该方法中,实现了对用户控件中的一些显示的进行了值绑定,以及在当传入参数为true时,会对使用了该用户控件的窗体数据进行更新,以及对于用户控件中分页控件进行值绑定的操作,该方法还对分页控件的按钮进行了重新激活,在该方法结尾部分还对当前查询获取后的数据,并对相关的按钮进行了禁用功能(例:数据只有一页时禁用全部按钮,在第一页时禁用下一页、最后一页按钮等等。)

8、添加各个按钮的单击事件

用户控件中的代码就上述这些,接下来将用户控件全部代码进行展示

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using static System.Windows.Forms.LinkLabel;

namespace AssetManageMent
{
    public partial class prosation : UserControl
    {
        /// <summary>
        /// 定义一个事件,用于在引发分页时,方便外部重新获取数据绑定
        /// </summary>
        public event EventHandler OnPageChanged;
        public prosation()
        {
            InitializeComponent();
        }
        /// <summary>
        /// 当前页码
        /// </summary>
        public int CurrPage { get; set; }
        /// <summary>
        /// 当前页条数
        /// </summary>
        public int PageSize { get; set; }
        /// <summary>
        /// 总页数
        /// </summary>
        public int totaPage { get; set; }
        /// <summary>
        /// 总条数
        /// </summary>
        public int totaCount { get; set; }
        /// <summary>
        /// 控件加载事件
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void prosation_Load(object sender, EventArgs e)
        {
            CurrPage = 1;
            PageSize = 5;
            totaPage = 0;
            totaCount = 0;
        }
        /// <summary>
        /// 计算总页数
        /// </summary>
        /// <returns></returns>
        private int GetPageCount()
        {
            if (PageSize==0)
            {
                return 0;
            }
            //定义参数,判断是否需要增加一页
            int PageCount = totaCount / PageSize;
            if (totaCount % PageSize == 0)
            {
                PageCount = totaCount / PageSize;
            }
            else
            {
                PageCount = totaCount / PageSize + 1;
            }
            return PageCount;
        }
        /// <summary>
        /// 激活按钮
        /// </summary>
        private void SetFormCtrEnabled()
        {
            btnstart.Enabled = true;
            btntwo.Enabled = true;
            btntree.Enabled = true;
            btnfore.Enabled = true;
        }
        /// <summary>
        /// 接收页面传输的数据总行数的值
        /// </summary>
        /// <param name="count"></param>
        public void DrawContal(int count)
        {
            totaCount = count;
            DrawContal(false);
        }
        /// <summary>
        /// 页面控件展示,主要用于调用窗体中的查询方法
        /// </summary>
        /// <param name="CallEven"></param>
        /// <returns></returns>
        private void DrawContal(bool CallEven)
        {
            totaPage=GetPageCount();
            lblPageCount.Text = $"共{totaPage}页,总计{totaCount}条";
            //得到pageSize对应的索引
            int pIndex = this.cboCurrentPage.Items.IndexOf(this.PageSize.ToString());
            //分页控件初始化
            this.cboCurrentPage.SelectedIndex = pIndex;

            //先将之前的选择页数下拉框内容清理,再绑定新的值
            this.cboPageIndex.Items.Clear();

            //构造可切换页码下拉列表
            for (int i = 1; i <= this.totaPage; i++)
            {
                this.cboPageIndex.Items.Add(i.ToString());
            }
            //默认选中当前指定页
            this.cboPageIndex.Text = this.CurrPage.ToString();
            
            if (CallEven && OnPageChanged != null)
            {
                //当前分页数字改变时,触发委托事件
                OnPageChanged(this, null);
            }
            SetFormCtrEnabled();
            if (totaPage <= 1)//有且仅有一页
            {
                btnstart.Enabled = false;
                btntree.Enabled = false;
                btntwo.Enabled = false;
                btnfore.Enabled = false;
            }
            else if (CurrPage == 1)//第一页
            {
                btnstart.Enabled = false;
                btntwo.Enabled = false;
            }
            else if (CurrPage == totaCount)//最后一页
            {
                btntree.Enabled = false;
                btnfore.Enabled = false;
            }
          
        }
        /// <summary>
        /// 每页条数更改时
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        bool isTextChanged = false;
        private void cboCurrentPage_SelectedIndexChanged(object sender, EventArgs e)
        {
            this.PageSize = Convert.ToInt32(this.cboCurrentPage.SelectedItem);
            this.CurrPage = 1;
            DrawContal(true);
        }
        /// <summary>
        /// 第几页更改时
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void cboPageIndex_SelectedIndexChanged(object sender, EventArgs e)
        {
            this.CurrPage = Convert.ToInt32(this.cboPageIndex.SelectedItem);
            DrawContal(true);
        }
        /// <summary>
        /// 返回首页
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnstart_Click(object sender, EventArgs e)
        {
            this.CurrPage = 1;
            DrawContal(true);
        }
        /// <summary>
        /// 上一页
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btntwo_Click(object sender, EventArgs e)
        {
            //当点击结果到第一页时,将上一页按钮禁用
            if (this.CurrPage > 1)
            {
                this.CurrPage--;
            }
            DrawContal(true);
        }
        /// <summary>
        /// 下一页
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btntree_Click(object sender, EventArgs e)
        {
            if (CurrPage < totaPage)
            {
                this.CurrPage++;
            }
            DrawContal(true);
        }
        /// <summary>
        /// 末尾页
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnfore_Click(object sender, EventArgs e)
        {
            this.CurrPage = totaPage;
            DrawContal(true);
        }

        / <summary>
        / 页面需要重新绘制时触发事件
        / </summary>
        / <param name="sender"></param>
        / <param name="e"></param>
        //private void prosation_Paint(object sender, PaintEventArgs e)
        //{
        //    DrawContal(e);
        //}

    }
}

上面就是用户控件中的全部代码。

9、在使用用户控件的窗体中定义一个自定义的事件,该事件中调用窗体的数据查询方法。

10、在窗体的查询绑定方法中对用户控件中的控件进行绑定,以及调用对应的方法

prosationl:就是窗体引用用户空间后自定加载的别名,可用于调用用户控件中的属性、方法

分页的简单计算:

int begin = PageSize * (CurrPage - 1) + 1 ;//用于计算分页的初始位置

int end = PageSize * CurrPage;//用于计算分页时的结束问题

分页SQL语句示例:

SELECT * FROM (SELECT ROW_NUMBER() OVER(ORDER BY DeptID) 'row_no',* FROM Deptlnfo) di WHERE di.row_no BETWEEN 1 AND 5

11、在使用用户控件的窗体加载事件上对用户控件的事件进行绑定订阅

至此,就能完成对sql分页控件的封装,在其他窗体上进行使用时,就只需要将用户控件拉过去使用并绑定和相关如上调用即可。

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
WinForm是Microsoft .NET平台上的一个用户界面技术,可以方便地创建Windows桌面应用程序。动态添加用户控件是指在运行时根据程序逻辑的需要,动态地向WinForm添加用户控件。 在WinForm动态添加用户控件可以通过以下步骤实现: 1. 创建一个用户控件类:首先,我们需要创建一个继承自System.Windows.Forms.UserControl的用户控件类,可以通过Visual Studio的设计器或者手动创建一个类,然后在该类设计和编写用户控件的布局和逻辑。 2. 在WinForm添加Panel控件:Panel控件用于容纳动态添加的用户控件。我们可以在WinForm添加一个Panel控件,并设置其位置和大小。 3. 创建和添加用户控件实例:根据需要,我们可以在运行时创建用户控件的实例,并设置其属性、事件和方法等。然后,将创建的用户控件实例添加到Panel控件,可以使用Panel.Controls.Add(用户控件实例)方法实现。 4. 设置用户控件位置和大小:根据需要,可以使用用户控件的Left、Top、Width和Height等属性来设置用户控件在Panel控件的位置和大小。 5. 显示用户控件:最后,通过Panel控件的Visible属性设置为true来显示动态添加的用户控件。 通过以上步骤,我们可以在运行时动态地向WinForm添加用户控件,实现灵活和动态的界面展示。动态添加用户控件可以方便地根据程序需求来动态生成和显示一些复杂的用户界面,提供更好的用户体验。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值