Winform分页控件重大更新,并实现普通版、DotNetBar、DevExpress三大版本整合更新(附各种例子源码)

简介:

在Winform开发中,一直离不开分页处理,好的分页控件封装,能为开发节省很多时间和繁琐工作,对分页控件一直的改进和完善,也是我的兴趣之一。本次主要实现对分页控件的全面重构,优化功能及界面的处理,并统一完成普通版、基于DotNetbar界面控件版本、DevExpress界面控件版本三大版本的发布,这几个界面版本,除了界面表现效果不一样外,所有的功能展示及使用代码完全一致,保证用户的知识投资及给客户良好的使用操作。本次主要增加的功能有:可通过界面设置列表显示的列,可复制选定的行信息,可设置显示的行号、可设置显示间隔行的颜色等功能。下面分别对几个例子的截图进行总体介绍,然后在详细介绍

1)普通版(即不引用任何第三方界面控件)效果图

 

上图中,红色的菜单是分页控件内置的菜单项,其他程序附加是扩展菜单项目,其中复制选定行信息、设置表格显示列、打印列表是对表格基本的操作功能。下面两个版本的控件右键菜单均表现一致。 

2) 基于DotNetbar界面控件版本

 

3) 基于DevExpress界面控件版本

 

使用分页控件的基础代码,在所有以上版本中,代码均一致,只是一些特殊的操作,需要利用到不同的控件,有所差异而已。初始化分页控件代码如下所示。

         private   void  FrmCustomer_Load( object  sender, EventArgs e)
        {
            
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.OnDeleteSelected  +=   new  EventHandler(winGridViewPager1_OnDeleteSelected);
            
this .winGridViewPager1.OnRefresh  +=   new  EventHandler(winGridViewPager1_OnRefresh);
            
this .winGridViewPager1.OnAddNew  +=   new  EventHandler(winGridViewPager1_OnAddNew);
            
this .winGridViewPager1.AppendedMenu  =   this .contextMenuStrip1; // 追加额外菜单项目
             this .winGridViewPager1.ShowLineNumber  =   true ; // 显示行号
             this .winGridViewPager1.PagerInfo.PageSize  =   30 ; // 页面大小
             this .winGridViewPager1.EventRowBackColor  =  Color.LightCyan; // 间隔颜色

            BindData();
       }

 以上是对分页控件的相关事件进行处理,如果实现了相关的事件,那么相应的菜单(如新增、编辑、删除等)就会在右键菜单中出现,否则不会出现,相应的事件就是具体对应操作的处理菜单操作。另外,分页控件的一些属性,如是否显示行号、页面显示记录大小、间隔颜色等属性也可以在这里设置。

这些初始化设置完成后,一般查询界面都会有一个条件的组合,然后通过组合条件查询数据库记录并显示,显示的时候,分页控件可以设置对应字段的中文显示名称,显示的字段列,显示顺序等。显示字段的顺序就是列表的显示顺序,这个特性也是新版本增加的功能之一        

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

        
///   <summary>
        
///  根据查询条件构造查询语句
        
///   </summary>
        
///   <returns></returns>
         private   string  GetSearchSql()
        {
            SearchCondition condition 
=   new  SearchCondition();
            condition.AddCondition(
" Number " this .txtNumber.Text, SqlOperator.Like)
                .AddCondition(
" Name " this .txtName.Text, SqlOperator.Like)
                .AddCondition(
" Type " this .cmbType.Text, SqlOperator.Like)
                .AddCondition(
" Area " this .cmbArea.Text, SqlOperator.Like)
                .AddCondition(
" Address " this .txtAddress.Text, SqlOperator.Like)
                .AddCondition(
" Company " this .txtCompany.Text, SqlOperator.Like)
                .AddCondition(
" Note " this .txtNote.Text, SqlOperator.Like)
                .AddCondition(
" Telephone1 " this .txtTelephone.Text, SqlOperator.Like,  true " Telephone " )
                .AddCondition(
" Telephone2 " this .txtTelephone.Text, SqlOperator.Like,  true " Telephone " )
                .AddCondition(
" Telephone3 " this .txtTelephone.Text, SqlOperator.Like,  true " Telephone " )
                .AddCondition(
" Telephone4 " this .txtTelephone.Text, SqlOperator.Like,  true " Telephone " )
                .AddCondition(
" Telephone5 " this .txtTelephone.Text, SqlOperator.Like,  true " Telephone " );

            
if  (chkUseDate.Checked)
            {
                condition.AddCondition(
" CreateDate " , dateTimePicker1.Value.ToString( " yyyy-MM-dd " ), SqlOperator.MoreThanOrEqual,  true )
                    .AddCondition(
" CreateDate " , dateTimePicker2.Value.AddDays( 1 ).ToString( " yyyy-MM-dd " ), SqlOperator.LessThanOrEqual,  true );

            }
            
string   where   =  condition.BuildConditionSql().Replace( " Where " "" );
            
return   where ;
        }

        
