winform下的一个分页控件总结

简介:
1、工程和项目结构

IBatisWinProject

本文示例主要就是通过IBatisNet进行一个简单的数据查询。

 

2、分页控件

(1)、分页效果图

在DotNet.Common下的DotNet.Common.WinForm工程下有一个用户控件PagerControl,它的设计视图主要包括四个LinkLabel、一个数字文本框、一个Button控件以及几个和显示统计数字相关的Label控件。本文示例的一个分页显示效果如下:

WinFormPager

控件比较丑陋,是多么没有美术和设计天赋啊。

(2)、控件使用方式

1
2
3
4
//绑定页码相关信息
       PagerControl pager = new  PagerControl( this .CurrentPage, this .RecordsPerPage, this .TotalCount, "跳转" );
       pager.currentPageChanged += new  EventHandler(pager_currentPageChanged); //页码变化 触发的事件
       this .panelPager.Controls.Add(pager); //在Panel容器中加入这个控件

使用这个控件的时候,只需要简单的new一个控件对象,然后传入正确的参数,如当前页面,每页记录数,数据集合总记录数以及按钮上显示的文字即可。

(3)、如何正确传参和分页

对于分页来说,重要的是传入查询条件和页码参数。查询条件我们的MainForm窗体有现成的输入文本框,那么如何传递当前页码参数呢?毫无疑问,4个LinkLabel以及一个数字输入框和一个按钮组合会引发当前页数字的改变,所以我们要在它们所对应的一些事件下做一些CurrentPage的处理:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
#region 相关控件事件
 
      private  void  lnkFirst_LinkClicked( object  sender, LinkLabelLinkClickedEventArgs e)
      {
          CurrentPage = 1;
          DrawControl();
      }
 
      private  void  lnkPrev_LinkClicked( object  sender, LinkLabelLinkClickedEventArgs e)
      {
          CurrentPage = Math.Max(1, CurrentPage - 1);
          DrawControl();
      }
 
      private  void  lnkNext_LinkClicked( object  sender, LinkLabelLinkClickedEventArgs e)
      {
          CurrentPage = Math.Min(PageCount, CurrentPage + 1);
          DrawControl();
      }
 
      private  void  lnkLast_LinkClicked( object  sender, LinkLabelLinkClickedEventArgs e)
      {
          CurrentPage = PageCount;
          DrawControl();
      }
 
      /// <summary>
      /// enter键功能
      /// </summary>
      /// <param name="sender"></param>
      /// <param name="e"></param>
      private  void  txtPageNum_KeyPress( object  sender, KeyPressEventArgs e)
      {
          string  strNum = this .txtPageNum.Text.Trim();
          if  (e.KeyChar == ( char )Keys.Enter && RegUtil.IsPositiveNumber(strNum))
          {
              CurrentPage = int .Parse(strNum);
              DrawControl();
          }
      }
 
      /// <summary>
      /// 页数限制
      /// </summary>
      /// <param name="sender"></param>
      /// <param name="e"></param>
      private  void  txtPageNum_TextChanged( object  sender, EventArgs e)
      {
          string  strNum = this .txtPageNum.Text.Trim();
          if  (strNum.Length > 0 && RegUtil.IsPositiveNumber(strNum) && int .Parse(strNum) > PageCount)
          {
              txtPageNum.Text = PageCount.ToString();
          }
      }
 
      /// <summary>
      /// 跳转
      /// </summary>
      /// <param name="sender"></param>
      /// <param name="e"></param>
      private  void  btnGo_Click( object  sender, EventArgs e)
      {
          string  strNum = this .txtPageNum.Text.Trim();
          if  (RegUtil.IsPositiveNumber(strNum) == false )
          {
              return ;
          }
          CurrentPage = int .Parse(strNum);
          DrawControl();
      }
 
      #endregion

我们注意到DrawControl方法,这是非常重要的一个函数:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
/// <summary>
     /// 页面控件呈现
     /// </summary>
     private  void  DrawControl()
     {
         this .btnGo.Text = this .JumpText;
         this .lblCurrentPage.Text = CurrentPage.ToString();
         this .lblPageCount.Text = PageCount.ToString();
         this .lblTotalCount.Text = TotalCount.ToString();
         this .lblRecPerPg.Text = RecordsPerPage.ToString();
 
         if  (currentPageChanged != null )
         {
             currentPageChanged( this , null ); //当前分页数字改变时,触发委托事件
         }
         SetFormCtrEnabled();
         if  (PageCount == 1) //有且仅有一页
         {
             this .lnkFirst.Enabled = false ;
             this .lnkPrev.Enabled = false ;
             this .lnkNext.Enabled = false ;
             this .lnkLast.Enabled = false ;
             this .btnGo.Enabled = false ;
         }
         else  if  (CurrentPage == 1) //第一页
         {
             this .lnkFirst.Enabled = false ;
             this .lnkPrev.Enabled = false ;
             //this.lnkFirst.ForeColor = Color.Gray;
             //this.lnkPrev.ForeColor = Color.Gray;
         }
         else  if  (CurrentPage == this .PageCount) //最后一页
         {
             this .lnkNext.Enabled = false ;
             this .lnkLast.Enabled = false ;
         }
     }

