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自动生成工具的用法

 

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

生成的代码如下:

自动生成的代码

posted on 2006-09-03 09:40  舒密  阅读(8160)  评论(17编辑  收藏  举报

导航