WinForm DataGrid的功能扩展及实现 (已写完)

        你是否在开发WinForm应用程序时,通常使用DataGrid来作为数据的层现,是否会用到DataGrid分页,添加序号,添加全选,反选功能,有时还会用到不同数据显示不同的颜色.DataGridGost为我们做了这一切,你只需要简单的设置,几乎不用写一行代码就能轻松完成.下面我们一起来进入DataGridGost神奇的世界

[关键词]DataGrid,DataGrid全选,自动添加序号.

1.系统概述
      DataGridGos主要是封装了对分页,添加自动编号,添加全选列,转义列(比如,为2时显示加急,3显示不加急),指定条件的行着色等功能,指定条件的行才能被钩选.

2、部份实现代码

    添加全选列

     private   void  AddBoolColumnToTableStyle()
        {
            DataGridColorBoolColumn dgbolChoose_temp;
            dgbolChoose_temp 
=   new  DataGridColorBoolColumn();

            
//
            
// dgbolChoose_temp选择列
            
//
            dgbolChoose_temp.HeaderText  =  _CheckBoxTitle;
            dgbolChoose_temp.MappingName 
=   " NetlmChoose_2006 " ;
            dgbolChoose_temp.FalseValue 
=   false ;
            dgbolChoose_temp.NullValue 
=   "" ;
            dgbolChoose_temp.TrueValue 
=   true ;
            dgbolChoose_temp.Width 
=  _ChekcBoxWidth;

            
int  size  =  _CurrentDataGrid.TableStyles[ 0 ].GridColumnStyles.Count  +   1 ;
            DataGridColumnStyle[] dgcsarry 
=   new  DataGridColumnStyle[size];
            dgcsarry[
0 =  dgbolChoose_temp;
            
for  ( int  i  =   0 ; i  <  size  -   1 ; i ++ )
            {
                dgcsarry[i 
+   1 =  _CurrentDataGrid.TableStyles[ 0 ].GridColumnStyles[i];
            }

            _CurrentDataGrid.TableStyles[
0 ].GridColumnStyles.Clear();
            _CurrentDataGrid.TableStyles[
0 ].GridColumnStyles.AddRange(dgcsarry);
        }


 添加自动编号列

     private   void  AddSerNumColumnToTableStyle()
        {
            DataGridColorTextColumn dgSerNum_temp;
            dgSerNum_temp 
=   new  DataGridColorTextColumn();
            
            dgSerNum_temp.HeaderText 
=   " 序号 " ;
            dgSerNum_temp.MappingName 
=   " NetlmSerNumUID " ;
            dgSerNum_temp.Alignment 
=  HorizontalAlignment.Center;
            dgSerNum_temp.Width 
=  _SerNumWidth;

            
int  size  =  _CurrentDataGrid.TableStyles[ 0 ].GridColumnStyles.Count  +   1 ;
            DataGridColumnStyle[] dgcsarry 
=   new  DataGridColumnStyle[size];
            dgcsarry[
0 =  dgSerNum_temp;
            
for  ( int  i  =   0 ; i  <  size  -   1 ; i ++ )
            {
                dgcsarry[i 
+   1 =  _CurrentDataGrid.TableStyles[ 0 ].GridColumnStyles[i];
            }

            _CurrentDataGrid.TableStyles[
0 ].GridColumnStyles.Clear();
            _CurrentDataGrid.TableStyles[
0 ].GridColumnStyles.AddRange(dgcsarry);
        }


        在对输入的条件直接转换为布尔值时,遇到些困难,开始我想调用CodeDom直接生成表达式的值,但这样做并没有成功。比如 UserName==shumi 其中UserName表示的是列名,需要dr["UserName"].ToString()来读出列的值,而在CodeDom中并不能读出列的值,不知道那位高手有好的解决方案。我的做法是自已写了一个类似编译原理中的词法分析的类,采用四元式的方式分析表达式并求出布尔值,但由于学编译原理的知识差不多全还给老师了,所以在对四元式进行DAG图化简时还存在一定的问题。

下面是部份实现代码:
  

     private   bool  GetBoolByWhere( string  str,DataRow dr)
        {
            
// 将表达式分词
            ArrayList ary  =  StrToBoolExpression.ConvertExpression(str);
            
            
for ( int  i = 0 ;i < ary.Count;i ++ )
            {
                
if (i < ary.Count - 1   &&   ! IsOperator(ary[i].ToString()))
                {
                    
// 如果是字段,取出字段所表示的值
                     if (ary[i + 1 ].ToString()  != " ! "   &&  ary[i + 1 ].ToString() != " && "   &&  ary[i + 1 ].ToString() != " || " )
                    {
                        ary[i] 
=  dr[ary[i].ToString()].ToString();
                    }
                }
            }
            
try
            {
                
return   bool .Parse(StrToBoolExpression.ComputePostfix(ary).ToString());
            }
            
catch
            {
                
return   false ;
            }
        }

 

后记:
        这几天感冒了又拉肚子,好难受,从前天晚上都没有吃过任何东西,今天终于吃了两个鸡蛋,身体开始好转了,所以整理了这篇文章。先休息一下,下一篇我将介绍根据DataGridGost自动生成DataGridTableStyle的方法,并对自已开发的这个小工具使用方法做个简单的介绍。这里先提供给大家下载,希望能给大家的开发带来帮助.


文件下载:
 类库文档             示例源代码       DataGridTableStyle自动生成工具 

接着上午没有写完的说一下DataGridTableStyle自动生成工具的用法

TableStyles.JPG

 

软件界面如上图所示
设置好数据库连接后单击连接按扭,将加载当前数据库中的所有表和字段注释.在左边钩选需要生成的表,如果需要将,整型字段转义(1,显示为男,2显示为女)就在相应的列名行钩选转义.在这里我设定主键是不能为转义列的
上面的显示就是用到了DataGridGhost

生成的代码如下:

ContractedBlock.gif ExpandedBlockStart.gif 自动生成的代码
 1None.gif//作者:舒密    http://netlm.cnblogs.com
 2None.gif//广西师范学院    TCN工 作室
 3None.gif
 4None.gifusing System;
 5None.gifusing System;
 6None.gifusing System.Collections;
 7None.gifusing System.ComponentModel;
 8None.gifusing System.Drawing;
 9None.gifusing System.Data;
10None.gifusing System.Windows.Forms;
11None.gifusing Netlm.DataGridColumnGost;
12None.gif 
13None.gifnamespace DataTableStyles
14ExpandedBlockStart.gifContractedBlock.gifdot.gif{
15ExpandedSubBlockStart.gifContractedSubBlock.gif    /**//// <summary>
16InBlock.gif    /// RAccountRolesTableStyles 
17ExpandedSubBlockEnd.gif    /// </summary>

18InBlock.gif    public class RAccountRolesTableStyles : System.Windows.Forms.DataGridTableStyle
19ExpandedSubBlockStart.gifContractedSubBlock.gif    dot.gif{
20InBlock.gif        private System.ComponentModel.Container components = null;
21InBlock.gif        public RAccountRolesTableStyles()
22ExpandedSubBlockStart.gifContractedSubBlock.gif        dot.gif{
23InBlock.gif            InitializeComponent();
24ExpandedSubBlockEnd.gif        }

25ExpandedSubBlockStart.gifContractedSubBlock.gif        /**//// <summary> 
26InBlock.gif        /// 清理所有正在使用的资源。
27ExpandedSubBlockEnd.gif        /// </summary>

28InBlock.gif        protected override void Dispose( bool disposing )
29ExpandedSubBlockStart.gifContractedSubBlock.gif        dot.gif{
30InBlock.gif            if( disposing )
31ExpandedSubBlockStart.gifContractedSubBlock.gif            dot.gif{
32InBlock.gif                if(components != null)
33ExpandedSubBlockStart.gifContractedSubBlock.gif                dot.gif{
34InBlock.gif                    components.Dispose();
35ExpandedSubBlockEnd.gif                }

36ExpandedSubBlockEnd.gif            }

37InBlock.gif            base.Dispose( disposing );
38ExpandedSubBlockEnd.gif        }

39InBlock.gif        private DataGridColorTextColumn    dgColID;
40InBlock.gif        private DataGridColorTextColumn    dgColAccountGuid;
41InBlock.gif        private DataGridColorTextColumn    dgColRoleGuid;
42InBlock.gif
43InBlock.gif        public void InitializeComponent()
44ExpandedSubBlockStart.gifContractedSubBlock.gif        dot.gif{
45InBlock.gif            this.dgColID = new DataGridColorTextColumn();
46InBlock.gif            this.dgColAccountGuid = new DataGridColorTextColumn();
47InBlock.gif            this.dgColRoleGuid = new DataGridColorTextColumn();
48InBlock.gif    
49InBlock.gif
50InBlock.gif            //
51InBlock.gif            //dgColID 用户角色关系表ID自动增加,
52InBlock.gif            //
53InBlock.gif            dgColID.Format ="";
54InBlock.gif            dgColID.FormatInfo=null;
55InBlock.gif            dgColID.HeaderText ="用户角色关系表ID自动增加,";
56InBlock.gif            dgColID.MappingName ="ID";
57InBlock.gif            dgColID.Width =75;
58InBlock.gif            //
59InBlock.gif            //dgColAccountGuid 用户GUID
60InBlock.gif            //
61InBlock.gif            dgColAccountGuid.Format ="";
62InBlock.gif            dgColAccountGuid.FormatInfo=null;
63InBlock.gif            dgColAccountGuid.HeaderText ="用户GUID";
64InBlock.gif            dgColAccountGuid.MappingName ="AccountGuid";
65InBlock.gif            dgColAccountGuid.Width =75;
66InBlock.gif            //
67InBlock.gif            //dgColRoleGuid 角色GUID
68InBlock.gif            //
69InBlock.gif            dgColRoleGuid.Format ="";
70InBlock.gif            dgColRoleGuid.FormatInfo=null;
71InBlock.gif            dgColRoleGuid.HeaderText ="角色GUID";
72InBlock.gif            dgColRoleGuid.MappingName ="RoleGuid";
73InBlock.gif            dgColRoleGuid.Width =75;
74InBlock.gif            // 
75InBlock.gif            // DataTableStyles
76InBlock.gif            // 
77ExpandedSubBlockStart.gifContractedSubBlock.gif            this.GridColumnStyles.AddRange(new System.Windows.Forms.DataGridColumnStyle[] dot.gif{
78InBlock.gif                                                                                              this.dgColID,
79InBlock.gif                                                                                              this.dgColAccountGuid,
80InBlock.gif                                                                                              this.dgColRoleGuid
81ExpandedSubBlockEnd.gif                                                                                          }
);
82ExpandedSubBlockEnd.gif        }

83ExpandedSubBlockEnd.gif    }

84ExpandedBlockEnd.gif}

转载于:https://www.cnblogs.com/netlm/archive/2006/09/03/493483.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
开发环境为vs2012 C#源码及全样例 此版本为2012.2.24日更新版本,更新内容为 * 最后修改时间:2012.2.24 增加了汇总信息的自定义控制属性,参见功能描述12 * 2012.2.23 修改了过多列时父标题不显示的问题,重新写了算法,修改了标题头重叠及不能换行的问题,参见说明11. 总功能列举如下: /**************************************************************************************************** * Copyright (C) 2012 明振居士 版权没有,任意拷贝及使用,但对使用造成的任何后果不负任何责任,互相开源影响,共同进步 * 文 件 名:DataGridViewEx.cs * 创 建 人:明振居士 * Email:nzj.163@163.com qq:342155124 * 创建时间:2010-06-01 * 最后修改时间:2012.2.24 增加了汇总信息的自定义控制属性,参见功能描述12 * 2012.2.23 修改了过多列时父标题不显示的问题,重新写了算法,修改了标题头重叠及不能换行的问题,参见说明11. * 2012-1-19 增加第10条所示的功能;修改了列头超过26列的错误,导出excel为数组方式,速度更快,导出的单元格设置为文本格式。 * 标 题:用户自定义的DataGridView控件 * 功能描述:扩展DataGridView控件功能 * 扩展功能: * 1、搜索Search(); 有两个同明方法,参数不同 F3为快捷键继续向下搜索 * 2、用TreeView HeadSource 来设置复杂的标题样式,如果某个节点对应的显示列隐藏,请将该节点Tag设置为hide,隐藏列的排列位置与绑定数据元列位置对应,树叶节点的顺序需要与结果集的列顺序一致 * 3、通过反射导出Excel,无需引用com组件,方法ExportExcel() ,不受列数的限制,表头同样可以导出,AutoFit属性设置导出excel后是否自动调整单元格宽度 * 导出内容支持自定义的:Title List Header List Footer,支持在设计时值的设定,窗口关闭时Excel资源自动彻底释放 * 4、可以自己任意设定那些列显示及不显示,通过调用方法SetColumnVisible()实现。 * 5、设置列标题SetHeader(),设置列永远可见AlwaysShowCols(),设置列暂时不可见HideCols() * 注意,当使用了TreeView作为复杂Header时,不要使用本方法,Header显示的内容根据treeview内容而显示 * 6、列宽度及顺序的保存SaveGridView(),加载LoadGridView() * 7、支持所见即所得的打印功能,举例如下 * private void button5_Click(object sender, EventArgs e) { DGVPrinter printer = new DGVPrinter(); printer.PrintPreviewDataGridView(DataGridViewEx1); } * 8、自定义合并行与列,行合并用 MergeRowColumn 属性,列合并用MergeColumnNames属性,都可以定义多个列 * 9、行标号的设置 bool ShowRowNumber; * 10、增加最后一行的汇总行,支持列的聚合函数,参见http://msdn.microsoft.com/zh-cn/library/system.data.datacolumn.[removed]v=VS.100).aspx * 假设对id列显示“合计”字符,avgPrice进行平均值,total列显示合计,则对ComputeColumns属性增加三行内容:id,合计:;avgPrice,Avg(avgPrice);total,Sum(total) * 如果需要对值进行格式控制,请实现beforeShow事件 * 增加了导出和打印对应的支持,所见即所得的对齐方应用于式导出及打印。 * 11、列标题头自动换行,默认设置为每个列标题头行高为22,如果设置的字体更大,将自动进行计算。如果需要多行显示,请根据需要调节ColumnHeaderHeight属性值, * 其估算方法为预计的标题头层数乘以22,或层数乘以设置的字体高度。 * 12、针对第10条功能,增加汇总信息的自定义控制属性,汇总字体SummaryFont,汇总字体颜色SummaryFontColor,汇总背景色SummaryBGColor,边框与整个表格边框一致 ****************************************************************************************************/
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值