博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
应用反射技术为Infragistics Solution设计例子程序 代码简洁而且学习的效率高
阅读量:7045 次
发布时间:2019-06-28

本文共 3375 字,大约阅读时间需要 11 分钟。

  hot3.png

公司的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
 _forms;List
 _types;

希望能对你有帮助。

转载于:https://my.oschina.net/iwenr/blog/261037

你可能感兴趣的文章
sql 基础练习 计算7天各个时间点的总和 group by order mysql一次查询多个表
查看>>
MySQL高级-索引优化
查看>>
SQL中Group By的使用
查看>>
RateLimiter 限流
查看>>
资深设计师Tony Ventrice解析手机游戏开发的四个层次
查看>>
Swift入门篇-结构体
查看>>
Using the Eclipse Jobs-API(转载)
查看>>
GCC编译过程
查看>>
AE intersect、clip的实现
查看>>
图解使用Win8Api进行Metro风格的程序开发一----建立我们的导航架构
查看>>
iOS开发过程中使用Core Data应避免的十个错误
查看>>
I.MX6 wpa_cli 使用
查看>>
windows使用nginx实现网站负载均衡测试实例
查看>>
DotLiquid模板引擎简介
查看>>
5.Flask-Migrate
查看>>
c# 正则表代式的分组和批评模式 .
查看>>
编程之美-3.1-字符串移位包含的问题
查看>>
EPC是什么
查看>>
T-SQL查询进阶--数据集之间的运算
查看>>
【Vegas原创】Linux下unrar安装与配置
查看>>