`
tubaluer
  • 浏览: 1435669 次
文章分类
社区版块
存档分类
最新评论
  • sblig: c / c++ 是不一样的都会输出 100
    j = j++

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

 
阅读更多

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

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

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

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

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

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

如果 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控件了:

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);

分享到:
评论

相关推荐

    ASP.NET 控件的使用

    9.1.3 在Web配置文件中保存连接字符串 258 9.1.4 对连接字符串加密 260 9.2 执行数据库命令 261 9.2.1 执行内联SQL语句 261 9.2.2 执行存储过程 263 9.2.3 过滤数据库行 264 9.2.4 改变数据源模型 266 9.2.5 处理SQL...

    ASP.NET.4揭秘

    9.1.3 在web配置文件中保存连接字符串293 9.1.4 对连接字符串加密294 9.2 执行数据库命令296 9.2.1 执行内联sql语句296 9.2.2 执行存储过程298 9.2.3 过滤数据库行300 9.2.4 改变数据源模型302 9.2.5 处理sql命令...

    asp.net知识库

    .NET 2.0中的字符串比较 小试ASP.NET 2.0的兼容性 为 asp.net 2.0 的菜单控件增加 target 属性 ASP.NET 2.0 的内部变化 常见的 ASP.NET 2.0 转换问题和解决方案 Asp.Net2.0无刷新客户端回调 体验.net 2.0 的优雅(1...

    asp.net技术内幕(1)

    2.2.1 将表单提交到另一个页面 2.2.2 使用Redirect( )方法 2.2.3 使用HyperLink控件 2.3 在控件上进行格式化 2.3.1 基本Web控件属性 2.3.2 在Web控件上应用样式 2.4 小结 <br>第3章...

    ASP.NET 3.5 开发大全

    12.1.4 将CSS应用在控件上 12.1.5 主题和皮肤 12.1.6 页面主题和全局主题 12.1.7 应用和禁用主题 12.1.8 用编程的方法控制主题 12.2 母版页 12.2.1 母版页基础 12.2.2 内容窗体 12.2.3 母版页的运行方法 12.2.4 嵌套...

    asp.net专家疑难解答200问

    如何在页面中动态创建控件 65.如何为HTML服务器控件的事件添加自定义方法 第4章 验证控件 67.如何使用RequiredFieldValidator控件验证用户是否输入信息 68.如何使用RegularExpressionValidator控件...

    ASP.NET3.5从入门到精通

    12.1.4 将CSS 应用在控件上 12.1.5 主题和皮肤 12.1.6 页面主题和全局主题 12.1.7 应用和禁用主题 12.1.8 用编程的方法控制主题 12.2 母版页 12.2.1 母版页基础 12.2.2 内容窗体 12.2.3 母版页的运行方法 12.2.4 ...

    ASP.NET 3.5 开发大全word课件

    12.1.4 将CSS应用在控件上 12.1.5 主题和皮肤 12.1.6 页面主题和全局主题 12.1.7 应用和禁用主题 12.1.8 用编程的方法控制主题 12.2 母版页 12.2.1 母版页基础 12.2.2 内容窗体 12.2.3 母版页的运行方法 12.2.4 嵌套...

    ASP.net技术内幕

    2.3 在控件上进行格式化 2.3.1 基本Web控件属性 2.3.2 在Web控件上应用样式 2.4 小结 <br/>第3章 用检验控件执行表单的检验 <br/>3.1 使用客户端检验 3.1.1 配置客户端检验 ...

    asp.net教学讲义

    5.13 利用查询字符串传递数据 92 5.14 利用隐藏的窗体字段传递数据 92 5.14 变量的作用域 93 第六章:站点设计 94 6.1 ASP.NET应用程序文件夹 94 6.2 母版页 96 6.2.1 母版页基础知识 96 6.2.2母版页运行机制 98 ...

    ASP.NET 3.5 开发大全11-15

    12.1.4 将CSS应用在控件上 12.1.5 主题和皮肤 12.1.6 页面主题和全局主题 12.1.7 应用和禁用主题 12.1.8 用编程的方法控制主题 12.2 母版页 12.2.1 母版页基础 12.2.2 内容窗体 12.2.3 母版页的运行方法 12.2.4 嵌套...

    ASP.NET 3.5 开发大全1-5

    12.1.4 将CSS应用在控件上 12.1.5 主题和皮肤 12.1.6 页面主题和全局主题 12.1.7 应用和禁用主题 12.1.8 用编程的方法控制主题 12.2 母版页 12.2.1 母版页基础 12.2.2 内容窗体 12.2.3 母版页的运行方法 12.2.4 嵌套...

    ASP.NET Night Words

    21.1.2 字符串连接优化 410 21.1.3 类型转换优化 413 21.1.4 使用server.transfer()方法 414 21.1.5 避免不必要的服务器往返 414 21.1.6 尽早释放对象 415 21.1.7 尽量减少服务器控件的使用 415 21.2 数据操作...

    ASP.NET4高级程序设计(第4版) 3/3

    书中还深入讲述了其他ASP.NET图书遗漏的高级主题,如自定义控件的创建、图像处理、加密等。此外,《ASP.NET 4高级程序设计(第4版)》专门提供了两章的内容来教你如何用Ajax 技术制作快速响应的页面,以及如何使用微软...

    ASP.NET4高级程序设计第4版 带目录PDF 分卷压缩包 part1

    书中还深入讲述了其他ASP.NET图书遗漏的高级主题,如自定义控件的创建、图像处理、加密等。此外,《ASP.NET 4高级程序设计(第4版)》专门提供了两章的内容来教你如何用Ajax 技术制作快速响应的页面,以及如何使用微软...

    .net50个常用方法简单华丽的分页控件功能大的分页控件 50个实用方法

    ///StringEdit()给出指定字符串长度多少位后用点显示... ///StringReplaceSpace()替换文本中的空格和换行 ///StringColor()改变字的颜色 ///StringNull()当对象是空的时候 转为空字符串 ///String...

    spring.net中文手册在线版

    16.1.3.管理连接字符串 第十七章. 使用ADO.NET进行数据访问 17.1.简介 17.2.动机 17.3.Provider抽象 17.3.1.创建IDbProvider类型的实例 17.4.命名空间 17.5.数据访问的方式 17.6.AdoTemplate简介 17.6.1.执行回调 ...

    ASP.NET 2.0+SQL Server 2005全程指南-源代码

    5.4.2 配置数据库链接字符串 5.4.3 添加自定义Web.Config文件配置节 5.4.4 对Web.Config文件进行读写操作 5.4.5 加密和解密Web.Config文件的配置节 5.4.6 ASP.NET网站管理工具 5.4.7 ASP.NET MMC管理单元 5.5...

Global site tag (gtag.js) - Google Analytics