WINFORM怎么样动态加载控件比较快

daigua1987 2021-05-10 11:47:57
除了靠new 把控件一个一个的new出来,还有什么其他办法比较快的
...全文
1894 点赞 收藏 27
写回复
27 条回复
yangniao 05月15日
异步加载可能会好一点
回复 点赞
wang_peng 05月12日
 
 
 public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

   private void Form1_Load(object sender, EventArgs e)
        {

            Button btn = ReflectionHelper.CreateControl<Button>();
  }
 }

  /// 反射帮助类
    /// </summary>
    public static class ReflectionHelper
    {
        public static T CreateControl<T>()
        {
            Type o = typeof(T);
            object obj = Activator.CreateInstance(o, true);//根据类型创建实例
            return (T)obj;//类型转换并返回
        }

        /// <summary>
        /// 创建对象实例
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="fullName">命名空间.类型名</param>
        /// <param name="assemblyName">程序集</param>
        /// <returns></returns>
        public static T CreateInstance<T>(string fullName, string assemblyName)
        {
            string path = fullName + "," + assemblyName;//命名空间.类型名,程序集
            Type o = Type.GetType(path);//加载类型
            object obj = Activator.CreateInstance(o, true);//根据类型创建实例
            return (T)obj;//类型转换并返回
        }

        /// <summary>
        /// 创建对象实例
        /// </summary>
        /// <typeparam name="T">要创建对象的类型</typeparam>
        /// <param name="assemblyName">类型所在程序集名称</param>
        /// <param name="nameSpace">类型所在命名空间</param>
        /// <param name="className">类型名</param>
        /// <returns></returns>
        public static T CreateInstance<T>(string assemblyName, string nameSpace, string className)
        {
            try
            {
                string fullName = nameSpace + "." + className;//命名空间.类型名
                //此为第一种写法
                object ect = Assembly.Load(assemblyName).CreateInstance(fullName);//加载程序集,创建程序集里面的 命名空间.类型名 实例
                return (T)ect;//类型转换并返回 
            }
            catch
            {
                //发生异常,返回类型的默认值
                return default(T);
            }
        }
    }