private   void  BindData()
        {
            
#region  添加别名解析
            
// DisplayColumns与显示的字段名或者实体属性一致,大小写不敏感,顺序代表显示顺序,用逗号或者|分开
             this .winGridViewPager1.DisplayColumns  =   " Number,NAME,type,Area,Company,Address,Telephone1,Telephone2,Telephone3,Telephone4,Telephone5,CreateDate,Note,LastUpdated " ;
            
this .winGridViewPager1.AddColumnAlias( " ID " " 编号 " );
            
this .winGridViewPager1.AddColumnAlias( " Number " " 客户编号 " );
            
this .winGridViewPager1.AddColumnAlias( " Name " " 客户名称 " );
            
this .winGridViewPager1.AddColumnAlias( " Type " " 客户类型 " );
            
this .winGridViewPager1.AddColumnAlias( " Area " " 客户地区 " );
            
this .winGridViewPager1.AddColumnAlias( " Company " " 客户单位 " );
            
this .winGridViewPager1.AddColumnAlias( " Address " " 客户地址 " );
            
this .winGridViewPager1.AddColumnAlias( " Telephone1 " " 电话1 " );
            
this .winGridViewPager1.AddColumnAlias( " Telephone2 " " 电话2 " );
            
this .winGridViewPager1.AddColumnAlias( " Telephone3 " " 电话3 " );
            
this .winGridViewPager1.AddColumnAlias( " Telephone4 " " 电话4 " );
            
this .winGridViewPager1.AddColumnAlias( " Telephone5 " " 电话5 " );
            
this .winGridViewPager1.AddColumnAlias( " CreateDate " " 开户日期 " );
            
this .winGridViewPager1.AddColumnAlias( " Shop_ID " " 分店ID " );
            
this .winGridViewPager1.AddColumnAlias( " Note " " 备注 " );
            
this .winGridViewPager1.AddColumnAlias( " LastUpdated " " 更新日期 " );

            
#endregion

            
string   where   =  GetSearchSql();
            
this .winGridViewPager1.DataSource  =  BLLFactory < Customer > .Instance.Find( where this .winGridViewPager1.PagerInfo);
        }

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

很多人以前看过我介绍分页控件的用法的时候,总会觉得上面的数据绑定方式看似简单,实际操作可能绑定数据总是有问题,因为不知道Find函数里面需要实现那些操作,因为这些是基于我框架的应用逻辑。其实Find方法就是根据分页属性计算获取对应记录,然后把总记录数赋值给分页控件的属性。

下面我们来介绍一个不需要依赖我的Winform框架类,只是引用微软EnterpriseLibary数据库操作类即可完成的操作,因为最新的分页控件集成了一个基于Oracle、SqlServer、Access、Mysql数据库的分页逻辑,只需要使用PagerHelper这个类,传入相关的参数即可。

