UserControl 中包含封装了集合对象的属性被设计器自动初始化所引起的错误!也有关于List的问题

本文主要是介绍UserControl 中包含封装了集合对象的属性被设计器自动初始化所引起的错误!也有关于List的问题,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

在CSDN上看到了一篇关于UserControl引起的问题,去重现了一下,并进行了一些小结。

 

自定义 UserControl 中包含封装了 List <接口> 类型字段的属性,编译后造成引用了该 UserControl 的窗体设计器无法显示!

 

    public partial class UserControl1 : UserControl
    {
        private List<Student> face;

        //[Bindable(false), Browsable(false)]
        //[DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]        
        public List<Student> Face
        {
            get            {                return face;            }
            set            {                face = value;            }
        }

        public UserControl1()
        {
            InitializeComponent();

            face = new List<Student>();
        }
    }

    //[Serializable]
    public class Student
    {

       //此处为了简化,不加任何的变量和属性
        void Update()      {//此处为空     }
    }

}

 

在这个UserControl上随便放些东西,为了简化问题,我在这上面放了几个Label标签,以可以在Form中看到这个UserControl。

然后把这个编译生成的UserControl拖放到Form当中,编译,弹出:

创建组件"UserControl1"失败。错误消息为:(此处只摘取有用信息,仅取了第一行的提示信息)

“System.Runtime.Serialization.SerializationException :程序集"WindowsApplication5,Version 1.0.0.0,  Culture = neutral, PublicKeyToken = null "中的类型 “WindowsApplication5.Student”未标记为可序列化”

同时还会弹出另一个错误对话框,如下提示:

属性“Face”的代码生成失败。错误是:“程序集“WindowsApplication5,Version 1.0.0.0, Culture = neutral, PublicKeyToken = null  ”中的类型“WindowsApplication5.Student”未标记为可序列化。”

 

关闭弹出的对话框后,发现form1上并没有显示UserContro,但到form1的InitializeComponent()代码中,又发现有UserControl的添加代码。

 

到form1的resx中去看,没有任何的资源显示。

处理办法:

1.既然通过提示,我们看到了WindowsApplication5.Student未标记为可序列化,查了一下网上的资料,去把这个Student序列化,很简单,在Public Class Student上面加入一句[Serializable]。即可。

然后再进行编译,结果又出现错误提示:

 

