WinForm界面开发之“分页控件”

在程序中,分页总是永远的话题,因为数据总是很多很多,分页展示在程序性能和数据查看感官方面得到很好的平衡,是一种良好的编程习惯和UI设计。

Winform中的分页控件可能没有Asp.net世界中的分页控件那么丰富多彩,不过也有不少的分页控件可以采用,各个人的可能都有一些不同的东西,一些好的东西。就我而言,我希望控件能够尽可能的多一些功能,耦合性低一些,例如我不想是基于存储过程的,因为我很多程序需要使用Access作为数据库,一般来说,我还希望有导出Excel数据的功能,还有打印预览功能,由于我的数据源表头,如实体类集合、表格内容绑定的时候,表头是英文的,我需要变为中文的,其他的功能有则更好。本篇介绍我在我的共享软件中大量使用的分页控件,如送水管理系统软件、病人资料管理软件等等,希望大家有兴趣的话,可以一起讨论使用该分页控件。以便整理吸收更多好的特性,共同学习。

先给大家一个总体感觉,这是我在送水软件中的界面展示,红色圈圈部分是分页控件的展示界面。

大家可以看到,除了基本的分页外,还有其他功能,如导出当前页、导出全部页、打印列表、以及相关功能操作的菜单(只要实现了相关的接口,则呈现相同的菜单,另外还有一些小地方,也是很常用关键的地方,就是间隔行的颜色变化,表头的中文化,行提示内容等等,我认为这些分页控件应该做的,特别是表头中文化部分很重要,因为这个分页控件的数据源是基于一般的对象集合(如List<EntityInfo>())或者DataTable的,因此数据源的表头可能是英文的(一般都是^_^)。

导出Excel是基本的功能,本控件支持当前页导出,全部页导出两种模式,导出的Excel数据也还是比较好看的,不是一般的格式哦。

 

控件另外一项功能,也是集实用功能之所成,打印当前列表内容,如下图所示,该内容会保存用户在每个列表数据中的信息,打印不同的表头内容,如下图所示。

 

那么控件应该如何使用呢,下面介绍一下使用的相关代码。

1、首先在Form_Load事件中绑定相关的委托处理事件,默认有“新建”、编辑选定项、删除、刷新、打印几个按钮,您可以在此基础上增加更多的菜单。

        private void FrmProduct_Load(object sender, EventArgs e)
        {
            BindData();

            
this.winGridViewPager1.ProgressBar = this.toolStripProgressBar1.ProgressBar;
            
this.winGridViewPager1.OnPageChanged += new EventHandler(winGridViewPager1_OnPageChanged);
            
this.winGridViewPager1.OnStartExport += new EventHandler(winGridViewPager1_OnStartExport);

            
this.winGridViewPager1.OnEditSelected += new EventHandler(winGridViewPager1_OnEditSelected);
            
this.winGridViewPager1.OnAddNew += new EventHandler(winGridViewPager1_OnAddNew);
            
this.winGridViewPager1.OnDeleteSelected += new EventHandler(winGridViewPager1_OnDeleteSelected);
            
this.winGridViewPager1.OnRefresh += new EventHandler(winGridViewPager1_OnRefresh);
            
this.winGridViewPager1.AppendedMenu = this.contextMenuStrip1;
        }

 

2。实现表头解析和上面的委托时间的例子代码如下.

        private void winGridViewPager1_OnRefresh(object sender, EventArgs e)
        {
            BindData();
        }

        
private void winGridViewPager1_OnDeleteSelected(object sender, EventArgs e)
        {
            
if (MessageUtil.ShowYesNoAndTips("您确定删除选定的记录么?"== DialogResult.No)
            {
                
return;
            }

            DataGridView grid 
= sender as DataGridView;
            
if (grid != null)
            {
                
foreach (DataGridViewRow row in grid.SelectedRows)
                {
                    BLLFactory
<Product>.Instance.Delete(row.Cells["ID"].Value.ToString());
                }
                BindData();
            }
        }

        
private void winGridViewPager1_OnEditSelected(object sender, EventArgs e)
        {
            DataGridView grid 
= sender as DataGridView;
            
if (grid != null)
            {
                
foreach (DataGridViewRow row in grid.SelectedRows)
                {
                    FrmEditProduct dlg 
= new FrmEditProduct();
                    dlg.ID 
= row.Cells["ID"].Value.ToString();
                    
if (DialogResult.OK == dlg.ShowDialog())
                    {
                        BindData();
                    }

                    
break;
                }
            }
        }
        
        
private void winGridViewPager1_OnAddNew(object sender, EventArgs e)
        {
            btnAddNew_Click(
nullnull);
        }

        
private void winGridViewPager1_OnStartExport(object sender, EventArgs e)
        {
            PagerInfo pagerInfo 
= new PagerInfo();
            pagerInfo.CurrenetPageIndex 
= 1;
            pagerInfo.PageSize 
= int.MaxValue;
            
this.winGridViewPager1.AllToExport = BLLFactory<Product>.Instance.GetAllToDataSet(pagerInfo).Tables[0];//product.GetAllToDataSet(pagerInfo).Tables[0];
        }

        
private void winGridViewPager1_OnPageChanged(object sender, EventArgs e)
        {
            BindData();
        }

        
private void BindData()
        {
            
#region 添加别名解析
            
this.winGridViewPager1.AddColumnAlias("ID""编号");
            
this.winGridViewPager1.AddColumnAlias("ProductType""产品类型");
            
this.winGridViewPager1.AddColumnAlias("ProductName""产品名称");
            
this.winGridViewPager1.AddColumnAlias("Specification""产品规格");
            
this.winGridViewPager1.AddColumnAlias("Model""产品型号");
            
this.winGridViewPager1.AddColumnAlias("OfferPrice""进货价");
            
this.winGridViewPager1.AddColumnAlias("AdvisePrive""建议价");
            
this.winGridViewPager1.AddColumnAlias("SalePrice""零售价");
            
this.winGridViewPager1.AddColumnAlias("Manufacture""生产厂商");
            
this.winGridViewPager1.AddColumnAlias("Manufacture_ID""厂商ID");
            
this.winGridViewPager1.AddColumnAlias("Note""备注");
            
this.winGridViewPager1.AddColumnAlias("LastUpdated""更新日期");
            
#endregion

            SearchCondition condition 
= new SearchCondition();
            condition.AddCondition(
"ProductName"this.txtName.Text, SqlOperator.Like)
                .AddCondition(
"ProductType"this.cmbProductType.Text, SqlOperator.Like)
                .AddCondition(
"Specification"this.cmbSpecNumber.Text, SqlOperator.Like)
                .AddCondition(
"Note"this.txtNote.Text, SqlOperator.Like)
                .AddCondition(
"Manufacture"this.cmbManufacture.Text, SqlOperator.Like);
            
string where = condition.BuildConditionSql().Replace("Where""");

            List
<ProductInfo> list = BLLFactory<Product>.Instance.Find(wherethis.winGridViewPager1.PagerInfo);
            
this.winGridViewPager1.DataSource = new WHC.Pager.WinControl.SortableBindingList<ProductInfo>(list);
        }

 

这样就实现了分页控件的内容展示以及相关功能的菜单挂接,实现后的菜单展示可能是这样子的,如下图所示,是否还可以呢,呵呵.

  

 

最后呈上控件文件一个, 大家有兴趣可以下载下载玩玩,使用有问题请在此留言.

http://files.cnblogs.com/wuhuacong/PagerWinControl.rar

主要研究技术:代码生成工具、Visio二次开发、送水管理软件等共享软件开发
专注于Winform开发框架、WCF开发框架的研究及应用。
  转载请注明出处:
撰写人:伍华聪  http:
//www.iqidi.com 
    

posted on 2009-07-07 21:06 伍华聪 阅读(10695) 评论(62) 编辑 收藏

评论

#1楼  回复 引用 查看   

先顶一个再说
2009-07-07 21:24 | LowerAI      

#2楼  回复 引用   

能否给个不使用BLLFactory的例子
2009-07-07 23:37 | 金叶子[未注册用户]

#3楼  回复 引用 查看   

控件使用说明书有不?
2009-07-08 08:14 | leoxu      

#4楼  回复 引用 查看   

万分的不错!顶一下!
2009-07-08 08:42 | 小狮座      

#5楼  回复 引用 查看   

2楼招聘是骗子公司。

该网站骗用户注册该网站,领取电子签名,收取费用。
2009-07-08 09:10 | ShadowK      

#6楼  回复 引用 查看   

不错 还很实用
2009-07-08 09:54 | xxx1013      

#7楼  回复 引用 查看   

好。
2009-07-08 10:23 | noviceliu      

#8楼  回复 引用 查看   

支持
2009-07-08 11:23 | 雨恨云愁      

#9楼  回复 引用 查看   

楼主能让我们看看源码吗?谢谢!
2009-07-08 11:27 | 姜荣昌      

#10楼  回复 引用 查看   

@姜荣昌
你觉得可能吗?下载个控件就不错了。
2009-07-08 11:39 | noviceliu      

#11楼  回复 引用 查看   


楼主可以提供一份简单的使用说明或例子吗?不知道直接用winGridViewPager1绑定的时候一页的大小在哪设定的??
谢谢~

ahjxxy@gmail.com
2009-07-08 11:44 | 小师傅      

#12楼  回复 引用 查看   

强烈建议禁止未注册用户发言!!!!!看看都是些什么啊。
2009-07-08 12:30 | 代码勤杂工      

#13楼[楼主]  回复 引用 查看   

已删除 骗子公司 的广告
2009-07-08 15:09 | 伍华聪      

#14楼[楼主]  回复 引用 查看   

控件我没有写说明书,不过上面的例子基本上功能都涉及到了,其他的看看属性或者相关的方法也明白了。
如果还不明白,大家一起探讨一下了。
2009-07-08 15:13 | 伍华聪      

#15楼  回复 引用 查看   

楼主你的主界面是如何做的?是否用过第三方控件?第三方控件是什么?
2009-07-08 16:31 | 鸟人      

#16楼  回复 引用 查看   

不错。系统的界面也是相当的漂亮呀,值得去看一看。牛人
2009-07-08 17:25 | 光 翟      

#17楼  回复 引用   

主界面下面,有未接来电,能说说这是怎么实现的吗?
2009-07-08 19:19 | 支持[未注册用户]

#18楼  回复 引用   

不错,支持楼主。
问一下楼主,右边的导航控件怎么做的?能不能发个示例给我。谢谢
2009-07-08 20:01 | newmoon[未注册用户]

#19楼  回复 引用   

错了 是左边的。
2009-07-08 20:02 | newmoon[未注册用户]

#20楼  回复 引用 查看   

看过LZ的两篇关于控件的文章,
LZ 的文章确实很不错哦,佩服。
不过小弟有点问题想请教LZ:
我现在的一个项目中用到了DevExpress控件,其中的一个LookUpEdit控件是比较常用的,现在问题出来了,它绑定的数据源数据量相当之庞大,好几W条的数据,一次显示出来有点不合适吧?想请教各位高人,怎么处理这个加载数据的问题?分页?还是一边加载一边显示,如果是后者,怎么做?

顺便说一下,DevExpress QQ交流群:82306553
2009-07-09 17:55 | hhshuai      

#21楼  回复 引用   

winGridViewPager1.DataSource 如何绑定sql2000 的数据?
winGridViewPager1如何设定分页中每页的数量?

请楼主作答。谢谢
2009-07-19 00:32 | 发表评论[未注册用户]

#22楼  回复 引用 查看   

能告诉我这个控件是用什么工具加密源代码的吗?最近在研究.net的源代码加密,发现你的这个控件的加密方案就是我想要达到的效果。
先谢谢了!
2009-07-21 13:16 | 想要飞翔      

#23楼  回复 引用 查看   


这是我做的一个分页控件,我也想把源代码加密一下
2009-07-21 13:54 | 想要飞翔      

#24楼  回复 引用   

控件的源码加密是用什么工具啊??

2009-07-29 11:55 | xxc[未注册用户]

#25楼  回复 引用   

单独的分页控件有没有例子做一个啊
2009-07-29 13:01 | xgt[未注册用户]

#26楼[楼主]  回复 引用 查看   

@hhshuai
数据量多肯定是要分页的,按需获取,不能一次加载所有信息,否则很慢
我的例子就是通过一个PagerInfo实体类来传递需要的分页信息,实现只取需要的记录内容。
2009-07-29 21:34 | 伍华聪      

#27楼[楼主]  回复 引用 查看   

winGridViewPager1.DataSource 如何绑定sql2000 的数据?
控件的数据源可以是DataTable数据格式,也可以是支持IList对象列表,如List<MyEntityInfo>列表。控件自动进行分析绑定
2009-07-29 21:36 | 伍华聪      

#28楼[楼主]  回复 引用 查看   

控件的源码加密是用什么工具啊??
控件采用了Dotfuscator Professional Edition4.3进行加密的。很好用的,一个加密工具
2009-07-29 21:38 | 伍华聪      

#29楼  回复 引用 查看   

请问,那个导出全部页,当前页 怎么在控件中呈现出来,能不能给个例子
2009-08-20 21:47 | liyf      

#30楼  回复 引用 查看   

请问,那个导出全部页,当前页 怎么在控件中呈现出来,能不能给个例子
谢谢 unicheer@163.com

#31楼  回复 引用 查看   

原来以为,在WinForm里只要能设计好权限控制,会Menu栏、状态栏、工具栏,会DataGridView就差不多了,看了楼主的文章,发现其内容可谓是博大精深,渐感自己的浅溥。
2010-02-06 08:48 | 不觉流年似水      

#32楼  回复 引用 查看   

请问这个gridview控件应该是屏蔽了某些功能的吧
2010-03-10 17:46 | 快乐牛牛      

#33楼  回复 引用 查看   

楼主能不能把导出execl方法写全 万分感谢啊
2010-03-11 16:28 | 2604529      

#34楼  回复 引用 查看   

导出至Excel出现异常
2010-03-31 14:27 | 云倪      

#35楼  回复 引用 查看   

楼主,你那个打印是否有问题啊?我能显示出来,就是打印不起来啊,报错,说什么RPC服务不可用。
2010-05-04 14:16 | guwei4037      

#36楼[楼主]  回复 引用 查看   

请检查是否您的打印机方面出了问题,我应用来打印没有出过问题的
2010-05-04 16:16 | 伍华聪      

#37楼  回复 引用 查看   

楼主,你的这个打印支持网络打印机吗?还是必须要在本地安装好打印驱动才能打印啊。预览可以,点打印直接就死那里了,最后弹出红框:RPC服务不可用。
2010-05-13 11:54 | guwei4037      

#38楼[楼主]  回复 引用 查看   

@guwei4037
可以正常打印的啊
2010-05-14 08:36 | 伍华聪      

#39楼  回复 引用 查看   

问题解决了,可以打印了,没设置网络可用打印机为默认打印机。不支持自动搜索可用打印机啊?
2010-05-14 11:02 | guwei4037      

#40楼  回复 引用 查看   

1.导出excel出错,不知道是不是我装了office 2007的原因,因为身边的电脑都是2007,所以不能测试。
2.还有一点,控件上的弹出菜单能否更改,比如删除掉某一项。
2010-05-30 22:15 | 秋天的眼睛      

#41楼  回复 引用 查看   

1.导出excel出错,不知道是不是我装了office 2007的原因,因为身边的电脑都是2007,所以不能测试。
2.还有一点,控件上的弹出菜单能否更改,比如删除掉某一项

楼上说的问题,和我一样,楼主能否给个答案?
2010-06-08 09:13 | liyf      

#42楼  回复 引用 查看   

相应的属性设置不够全面,不能前后翻页,不知支持多国语言
2010-08-19 15:04 | 立辉      

#43楼  回复 引用 查看   

请问一下,我用winGridViewPager的DataSource绑定datatable。这个用法是不是和用DataGridView的DataSource绑定datatable一样呢。楼主能不能给我一段绑定数据的代码呢,我总绑定不了datatable。谢谢。
2010-09-01 15:33 | 梦的河流      

#44楼  回复 引用 查看   

请问下,我在VS2010中,为什么Pager控件可以使用,winGridViewPager、winListViewPager.控件不能使用呢?
2010-10-22 10:15 | cxrdsr      

#45楼[楼主]  回复 引用 查看   

具体请联系我QQ 6966254
2010-10-22 12:31 | 伍华聪      

#46楼  回复 引用 查看   

请问下,我在VS2010中,为什么Pager控件可以使用,winGridViewPager、winListViewPager.控件不能使用呢?

我也有同样的问题啊
2010-10-31 01:06 | Yong.      

#47楼  回复 引用 查看   

请问一下,你那个tooltip是怎么处理的?
2010-12-13 14:13 | Jacobweng      

#48楼  回复 引用 查看   

47楼
WHC.Pager.Entity.dll 你需要应用这个dll程序集才能正常跑
2011-01-12 21:52 | 心之眷恋      

#49楼  回复 引用 查看   

BLLFactory 这个地方用不了 是不是没打包在里面哦
2011-01-12 21:53 | 心之眷恋      

#50楼  回复 引用 查看   

那个每页显示的条数,怎么改不了啊?设置pagesize 没效果,还是默认的50;还有导出为excel的时候总报空引用错,
楼主怎么解决啊?是不是我哪里没设置好?
2011-01-14 19:20 | 逍遥秋枫      

#51楼  回复 引用 查看   

试试
2011-02-23 22:54 | 扬帆メ风中香      

#52楼  回复 引用 查看   

我的错误跟50楼相同,请楼主回复。
2011-02-24 09:32 | Colin-      

#53楼[楼主]  回复 引用 查看   

@Colin-
@逍遥秋枫
最新版本控件,我已经集成了Apose.Cell的导出功能,导出比以前更好用,不会有错误的了,页面大小这个版本没有修改,只是没太多必要,不过以后有空可以调整下
2011-02-24 12:06 | 伍华聪      

#54楼[楼主]  回复 引用 查看   

@心之眷恋
这个可以用自己的业务类实现,不一定要用这个
2011-02-24 12:07 | 伍华聪      

#55楼  回复 引用 查看   

楼主您好,我想问一下,您做的分页控件的分页算法是在数据库中采用存储过程实现的吗?我自己做的分页控件的分页算法在SQL2000下是采用存储过程实现的,在SQL2005下是在前台通过ROW_NUMBER()实现的(这样更简单一些)。不过这样就会出现数据库版本切换的问题,我的解决方法是在控件中加了一个数据库版本选择的属性。想请教您是怎么解决这个问题的?
2011-04-01 11:16 | jack_mjl      

#56楼[楼主]  回复 引用 查看   

@jack_mjl
我用Sql分页
2011-04-01 12:13 | 伍华聪      

#57楼  回复 引用 查看   

建议博主分享下 分页控件 的实现思路~~
期待大作
2011-04-15 14:41 | 韩锁      

#58楼[楼主]  回复 引用 查看   

需要可以联系我QQ 6966254
2011-04-15 16:40 | 伍华聪      

#59楼  回复 引用 查看   

伍大哥,我加了你QQ,按照你上面方法只是能让数据显示。但导出Excel 就会出错。而且下面分页的功能也不能实现。所以我想向您取点经。我的QQ是519582611 。如果大哥能把那个完整案例给我看下话。我感激不尽。
2011-04-30 21:55 | 只好c#      

#60楼[楼主]  回复 引用 查看   

@只好c#
具体请联系我QQ 6966254 获取最新版本
2011-05-04 08:52 | 伍华聪      

#61楼  回复 引用 查看   

不错学到东西
2011-11-20 22:49 | 尹庆超      

#62楼  回复 引用 查看   

很不错的控件批
2011-12-30 11:53 | 黑牛打龙      

导航

<2009年7月>
2829301234
567891011
12131415161718
19202122232425
2627282930311
2345678

公告

昵称:伍华聪
园龄:6年7个月
荣誉:推荐博客
粉丝:656
关注:22

搜索

 

常用链接

最新随笔

我的标签

随笔档案(199)

文章分类(14)

文章档案(15)

相册

我的好友

我的技术支持站点(http://www.iqidi.com)

积分与排名

  • 积分 - 622553
  • 排名 - 79

最新评论

阅读排行榜

评论排行榜

推荐排行榜