分页控件绑定数据如下代码所示。

         private   void  BindData()
        {
            
#region  添加别名解析
            
// DisplayColumns与显示的字段名或者实体属性一致,大小写不敏感,顺序代表显示顺序,用逗号或者|分开
             this .winGridViewPager1.DisplayColumns  =   " Number,NAME,type,Area,Company,Address,Telephone1,Telephone2,Telephone3,Telephone4,Telephone5,CreateDate,Note,LastUpdated " ;
            
this .winGridViewPager1.AddColumnAlias( " ID " " 编号 " );
            
this .winGridViewPager1.AddColumnAlias( " Number " " 客户编号 " );
            
this .winGridViewPager1.AddColumnAlias( " Name " " 客户名称 " );
            
this .winGridViewPager1.AddColumnAlias( " Type " " 客户类型 " );
            
this .winGridViewPager1.AddColumnAlias( " Area " " 客户地区 " );
            
this .winGridViewPager1.AddColumnAlias( " Company " " 客户单位 " );
            
this .winGridViewPager1.AddColumnAlias( " Address " " 客户地址 " );
            
this .winGridViewPager1.AddColumnAlias( " Telephone1 " " 电话1 " );
            
this .winGridViewPager1.AddColumnAlias( " Telephone2 " " 电话2 " );
            
this .winGridViewPager1.AddColumnAlias( " Telephone3 " " 电话3 " );
            
this .winGridViewPager1.AddColumnAlias( " Telephone4 " " 电话4 " );
            
this .winGridViewPager1.AddColumnAlias( " Telephone5 " " 电话5 " );
            
this .winGridViewPager1.AddColumnAlias( " CreateDate " " 开户日期 " );
            
this .winGridViewPager1.AddColumnAlias( " Shop_ID " " 分店ID " );
            
this .winGridViewPager1.AddColumnAlias( " Note " " 备注 " );
            
this .winGridViewPager1.AddColumnAlias( " LastUpdated " " 更新日期 " );

            
#endregion

            
string   where   =  GetSearchSql();
            
this .winGridViewPager1.DataSource  =  FindToDataTable( where this .winGridViewPager1.PagerInfo);
       }
 

FindToDataTable函数的相关实现代码如下所示:

         ///   <summary>
        
///  标准的记录查询函数
        
///   </summary>
        
///   <param name="where"></param>
        
///   <param name="pagerInfo"></param>
        
///   <returns></returns>
         private  DataTable FindToDataTable( string   where , PagerInfo pagerInfo)
        {
            WHC.Pager.WinControl.PagerHelper helper 
=   new  WHC.Pager.WinControl.PagerHelper( " All_Customer " " * " " LastUpdated " , pagerInfo.PageSize, pagerInfo.CurrenetPageIndex,  true where );
            
string  countSql  =  helper.GetPagingSql(WHC.Pager.WinControl.DatabaseType.Access,  true );
            
string  dataSql  =  helper.GetPagingSql(WHC.Pager.WinControl.DatabaseType.Access,  false );

            
string  value  =  SqlValueList(countSql);
            pagerInfo.RecordCount 
=  Convert.ToInt32(value); // 为了显示具体的信息,需要设置总记录数
            DataTable dt  =  SqlTable(dataSql);
            
return  dt;
        }

        
///   <summary>     
        
///  执行SQL查询语句,返回查询结果的所有记录的第一个字段,用逗号分隔。    
        
///   </summary>     
        
///   <param name="sql"> SQL语句 </param>     
        
///   <returns>     
        
///  返回查询结果的所有记录的第一个字段,用逗号分隔。    
        
///   </returns>     
         public   string  SqlValueList( string  sql)
        {
            StringBuilder result 
=   new  StringBuilder();
            Database db 
=  DatabaseFactory.CreateDatabase();
            DbCommand command 
=  db.GetSqlStringCommand(sql);

            
using  (IDataReader dr  =  db.ExecuteReader(command))
            {
                
while  (dr.Read())
                {
                    result.AppendFormat(
" {0}, " , dr[ 0 ].ToString());
                }
            }
            
string  strResult  =  result.ToString().Trim( ' , ' );
            
return  strResult;
        }

        
///   <summary>     
        
///  执行SQL查询语句,返回所有记录的DataTable集合。    
        
///   </summary>     
        
///   <param name="sql"> SQL查询语句 </param>     
        
