C# 通用分页用户控件

在Winform中,DataGridView控件常被用来展示列表数据,但是其自身又不带有分页功能,以致使用起来需要自定义分页功能,针对这个问题,编写一个通用版的分页用户控件,以解决DataGridView不能分页问题。

1、先上图,分页控件的最终效果如下图所示。
在这里插入图片描述
2、首先添加一个用户控件,命名为:PageControl

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

3、定义分页的常用属性:

//每页显示记录数
private int pageSize = 10;
//当前页
private int pageIndex = 1;
//总页数
private int pageCount = 0;
//总记录数
private int totalCount = 0;

public int PageSize { get => pageSize; set => pageSize = value; }
public int PageIndex { get => pageIndex; set => pageIndex = value; }
public int PageCount
{
    get
    {
        if (pageSize != 0)
        {
            pageCount = GetPageCount();
        }
        return pageCount;
    }
    set { pageCount = value; }
}
public int TotalCount { get => totalCount; set => totalCount = value; }

GetPageCount方法

/// <summary>
/// 计算总页数
/// </summary>
/// <returns></returns>
private int GetPageCount()
{
    if (PageSize == 0)
    {
        return 0;
    }
    int pageCount = TotalCount / PageSize;
    if (TotalCount % PageSize == 0)
    {
        pageCount = TotalCount / PageSize;
    }
    else
    {
        pageCount = TotalCount / PageSize + 1;
    }
    return pageCount;
}

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

/// <summary>
 /// 首页
 /// </summary>
 /// <param name="sender"></param>
 /// <param name="e"></param>
 private void linkFirst_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
 {
     PageIndex = 1;
     DrawControl(true);
 }

 /// <summary>
 /// 上一页
 /// </summary>
 /// <param name="sender"></param>
 /// <param name="e"></param>
 private void linkPrev_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
 {

     PageIndex = Math.Max(1, PageIndex - 1);
     DrawControl(true);
 }


 /// <summary>
 /// 下一页
 /// </summary>
 /// <param name="sender"></param>
 /// <param name="e"></param>
 private void linkNext_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
 {
     PageIndex = Math.Min(PageCount, PageIndex + 1);
     DrawControl(true);
 }

 /// <summary>
 /// 尾页
 /// </summary>
 /// <param name="sender"></param>
 /// <param name="e"></param>
 private void linkLast_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
 {

     PageIndex = PageCount;
     DrawControl(true);
 }
/// <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 linkGo_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
{
    int num = 0;
    if (int.TryParse(txtPageNum.Text.Trim(), out num) && num > 0)
    {
        PageIndex = num;
        DrawControl(true);
    }
}
/// <summary>
/// PageSzie改变事件
/// </summary>
bool isTextChanged = false;
private void cbbPageSize_SelectedIndexChanged(object sender, EventArgs e)
{
    int num = 0;
    if (!int.TryParse(cbbPageSize.Text.Trim(), out num) || num <= 0)
    {
        num = 10;
        cbbPageSize.Text = "10";
    }
    else
    {
        isTextChanged = true;
    }
    pageSize = num;
    if (isTextChanged)
    {
        isTextChanged = false;
        linkFirst_LinkClicked(null, null);
    }
}

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

public event EventHandler OnPageChanged; 

6、该类的完整代码,如下:

public partial class PageControl : UserControl
{
   public event EventHandler OnPageChanged;

   public PageControl()
   {
       InitializeComponent();
   }

   //每页显示记录数
   private int pageSize = 10;
   //页序号
   private int pageIndex = 1;
   //总页数
   private int pageCount = 0;
   //总记录数
   private int totalCount = 0;

   public int PageSize { get => pageSize; set => pageSize = value; }
   public int PageIndex { get => pageIndex; set => pageIndex = value; }
   public int PageCount
   {
       get
       {
           if (pageSize != 0)
           {
               pageCount = GetPageCount();
           }
           return pageCount;
       }
       set { pageCount = value; }
   }
   public int TotalCount { get => totalCount; set => totalCount = value; }


   /// <summary>
   /// 计算总页数
   /// </summary>
   /// <returns></returns>
   private int GetPageCount()
   {
       if (PageSize == 0)
       {
           return 0;
       }
       int pageCount = TotalCount / PageSize;
       if (TotalCount % PageSize == 0)
       {
           pageCount = TotalCount / PageSize;
       }
       else
       {
           pageCount = TotalCount / PageSize + 1;
       }
       return pageCount;
   }