因为它会有条件地触发下面的委托事件:

1
public  event  EventHandler currentPageChanged;

我们完全可以这样理解:当我们点击按钮或者LinkLabel的时候,当前页码发生改变,所以需要重新做一些事情比如查询等等。控件就是通过引发currentPageChanged事件来触发的:

1
2
3
4
if  (currentPageChanged != null )
        {
            currentPageChanged( this , null ); //当前分页数字改变时,触发委托事件
        }

至于currentPageChanged委托触发的时候具体要做什么,那是每一个具体窗体中的函数要做的事情。比如本文的demo中,在MainForm中,我们通过定义下面这个方法给pager的currentPageChanged赋值:

1
2
3
4
5
6
7
8
9
private  void  pager_currentPageChanged( object  sender, EventArgs e)
{
     PagerControl pager = sender as  PagerControl;
     if  (pager == null )
     {
         return ;
     }
     BindResults(pager.CurrentPage); //查询数据并分页绑定
}

当分页控件的事件委托触发的时候,这里的BindResults函数通过pager的当前页数进行查询和数据绑定。这样说也许对你通俗地理解委托和事件有好处。

总体来说,实现winform的分页效果比webform要简单一些,因为它不需要考虑某些参数状态的变化。







本文转自JeffWong博客园博客,原文链接:http://www.cnblogs.com/jeffwongishandsome/archive/2010/11/21/1883160.html,如需转载请自行联系原作者


目录
相关文章
|
C# 索引 Windows
Winform控件优化之TabControl控件的使用和常用功能
TabControl是一个分页切换(tab)控件,不同的页框内可以呈现不同的内容,将主要介绍调整tab的左右侧显示、设置多行tab、禁用或删除tabpage、隐藏TabControl头部的选项卡等
3849 0
Winform控件优化之TabControl控件的使用和常用功能
|
数据库 C# 数据库管理
C#:Winfrom 实现DataGridView 自定义分页
今天给大家分享Winform实现DataGridView 自定义分页的案例,感兴趣的朋友可以一起来学习一下。 采用技术:C\#+Winform+Dapper+SQLite。
C#:Winfrom 实现DataGridView 自定义分页
|
C# Windows
WPF DataGrid分页功能实现代码
在Silverlight中DataGrid分页可以结合DataPager控件很容易实现,但是在WPF中没有类似的,需要手动实现这样一个控件: 1、创建一个UserControl,DP.
1068 0
|
SQL 存储 Go
WinForm DataGridView分页功能
WinForm 里面的DataGridView不像WebForm里面的GridView那样有自带的分页功能,需要自己写代码来实现分页,效果如下图: 分页控件   .CS: 1 using System; 2 using System.
1368 0
|
算法
分页控件和几个相关控件的源代码
分页控件的源代码,可能会让有些人失望,因为代码很乱。乱的一个原因呢,可能是没有采用OO的思路吧,因为写控件的时候还一点都不会OO呢,只是一直在用,也就没有作大的重构。有两个分页控件, 一个是通过PostBack来分页的,一个是通过URL来分页的。
767 0
|
C#
WPF 实现 DataGrid/ListView 分页控件
原文:WPF 实现 DataGrid/ListView 分页控件 在WPF中,通常会选用DataGrid/ListView进行数据展示,如果数据量不多,可以直接一个页面显示出来。如果数据量很大,2000条数据,一次性显示在一个页面中,不仅消耗资源,而且用户体验也很糟糕。
1876 0
|
C#
WPF 4 DataGrid 控件(基本功能篇)
原文:WPF 4 DataGrid 控件(基本功能篇)      提到DataGrid 不管是网页还是应用程序开发都会频繁使用。通过它我们可以灵活的在行与列间显示各种数据。本篇将详细介绍WPF 4 中DataGrid 的相关功能。
1459 0
|
存储 开发框架 .NET