///   <returns></returns>     
         public  DataTable SqlTable( string  sql)
        {
            Database db 
=  DatabaseFactory.CreateDatabase();
            DbCommand command 
=  db.GetSqlStringCommand(sql);
            
return  db.ExecuteDataSet(command).Tables[ 0 ];
         }

 利用控件内置的分页辅助类

WHC.Pager.WinControl.PagerHelper,你就可以不用理会各种不同数据库的分页实现逻辑,只需要按照以上的调用方式调用即可,该类传入的第一个参数,既可以是表名,也可以是一段查询语句,非常方便各种复杂条件的查询分页

最新分页控件的相关界面截图如下所示。

1)设置表格列的可见性 

 
 2)表格数据打印预览

 

3)行数据基本信息提示 

 

 4)复制选定行后在文本中查看

 

为了使得大家对我的Winform分页控件在不同情况下的深入了解和使用,我特意编写了几种情况下的使用标准例子,供大家下载学习研究,例子包括利用基于泛型模式的Winform开发框架结构的分页控件使用例子,基于传统简单数据绑定的分页控件使用例子, 基于DotNetBar界面控件及简单数据绑定的分页控件使用例子,基于DevExpress界面控件及简单数据绑定的分页控件使用例子,如下图所示。

 

各种例子的源码的下载地址如下:http://www.iqidi.com/download/TestWinPager_Demo.rar 

本文转自博客园伍华聪的博客,原文链接:Winform分页控件重大更新,并实现普通版、DotNetBar、DevExpress三大版本整合更新(附各种例子源码),如需转载请自行联系原博主。



目录
相关文章
C# WPF 中 外部图标引入iconfont,无法正常显示问题 【小白记录】
本文介绍了在C# WPF应用程序中引入外部iconfont图标时可能遇到的显示问题及其解决方法:1) 检查资源路径和引入格式是否正确,确保字体文件引用格式为“#xxxx”,并正确指向字体文件位置;2) 确保图标资源被包含在程序集中,通过设置字体文件的生成操作为Resource(资源)来实现。
C# WPF 中 外部图标引入iconfont,无法正常显示问题 【小白记录】
winform .net6 和 framework 的图表控件,为啥项目中不存在chart控件,该如何解决?
本文讨论了在基于.NET 6和.NET Framework的WinForms项目中添加图表控件的不同方法。由于.NET 6的WinForms项目默认不包含Chart控件,可以通过NuGet包管理器安装如ScottPlot等图表插件。而对于基于.NET Framework的WinForms项目,Chart控件是默认存在的,也可以通过NuGet安装额外的图表插件,例如LiveCharts。文中提供了通过NuGet添加图表控件的步骤和截图说明。
winform .net6 和 framework 的图表控件,为啥项目中不存在chart控件,该如何解决?
|
3月前
|
设计模式 开发框架 前端开发
循序渐进介绍基于CommunityToolkit.Mvvm 和HandyControl的WPF应用端开发(6) -- 窗口控件脏数据状态IsDirty的跟踪处理
循序渐进介绍基于CommunityToolkit.Mvvm 和HandyControl的WPF应用端开发(6) -- 窗口控件脏数据状态IsDirty的跟踪处理
|
3月前
|
图形学
小功能⭐️Unity判断是否单击到了UI
小功能⭐️Unity判断是否单击到了UI
|
11月前
|
编解码 前端开发 图形学
Unity 用脚本操作常用UI控件(上)
Unity 用脚本操作常用UI控件(上)
157 0
|
缓存
《QT从基础到进阶·二十二》QGraphicsView显示大量图形项item导致界面卡顿的解决办法
《QT从基础到进阶·二十二》QGraphicsView显示大量图形项item导致界面卡顿的解决办法
604 0
|
设计模式
QtQuickcontrols2控件使用参考
随着Qt的版本升级,其自带的controls控件库也不断升级,目前已经到了2.3的版本。本文通过解读Qt自带的gallery例程,说明新版本controls控件库的相关特性。其具体位置于: 因为相关的中文资料比较缺乏,所以这里的内容会详细整理,某种意义上可以当作使用手册来使用。
1074 0