   /// <summary>
   /// 首页
   /// </summary>
   /// <param name="sender"></param>
   /// <param name="e"></param>
   private void linkFirst_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
   {
       PageIndex = 1;
       DrawControl(true);
   }

   /// <summary>
   /// 上一页
   /// </summary>
   /// <param name="sender"></param>
   /// <param name="e"></param>
   private void linkPrev_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
   {

       PageIndex = Math.Max(1, PageIndex - 1);
       DrawControl(true);
   }


   /// <summary>
   /// 下一页
   /// </summary>
   /// <param name="sender"></param>
   /// <param name="e"></param>
   private void linkNext_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
   {
       PageIndex = Math.Min(PageCount, PageIndex + 1);
       DrawControl(true);
   }

   /// <summary>
   /// 末页
   /// </summary>
   /// <param name="sender"></param>
   /// <param name="e"></param>
   private void linkLast_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
   {

       PageIndex = PageCount;
       DrawControl(true);
   }

   public void DrawControl(int count)
   {
       TotalCount = count;
       DrawControl(false);
   }

   /// <summary>
   /// 页面控件呈现
   /// </summary>
   private void DrawControl(bool callEvent)
   {
       lblTotalPage.Text = new StringBuilder("第 ").Append(PageIndex.ToString()).Append(" / ").Append(PageCount.ToString()).Append(" 页").ToString();
       lblTotalCount.Text = new StringBuilder("共 ").Append(TotalCount.ToString()).Append(" 条").ToString();
       cbbPageSize.Text = PageSize.ToString();

       if (callEvent && OnPageChanged != null)
       {
           OnPageChanged(this, null);//当前分页数字改变时,触发委托事件
       }
       SetFormCtrEnabled();
       if (PageCount <= 1)//有且仅有一页
       {
           linkFirst.Enabled = false;
           linkPrev.Enabled = false;
           linkNext.Enabled = false;
           linkLast.Enabled = false;
           linkGo.Enabled = false;
       }
       else if (PageIndex == 1)//第一页
       {
           linkFirst.Enabled = false;
           linkPrev.Enabled = false;
       }
       else if (PageIndex == PageCount)//最后一页
       {
           linkNext.Enabled = false;
           linkLast.Enabled = false;
       }
   }

   private void SetFormCtrEnabled()
   {
       linkFirst.Enabled = true;
       linkPrev.Enabled = true;
       linkNext.Enabled = true;
       linkLast.Enabled = true;
       linkGo.Enabled = true;
   }

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

   /// <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 linkGo_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
   {
       int num = 0;
       if (int.TryParse(txtPageNum.Text.Trim(), out num) && num > 0)
       {
           PageIndex = num;
           DrawControl(true);
       }
   }



   private void PageControl_Paint(object sender, PaintEventArgs e)
   {
       drawBorder(e);
   }

   private void drawBorder(PaintEventArgs e)
   {
       Color _lineColor = Color.FromArgb(0, 123, 255);
       ControlPaint.DrawBorder(e.Graphics, this.ClientRectangle,
       _lineColor, 1, ButtonBorderStyle.Solid, //左边
     _lineColor, 1, ButtonBorderStyle.Solid, //上边
     _lineColor, 1, ButtonBorderStyle.Solid, //右边
     _lineColor, 1, ButtonBorderStyle.Solid);//底边

   }

   /// <summary>
   /// 每页显示记录数更改事件
   /// </summary>
   bool isTextChanged = false;
   private void cbbPageSize_SelectedIndexChanged(object sender, EventArgs e)
   {
       int num = 0;
       if (!int.TryParse(cbbPageSize.Text.Trim(), out num) || num <= 0)
       {
           num = 10;
           cbbPageSize.Text = "10";
       }
       else
       {
           isTextChanged = true;
       }
       pageSize = num;
       if (isTextChanged)
       {
           isTextChanged = false;
           linkFirst_LinkClicked(null, null);
       }
   }
}

7、分页控件使用介绍
第一步:在winform中拖入一个panel,dock设为fill;在panel上再拖入PageControl控件(重新生成解决方案,该控件会出现在工具栏)dock设为bottom;在panel上再拖入DataGridView控件,dock设为fill
第二步:写分页查询方法和总数查询方法,将两个方法封装在一起并与DataGridView和PageControl绑定