回复 点赞
daigua1987 05月12日
引用 21 楼 wang_peng 的回复:
[quote=引用 19 楼 daigua1987 的回复:][quote=引用 16 楼 wang_peng 的回复:][quote=引用 12 楼 daigua1987 的回复:][quote=引用 9 楼 wang_peng 的回复:]就论速度. new 是最快的. 返映射最慢, mvc 其次, 这个以前有很多文章都论证过. mvc的返映射可以勉强达到new的效果, 再加上动态的需求, 就用mvc返隐射那套机制吧.
除了主页面 大部分的页面都是动态的,这样的要求是不是MVC的架构 比较合适,我就想着弄个两层架构就行了,刚刚接触C#不到一个星期呢[/quote] 才用一周,那就老老实实的new吧, 可读性强, 你这动态取,看似挺厉害,等你过几个月,自己都蒙逼.[/quote] 只是测试代码,后面在数据字典表里面设置控件的类型及其他信息 [/quote] 要只是测试一下,不是用在生产,那就用返映射吧,通过全名,或者类型,都能返映射出来[/quote] 有返映射的案例地址吗?我没找到
回复 点赞
wang_peng 05月12日
引用 19 楼 daigua1987 的回复:
[quote=引用 16 楼 wang_peng 的回复:][quote=引用 12 楼 daigua1987 的回复:][quote=引用 9 楼 wang_peng 的回复:]就论速度. new 是最快的. 返映射最慢, mvc 其次, 这个以前有很多文章都论证过. mvc的返映射可以勉强达到new的效果, 再加上动态的需求, 就用mvc返隐射那套机制吧.
除了主页面 大部分的页面都是动态的,这样的要求是不是MVC的架构 比较合适,我就想着弄个两层架构就行了,刚刚接触C#不到一个星期呢[/quote] 才用一周,那就老老实实的new吧, 可读性强, 你这动态取,看似挺厉害,等你过几个月,自己都蒙逼.[/quote] 只是测试代码,后面在数据字典表里面设置控件的类型及其他信息 [/quote] 要只是测试一下,不是用在生产,那就用返映射吧,通过全名,或者类型,都能返映射出来
回复 点赞
wang_peng 05月12日
引用 10 楼 morliz子轩 的回复:
[quote=引用 9 楼 wang_peng 的回复:]就论速度. new 是最快的. 返映射最慢, mvc 其次, 这个以前有很多文章都论证过. mvc的返映射可以勉强达到new的效果, 再加上动态的需求, 就用mvc返隐射那套机制吧.
我不从干咬文嚼字,引经据典的事情,毫无意义。单单说new 1000个实例,还是通过实体反射,哪个更高效灵活。实际项目开发过程中,哪种实用价值高一些。可想而知[/quote]  new 以外的方法,只能说灵活,高效谈不上, 再说动态创建看似灵活,但代价是可读性,可读性降低就意味着可维护性降低. 无伦怎么创建,最后的本质还是先调用一下稀构函数,再调用一下构造函数,new是最直接的  再说new 1000个实例在单个页面的几率太底,就算有那也是设计有问题.
回复 点赞
qq_36827283 05月12日
引用 楼主 daigua1987 的回复:
除了靠new 把控件一个一个的new出来,还有什么其他办法比较快的
试试
回复 点赞
daigua1987 05月12日
引用 16 楼 wang_peng 的回复:
[quote=引用 12 楼 daigua1987 的回复:][quote=引用 9 楼 wang_peng 的回复:]就论速度. new 是最快的. 返映射最慢, mvc 其次, 这个以前有很多文章都论证过. mvc的返映射可以勉强达到new的效果, 再加上动态的需求, 就用mvc返隐射那套机制吧.
除了主页面 大部分的页面都是动态的,这样的要求是不是MVC的架构 比较合适,我就想着弄个两层架构就行了,刚刚接触C#不到一个星期呢[/quote] 才用一周,那就老老实实的new吧, 可读性强, 你这动态取,看似挺厉害,等你过几个月,自己都蒙逼.[/quote] 只是测试代码,后面在数据字典表里面设置控件的类型及其他信息
回复 点赞
xuzuning 05月12日
善用 ControlPaint
回复 点赞
glb21 05月12日
那最好用wpf框架
回复 点赞
luj_1768 05月12日
引用 17 楼 hhz0525 的回复:
this.controls.add(obj)
是系统调用呢?支持什么系统? 加载控件通常需要使用系统调用,背后的实现各大系统可能不同,我觉得你的代码简洁清楚,值得推荐。
回复 点赞
hhz0525 05月12日
this.controls.add(obj)
回复 点赞
wang_peng 05月11日
引用 12 楼 daigua1987 的回复:
[quote=引用 9 楼 wang_peng 的回复:]就论速度. new 是最快的. 返映射最慢, mvc 其次, 这个以前有很多文章都论证过. mvc的返映射可以勉强达到new的效果, 再加上动态的需求, 就用mvc返隐射那套机制吧.
除了主页面 大部分的页面都是动态的,这样的要求是不是MVC的架构 比较合适,我就想着弄个两层架构就行了,刚刚接触C#不到一个星期呢[/quote] 才用一周,那就老老实实的new吧, 可读性强, 你这动态取,看似挺厉害,等你过几个月,自己都蒙逼.
回复 点赞
morliz子轩 05月11日
嗯,没事。其实两层不叫架构。可以做一些demo方面的测试
回复 点赞
daigua1987 05月11日
引用 13 楼 morliz子轩 的回复:
java都还没C#发展早。这是传统典型的三层式架构方案。 下面是引用:https://bbs.csdn.net/topics/399169479我写的回贴: Java(Controller + Service + Dao): Dao(Data Access Object):数据存储对象 -> Service:服务 -> Controller:控制器 Dao:负责把service交代的东西真正的删掉 Service:负责处理删角色的逻辑,也就是删完角色还要删用户 Controller:接收参数,告诉service层我要删这个角色,并且返回结果 --------------------------------------------------------------------------------- CSharp(UI + BLL + DAL + Model(Entity)): UI表现层 <- BLL业务逻辑层 <- DAL(数据访问层) <- Model(Entity)实体类库 三层架构的体系结构:表示层和业务逻辑层之间用对象模型的实体类对象来传递数据,业务逻辑层和数据访问层之间用对象模型的实体类对象来传递数据,数据访问层通过.NET 提供的 ADO.NET 组件来操作数据库,或者利用 SQLServer 数据库服务器的存储过程来完成数据操作。 这种分层体系结构具有以下四个优点: (1)避免了表示层直接访问数据访问层,表示层只和业务逻辑层有联系,提高了数据安全性。 (2)有利于系统的分散开发,每一个层可以由不同的人员来开发,只要遵循接口标准,利用相同的对象模型实体类就可以了,这样就可以大大提高系统的开发速度。 (3)方便系统的移植,如果要把一个 C/S 的系统变成 B/S 系统,只要修改三层架构的表示层就可以了,业务逻辑层和数据访问层几乎不用修改就可以轻松的把系统移植到网络上。 (4)项目结构更清楚,分工更明确,有利于后期的维护和升级。 在三层架构基础上,还存在于一种混合式架构: UI -> CallerFactory接口应用层 -> Facade接口层 -> WinForm调用层 -> WCF服务层 -> WCF 服务调用层 -> BLL业务层 -> IDAL/DAL 数据访问层 - > Oracle / SqlServer / MySql 等数据库层
谢谢了,我前几天下了一个MVC的架构,看了一下跟你说的差不多,我是边学边开发的,我先弄个两层架构玩玩只有UI,BLL,DATA
回复 点赞
morliz子轩 05月11日
java都还没C#发展早。这是传统典型的三层式架构方案。 下面是引用:https://bbs.csdn.net/topics/399169479我写的回贴: Java(Controller + Service + Dao): Dao(Data Access Object):数据存储对象 -> Service:服务 -> Controller:控制器 Dao:负责把service交代的东西真正的删掉 Service:负责处理删角色的逻辑,也就是删完角色还要删用户 Controller:接收参数,告诉service层我要删这个角色,并且返回结果 --------------------------------------------------------------------------------- CSharp(UI + BLL + DAL + Model(Entity)): UI表现层 <- BLL业务逻辑层 <- DAL(数据访问层) <- Model(Entity)实体类库 三层架构的体系结构:表示层和业务逻辑层之间用对象模型的实体类对象来传递数据,业务逻辑层和数据访问层之间用对象模型的实体类对象来传递数据,数据访问层通过.NET 提供的 ADO.NET 组件来操作数据库,或者利用 SQLServer 数据库服务器的存储过程来完成数据操作。 这种分层体系结构具有以下四个优点: (1)避免了表示层直接访问数据访问层,表示层只和业务逻辑层有联系,提高了数据安全性。 (2)有利于系统的分散开发,每一个层可以由不同的人员来开发,只要遵循接口标准,利用相同的对象模型实体类就可以了,这样就可以大大提高系统的开发速度。 (3)方便系统的移植,如果要把一个 C/S 的系统变成 B/S 系统,只要修改三层架构的表示层就可以了,业务逻辑层和数据访问层几乎不用修改就可以轻松的把系统移植到网络上。 (4)项目结构更清楚,分工更明确,有利于后期的维护和升级。 在三层架构基础上,还存在于一种混合式架构: UI -> CallerFactory接口应用层 -> Facade接口层 -> WinForm调用层 -> WCF服务层 -> WCF 服务调用层 -> BLL业务层 -> IDAL/DAL 数据访问层 - > Oracle / SqlServer / MySql 等数据库层
回复 点赞
daigua1987 05月11日
引用 9 楼 wang_peng 的回复:
就论速度. new 是最快的. 返映射最慢, mvc 其次, 这个以前有很多文章都论证过. mvc的返映射可以勉强达到new的效果, 再加上动态的需求, 就用mvc返隐射那套机制吧.
除了主页面 大部分的页面都是动态的,这样的要求是不是MVC的架构 比较合适,我就想着弄个两层架构就行了,刚刚接触C#不到一个星期呢
回复 点赞
daigua1987 05月11日
引用 8 楼 morliz子轩 的回复:
[quote=引用 7 楼 daigua1987 的回复:] 哦,就是建立一个控件实体类,然后通过get 和 set 获取出来?
是的,但不叫控件实体类,准备的说,是数据表实体。 也就是通常说的,泛型实体。 其集合,就是List<T> 它可以转换成DataTable、或DataRow、DataRowView、DataGridViewCell甚至是BindingList<T>、BindSource(数据源控件)都是非常方便的。 比如讲,加载到ComboBox、TreeView、DataGridView、TabControl、ToolStrip等等,应用非常非常广泛。 就象上面这个sample:部门信息、员工类型。都是两个实体,其映射的就是数据库中的两个表。 所以此时,就需要用到ORM,象我用的最多的是EF codefirst(代码级优先)的ORM框架。写两个实体,通过ORM框架,自然反射到数据库中的两个实体表上。这样做实际的业务逻辑处理,查询、反写数据库(增、删、改、查)都是事半功倍)[/quote] 是不是类似java那种,给每个表做一个实体类,所有数据通过实体类进行操作,然后由实体类连接数据库
回复 点赞
morliz子轩 05月11日
引用 9 楼 wang_peng 的回复:
就论速度. new 是最快的. 返映射最慢, mvc 其次, 这个以前有很多文章都论证过. mvc的返映射可以勉强达到new的效果, 再加上动态的需求, 就用mvc返隐射那套机制吧.
我不从干咬文嚼字,引经据典的事情,毫无意义。单单说new 1000个实例,还是通过实体反射,哪个更高效灵活。实际项目开发过程中,哪种实用价值高一些。可想而知
回复 点赞
wang_peng 05月11日
就论速度. new 是最快的. 返映射最慢, mvc 其次, 这个以前有很多文章都论证过. mvc的返映射可以勉强达到new的效果, 再加上动态的需求, 就用mvc返隐射那套机制吧.
回复 点赞
morliz子轩 05月11日
引用 7 楼 daigua1987 的回复:
哦,就是建立一个控件实体类,然后通过get 和 set 获取出来?
是的,但不叫控件实体类,准备的说,是数据表实体。 也就是通常说的,泛型实体。 其集合,就是List<T> 它可以转换成DataTable、或DataRow、DataRowView、DataGridViewCell甚至是BindingList<T>、BindSource(数据源控件)都是非常方便的。 比如讲,加载到ComboBox、TreeView、DataGridView、TabControl、ToolStrip等等,应用非常非常广泛。 就象上面这个sample:部门信息、员工类型。都是两个实体,其映射的就是数据库中的两个表。 所以此时,就需要用到ORM,象我用的最多的是EF codefirst(代码级优先)的ORM框架。写两个实体,通过ORM框架,自然反射到数据库中的两个实体表上。这样做实际的业务逻辑处理,查询、反写数据库(增、删、改、查)都是事半功倍)
回复 点赞
发动态
发帖子
C#
创建于2007-09-28

8.5w+

社区成员

64.0w+

社区内容

.NET技术 C#
社区公告
暂无公告