在.NET上如何根据字符串动态创建控件

康盛红木

康盛红木

2016-01-29 13:33

在.NET上如何根据字符串动态创建控件,在.NET上如何根据字符串动态创建控件

在.Net上用字符串动态创建控件是通过反射来实现。

首先,利用System.Type.GetType方法,获得字符串中指定的控件的类型实例。

这里需要注意这个字符串的语法,根据msdn的解释:

按名称和签名隐藏会考虑签名的所有部分,包括自定义修饰符、返回类型、参数类型、标记和非托管调用约定。这是二进制比较。 对于反射,属性和事件按名称和签名隐藏。如果基类中有同时带 get 访问器和 set 访问器的属性,但派生类中仅有 get 访问器,则派生类属性隐藏基类属性,并且您将无法访问基类的设置程序。 自定义特性不是通用类型系统的组成部分。

不对数组或 COM 类型执行搜索,除非已将它们加载到可用类表中。

typeName 可以是简单的类型名、包含命名空间的类型名,或是包含程序集名称规范的复杂名称。

(本文来源于图老师网站,更多请访问http://m.tulaoshi.com)

如果 typeName 只包含 Type 的名称,则此方法先是在调用对象的程序集中进行搜索,然后在 mscorlib.dll 程序集中进行搜索。如果 typeName 用部分或完整的程序集名称完全限定,则此方法在指定的程序集中进行搜索。

AssemblyQualifiedName 可以返回完全限定的类型名称(包含嵌套类型和程序集名称)。所有支持公共语言运行库的编译器将发出嵌套类的简单名称,并且当被查询时,反射依照下列约定构造一个 mangled 名称。

例如,类的完全限定名可能类似于如下形式:

TopNamespace.SubNameSpace.ContainingClass+NestedClass,MyAssembly

但是直接使用Type.GetType("System.Windows.Forms.TextBox")获得Type是Null。这是因为,Windows.Forms程序集是公有的程序集,是位于程序集缓存中的,而这个程序集有不同的版本,为了确定使用的版本,我们不仅要提供程序集的名称,还要提供程序集的版本和强名称。照这个思路,在使用的.net Framework 1.1上,将这一句写成Type.GetType("System.Windows.Forms.CheckBox, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089")。现在运行就没有问题了。问题是我们如何取得所用Windows.Forms程序集的版本和强名称?可以用GetType(CheckBox).AssemblyQualifiedName这样的语法,一旦得到了这些信息,我们就可以将这些信息用于其它任何控件,因为他们都来自于同一个版本Windows.Forms程序集。

利用上面说到的方法,现在就可以使用System.Activator.CreateInstance方法来创建一个TextBox控件了:

(本文来源于图老师网站,更多请访问http://m.tulaoshi.com)

public static void CreateControl(string controlType, Form form, int positionX, int positionY)
  {
   try
   { 
    string assemblyQualifiedName =  typeof(System.Windows.Forms.Form).AssemblyQualifiedName;
    string assemblyInformation = assemblyQualifiedName.Substring(assemblyQualifiedName.IndexOf(","));
    Type ty = Type.GetType(controlType + assemblyInformation);
    Control newControl = (Control)System.Activator.CreateInstance(ty);
    form.SuspendLayout();
    newControl.Location = new System.Drawing.Point(positionX, positionY);
    newControl.Name = ty.Name + form.Controls.Count.ToString();
    form.Controls.Add(newControl);
    form.ResumeLayout();
   }
   catch(Exception ex)
   {
    throw ex;
   }
  }

调用: CreateControl("System.Windows.Forms.TextBox", this, 10, 10);

展开更多 50%)
分享

猜你喜欢

在.NET上如何根据字符串动态创建控件

电脑网络
在.NET上如何根据字符串动态创建控件

字符串分割

编程语言 网络编程
字符串分割

s8lol主宰符文怎么配

英雄联盟 网络游戏
s8lol主宰符文怎么配

通过字符串,类的引用,创建窗体

编程语言 网络编程
通过字符串,类的引用,创建窗体

SQL中自己创建函数,分割字符串

编程语言 网络编程
SQL中自己创建函数,分割字符串

lol偷钱流符文搭配推荐

英雄联盟 网络游戏
lol偷钱流符文搭配推荐

字符串格式定义

电脑入门
字符串格式定义

ORACLE 截断字符串

编程语言 网络编程
ORACLE 截断字符串

lolAD刺客新符文搭配推荐

英雄联盟
lolAD刺客新符文搭配推荐

PHP安全配置(4)

PHP安全配置(4)

实现HtmlButton客户端控制网页提交

实现HtmlButton客户端控制网页提交
下拉加载更多内容 ↓