博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
winform下的一个分页控件总结
阅读量:6627 次
发布时间:2019-06-25

本文共 4385 字,大约阅读时间需要 14 分钟。

1、工程和项目结构

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

 

2、分页控件

(1)、分页效果图

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

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

(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,如需转载请自行联系原作者

你可能感兴趣的文章
写给小白的JVM学习指南
查看>>
html
查看>>
8.6(java学习笔记)类加载过程及类加载器
查看>>
Mysql导出数据字典
查看>>
let与var的区别
查看>>
Python入门 —— 04字符串解析
查看>>
flex布局
查看>>
【微信小程序】e.currentTarget和e.target
查看>>
[Xcode]SVN的使用
查看>>
[MAC] Mac下的SVN命令行
查看>>
订单管理 练习
查看>>
理解Android的startservice和bindservice(转)
查看>>
安卓 主流框架
查看>>
qhfl-2 ContentType组件
查看>>
XMPP系列(四)---发送和接收文字消息,获取历史消息功能
查看>>
对称加密和分组加密中的四种模式(ECB、CBC、CFB、OFB)
查看>>
万元大奖邀您参与阿里云数加 MaxCompute最佳实践征文大赛
查看>>
action带参
查看>>
一个简单的语法制导翻译器
查看>>
ARC100D Equal Cut
查看>>