错误 1 无效的 Resx 文件。未能加载 .RESX 文件中使用的类型 System.Collections.Generic.List`1[[WindowsApplication5.Student, WindowsApplication5, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]], mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089。请确保已在项目中添加了必要的引用。 行 130,位置 5。 C:/Documents and Settings/sn00590/My Documents/Visual Studio 2005/Projects/WindowsApplication5/WindowsApplication5/Form1.resx 130 5 WindowsApplication5。

这个错误是在Form1.resx中出现的,在解决方案中去找到这个文件,打开一下,其中有userControl1.Face 这个资源条目,而其的类型和值均为 (Nothing/null),而这就是导致窗体设计器无法显示的原因,删除这条资源和 InitializeComponent() 中 userControl1.Face 的赋值语句,窗体设计器可以正常打开了,但问题是一但修改了窗体的内容,再次编译时,Face 属性又会被重新赋值,这个资源引用也仍会被加入!
    实际上,经过测试发现,自定义 UserControl 中所有封装了集合对象的属性都会被设计器自动初始化,比如:string[],只不过其不会影响设计器的行为。不知 MS 为什么要这样设计,感觉是帮了倒忙,很是让人费解。

经测试发现,在拖放自定义控件时到窗体时, 实际上该自定义控件会被实例化一次。。 同时都会去调用一下它下面的属性,但并不执行它。

有时也会弹出这个问题,与无效的Resx文件,是相同的问题。
类型“WindowsApplication130.Student[]”的对象无法转换为类型“WindowsApplication130.Student[]”。 这句话可以让很多人疯掉,因为它是相同的类型转相同的类型 ,怎么无法进行转换呢。然后到Form1的InitializeComponent()中删除掉控件相关的,并到Form1.resx中删除掉那一行类型和值均为(Nothing/null)。并在属性上加入以下两句,然后再把那个控件拖上来,即可。

解决办法是:在属性上加入以下两句。
        [Bindable(false), Browsable(false)]
        [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]        

 

老实说,上面这几个问题很折磨人的,在网上搜了搜,或许是用的关键字不对,没搜到些什么东西。而且项目又紧,只有一发狠,花了些时间来研究它,写在这,希望能帮助遇到相同问题的朋友。

这篇关于UserControl 中包含封装了集合对象的属性被设计器自动初始化所引起的错误!也有关于List的问题的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


原文地址:
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.chinasem.cn/article/602285

相关文章

Java中的数组与集合基本用法详解

《Java中的数组与集合基本用法详解》本文介绍了Java数组和集合框架的基础知识,数组部分涵盖了一维、二维及多维数组的声明、初始化、访问与遍历方法,以及Arrays类的常用操作,对Java数组与集合相... 目录一、Java数组基础1.1 数组结构概述1.2 一维数组1.2.1 声明与初始化1.2.2 访问

SpringBoot+Docker+Graylog 如何让错误自动报警

《SpringBoot+Docker+Graylog如何让错误自动报警》SpringBoot默认使用SLF4J与Logback,支持多日志级别和配置方式,可输出到控制台、文件及远程服务器,集成ELK... 目录01 Spring Boot 默认日志框架解析02 Spring Boot 日志级别详解03 Sp

C# 比较两个list 之间元素差异的常用方法

《C#比较两个list之间元素差异的常用方法》:本文主要介绍C#比较两个list之间元素差异,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录1. 使用Except方法2. 使用Except的逆操作3. 使用LINQ的Join,GroupJoin

怎样通过分析GC日志来定位Java进程的内存问题

《怎样通过分析GC日志来定位Java进程的内存问题》:本文主要介绍怎样通过分析GC日志来定位Java进程的内存问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、GC 日志基础配置1. 启用详细 GC 日志2. 不同收集器的日志格式二、关键指标与分析维度1.

Python实现对阿里云OSS对象存储的操作详解

《Python实现对阿里云OSS对象存储的操作详解》这篇文章主要为大家详细介绍了Python实现对阿里云OSS对象存储的操作相关知识,包括连接,上传,下载,列举等功能,感兴趣的小伙伴可以了解下... 目录一、直接使用代码二、详细使用1. 环境准备2. 初始化配置3. bucket配置创建4. 文件上传到os

Java 线程安全与 volatile与单例模式问题及解决方案

《Java线程安全与volatile与单例模式问题及解决方案》文章主要讲解线程安全问题的五个成因(调度随机、变量修改、非原子操作、内存可见性、指令重排序)及解决方案,强调使用volatile关键字... 目录什么是线程安全线程安全问题的产生与解决方案线程的调度是随机的多个线程对同一个变量进行修改线程的修改操

关于集合与数组转换实现方法

《关于集合与数组转换实现方法》:本文主要介绍关于集合与数组转换实现方法,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、Arrays.asList()1.1、方法作用1.2、内部实现1.3、修改元素的影响1.4、注意事项2、list.toArray()2.1、方

Redis出现中文乱码的问题及解决

《Redis出现中文乱码的问题及解决》:本文主要介绍Redis出现中文乱码的问题及解决,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1. 问题的产生2China编程. 问题的解决redihttp://www.chinasem.cns数据进制问题的解决中文乱码问题解决总结

python删除xml中的w:ascii属性的步骤

《python删除xml中的w:ascii属性的步骤》使用xml.etree.ElementTree删除WordXML中w:ascii属性,需注册命名空间并定位rFonts元素,通过del操作删除属... 可以使用python的XML.etree.ElementTree模块通过以下步骤删除XML中的w:as

浏览器插件cursor实现自动注册、续杯的详细过程

《浏览器插件cursor实现自动注册、续杯的详细过程》Cursor简易注册助手脚本通过自动化邮箱填写和验证码获取流程,大大简化了Cursor的注册过程,它不仅提高了注册效率,还通过友好的用户界面和详细... 目录前言功能概述使用方法安装脚本使用流程邮箱输入页面验证码页面实战演示技术实现核心功能实现1. 随机