private void loadData()
{
    List<数据对象> pageList = vehicleInOutLogDao.findInPage(查询条件, pageControl1.PageSize, pageControl1.PageIndex);
    int count = vehicleInOutLogDao.findInCount(查询条件);
    dataGridView1.AutoGenerateColumns = false;
    dataGridView1.DataSource = pageList;
    pageControl1.DrawControl(count);
}

第三步:写PageControl的OnPageChanged方法,在该方法内调用一下查询数据的方法即可。

private void pageControl1_OnPageChanged(object sender, EventArgs e)
{
    loadData();
}

至此,通用分页控件及使用介绍完毕。

  • 5
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
一、AspNetPager支持两种方式分页: 一种是PostBack方式分页, 一种是通过Url来实现分页以及Url重写功能 二、AspNetPager支持各种数据绑定控件GridView、DataGrid、DataList、Repeater以及自定义的数据绑定控件分页功能十分强大。 三、AspNetPager分页控件本身并不显示任何数据,而只显示分页导航元素,数据在页面上的显示方式与该控件无关,所以需要手写数据连接方法来配合, 四、结合TOP 。。。NOT IN 的通用存储过程分页方法使用AspNetPager十分实用 测试控件datalist aspnetpager 的分页方法示例 分页方法为 PostBack 方式 1、 首先将AspNetPager.dll复制于应用程序下的bin目录,打开解决方案,引入dll文件 2、 在工具栏中添加控件,这样可以支持拖拽使用 3、 要使用AspNetPager 要为其设置最基本的属性 使用 SqlServer Northwind数据库的 Products表 protected Wuqi.Webdiyer.AspNetPager AspNetPager1; protected System.Web.UI.WebControls.Label Label1; protected System.Web.UI.WebControls.DataList DataList1; private void Page_Load(object sender, System.EventArgs e) { this.AspNetPager1.PageSize=10; //设置每也显示的记录条数 if(!IsPostBack) //只在页面第一次加载时起作用 { SqlDBManager db = new SqlDBManager(System.Configuration.ConfigurationSettings.AppSettings["SqlConnectionString"]); AspNetPager1.RecordCount=db.CountPage("products");//获得要使用表的记录总数 //db.CountItems自定义的方法 this.BindData(); } } private void BindData() { SqlDBManager db= new SqlDBManager(System.Configuration.ConfigurationSettings.AppSettings["SqlConnectionString"].ToString(); DataList1.DataSource=db.FenPage(this.AspNetPager1.PageSize,this.AspNetPager1.CurrentPageIndex,"productid","products","productid,productname,unitprice,unitsinstock",""); //自定义方法由 TOP not in 存储过程分页方法改编 this.DataList1.DataBind(); //控件数据绑定 this.Label1.Text="当前第"+this.AspNetPager1.CurrentPageIndex+"页 总"+this.AspNetPager1.PageCount+"页"; } private void AspNetPager1_PageChanged(object sender, System.EventArgs e) { //页索引改变方法 this.BindData(); } 设计页效果 <asp:DataList id="DataList1" style="Z-INDEX: 101; LEFT: 296px; POSITION: absolute; TOP: 96px" runat="server"> <HeaderTemplate> <table border='1'> <tr> <td>产品ID</td> <td>产品名称</td> <td>产品数量</td> <td>产品单价</td> </tr> </HeaderTemplate> <FooterTemplate> </table> </FooterTemplate> <ItemTemplate> <tr> <td><%# DataBinder.Eval(Container.DataItem,"Productid")%></td> <td><%# DataBinder.Eval(Container.DataItem,"productname")%></td> <td><%# DataBinder.Eval(Container.DataItem,"unitprice")%></td> <td><%# DataBinder.Eval(Container.DataItem,"unitsinstock")%></td> </tr> </ItemTemplate> </asp:DataList> <webdiyer:AspNetPager id="AspNetPager1" style="Z-INDEX: 102; LEFT: 256px; POSITION: absolute; TOP: 40px" runat="server" Width="500px" FirstPageText="首页" LastPageText="尾页" NextPageText="下一页" PrevPageText="上一页" Height="40px" NumericButt PagingButt ShowNavigati ShowInputBox="Always" TextAfterInputBox="页" TextBeforeInputBox="跳转到第" AlwaysShow="True"> </webdiyer:AspNetPager> <asp:Label id="Label1" style="Z-INDEX: 103; LEFT: 120px; POSITION: absolute; TOP: 56px" runat="server">Label</asp:Label>

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值