好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

应用反射技术为Infragistics Solution设计例子程序 代码简洁而且学习的效率高

应用反射技术为Infragistics Solution设计例子程序 代码简洁而且学习的效率高

公司的ERP系统是采用Infragistics的控件,这个系列的组件非常庞大,功能很多。在学习的过程中,经常需要查找它的Sample来了解它的属性,经过一段时间的研究,就想到把它的Sample重新组织一下以方便学习。有些Sample是VB写的,只熟悉C#程序,VB可以看懂但不能用于编程开发,于是就用VB Converter转换为C#代码

点击Convert Anywan进行转换,转换正确率达99%,遇到索引(index)转换需要手工修改,比如C#中DataRow drow[“CustomerId”] 这样引用列,转换后是的结果是drow(“CustomerId”)。

于是乎,三下五除二就把它的例子程序转移到了C#的解决方案中,形成我的Infragistics Solution。

这样集中学习它的例子,下次忘记了查阅这个解决方案文件和记得笔记代码,效果不错。

有一个地方还需要改善一下,Infragistics 公司提供的NetAdvatange Sample是一个个独立的解决方案文件。这在安装程序,维护版权方面是很有用的,但是不利于学习研究。它的每一个Sample中都有这样的代码

[STAThread]
 static   void  Main() 
{
     Application.Run( new  Form1());
}

Form1看起来并不刺眼,通常在Sample程序中,这表示是没有任何修改的通过Visual Studio模板生成的窗体。

比较麻烦的是,经过我的合并与添加,最后形成这样一个文件佳结构,以UltraGrid为例子

Intermediate Tutorial2中还有更多的例子,如果要写代码调用它们,可能要写很多个new Form1的代码,而且要经常修改启动窗体,这样显然不合理,有些麻烦。在熟练应用了反射技术后,自然就想到了动态生成类型与调用。

添加一个MainForm作为启动窗体,添加treeView控件,以显示Sample中的Form,在Form_Load中增加代码

 private   void  InfragisticsSolutionForm_Load( object  sender, EventArgs e)
{
     Assembly assembly = Assembly.GetExecutingAssembly();
     TreeNode root = tree.Nodes.Add( "Infragistics Solution" );
      foreach  (Type type  in  assembly.GetTypes())
     {
            TreeNode node= root.Nodes.Add(type.FullName);
             node.Tag = type;
      }
      root.ExpandAll();
}

这样就把这个解决方案中的Form都添加到了窗体树中,生成的窗体效果如下图所示

再来设计启动Sample窗体的代码,在treeView的MouseDoubleClick和Call按钮的点击事件中调用如下的代码

 if  (tree.SelectedNode.Tag !=  null  )
{
      Type type = tree.SelectedNode.Tag  as  Type;             
      Form frm = Activator.CreateInstance(type)  as  Form;
       if  (frm !=  null )
      {
           frm.Show( this );
      }
}

这样就轻松的完成了Sample窗体的启动。还有一个地方值得改善,每次点击Call 按钮之后,都会new窗体,这会消耗大量的内存,Form没有显示在用户界面中,并不表示它已经从内存中被GC当成垃圾回收,经过改良后的代码如下

 if  (tree.SelectedNode.Tag !=  null  )
{
        Type type = tree.SelectedNode.Tag  as  Type;
        Form frm=Application.OpenForms[type.Name];
         if  (frm !=  null )
        {
              if (!frm.Visible)
                 frm.Show( this );
              return ;
        }
        frm = Activator.CreateInstance(type)  as  Form;
         if  (frm !=  null )
        {
            frm.Show( this );
        }
}

先从Application.OpenForms查找已经开启的窗体,如果有就把它显示出来。这个代码有个问题,type.Name为Form1,如果其它的窗体也叫这个名字Form1,尽管他们在不同的命名空间中。这样,其它的Form1名称的窗体都无法打开,如果改进type.FullName,则frm每次都是null,像这样修改过之后

Form frm=Application.OpenForms[type.FullName];

即使窗体已经显示出来了,frm的值也是null。查找MSDN文档,Name定义就是取自InitializeComponent

 private   void  InitializeComponent()
{
      this .Name =  "Form1" ;
}

这种缓存的办法是失效的,无法达到节约内存的目的。 经过数次的调整与修改,最后的代码如下

  if  (tree.SelectedNode.Tag !=  null  )
 {
          Type type = tree.SelectedNode.Tag  as  Type;
          Form frm =  null ;
           if  (_types.Contains(type))
          {               
                 foreach  (Form t  in  _forms)
                {
                     if  (t.GetType().FullName.Equals(type.FullName))
                    {
                          frm = t;
                           break ;
                    }
                }
                 if (frm.IsDisposed)
                    frm = Activator.CreateInstance(type)  as  Form;
                 if  (!frm.Visible)
                    frm.Show( this );
                  
                return ;
         }

         frm = Activator.CreateInstance(type)  as  Form;
          if  (frm !=  null )
         {
             frm.Show( this );
             _types.Add(type);
             _forms.Add(frm);
          }
}

两个集合分别用来存放缓存的对象和实例子,定义如下

List<Form> _forms;
List<Type> _types;      

希望能对你有帮助。

           

e-Solution

Intelligent Enterprise Solution

总结一下ERP .NET程序员必须掌握的.NET技术,掌握了这些技术工作起来才得心应手

 

posted @  2011-12-31 09:05  James Li 阅读(2670) |  评论 (27)   编辑

 

应用反射技术为Infragistics Solution设计例子程序 代码简洁而且学习的效率高

 

posted @  2011-12-29 09:45  James Li 阅读(205) |  评论 (0)   编辑

 

Linq to LLBL Gen Pro LLBL Gen的Linq程序设计

 

posted @  2011-12-28 09:14  James Li 阅读(827) |  评论 (1)   编辑

 

LLBL Gen 元数据编程 LLBL Gen Meta-data Programming

 

posted @  2011-12-27 09:30  James Li 阅读(637) |  评论 (0)   编辑

 

ORM + .NET Remoting 完整例子程序 虽然现在都流行WCF,也没有必要抛弃已经掌握的.NET Remoting

 

posted @  2011-12-26 09:04  James Li 阅读(1487) |  评论 (1)   编辑

作者: Leo_wl

    

出处: http://www.cnblogs.com/Leo_wl/

    

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

版权信息

查看更多关于应用反射技术为Infragistics Solution设计例子程序 代码简洁而且学习的效率高的详细内容...

  阅读:47次