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

相关文章

基于Python编写一个git自动上传的脚本(打包成exe)

《基于Python编写一个git自动上传的脚本(打包成exe)》这篇文章主要为大家详细介绍了如何基于Python编写一个git自动上传的脚本并打包成exe,文中的示例代码讲解详细,感兴趣的小伙伴可以跟... 目录前言效果如下源码实现利用pyinstaller打包成exe利用ResourceHacker修改e

基于C++的UDP网络通信系统设计与实现详解

《基于C++的UDP网络通信系统设计与实现详解》在网络编程领域,UDP作为一种无连接的传输层协议,以其高效、低延迟的特性在实时性要求高的应用场景中占据重要地位,下面我们就来看看如何从零开始构建一个完整... 目录前言一、UDP服务器UdpServer.hpp1.1 基本框架设计1.2 初始化函数Init详解

SpringBoot全局异常拦截与自定义错误页面实现过程解读

《SpringBoot全局异常拦截与自定义错误页面实现过程解读》本文介绍了SpringBoot中全局异常拦截与自定义错误页面的实现方法,包括异常的分类、SpringBoot默认异常处理机制、全局异常拦... 目录一、引言二、Spring Boot异常处理基础2.1 异常的分类2.2 Spring Boot默

JAVA Calendar设置上个月时,日期不存在或错误提示问题及解决

《JAVACalendar设置上个月时,日期不存在或错误提示问题及解决》在使用Java的Calendar类设置上个月的日期时,如果遇到不存在的日期(如4月31日),默认会自动调整到下个月的相应日期(... 目录Java Calendar设置上个月时,日期不存在或错误提示java进行日期计算时如果出现不存在的

Mybatis对MySQL if 函数的不支持问题解读

《Mybatis对MySQLif函数的不支持问题解读》接手项目后,为了实现多租户功能,引入了Mybatis-plus,发现之前运行正常的SQL语句报错,原因是Mybatis不支持MySQL的if函... 目录MyBATis对mysql if 函数的不支持问题描述经过查询网上搜索资料找到原因解决方案总结Myb

Nginx错误拦截转发 error_page的问题解决

《Nginx错误拦截转发error_page的问题解决》Nginx通过配置错误页面和请求处理机制,可以在请求失败时展示自定义错误页面,提升用户体验,下面就来介绍一下Nginx错误拦截转发error_... 目录1. 准备自定义错误页面2. 配置 Nginx 错误页面基础配置示例:3. 关键配置说明4. 生效

Java利用Spire.XLS for Java自动化设置Excel的文档属性

《Java利用Spire.XLSforJava自动化设置Excel的文档属性》一个专业的Excel文件,其文档属性往往能大大提升文件的可管理性和可检索性,下面我们就来看看Java如何使用Spire... 目录Spire.XLS for Java 库介绍与安装Java 设置内置的 Excel 文档属性Java

使用Python将PDF表格自动提取并写入Word文档表格

《使用Python将PDF表格自动提取并写入Word文档表格》在实际办公与数据处理场景中,PDF文件里的表格往往无法直接复制到Word中,本文将介绍如何使用Python从PDF文件中提取表格数据,并将... 目录引言1. 加载 PDF 文件并准备 Word 文档2. 提取 PDF 表格并创建 Word 表格

HTML5的input标签的`type`属性值详解和代码示例

《HTML5的input标签的`type`属性值详解和代码示例》HTML5的`input`标签提供了多种`type`属性值,用于创建不同类型的输入控件,满足用户输入的多样化需求,从文本输入、密码输入、... 目录一、引言二、文本类输入类型2.1 text2.2 password2.3 textarea(严格

input的accept属性让文件上传安全高效

《input的accept属性让文件上传安全高效》文章介绍了HTML的input文件上传`accept`属性在文件上传校验中的重要性和优势,通过使用`accept`属性,可以减少前端JavaScrip... 目录前言那个悄悄毁掉你上传体验的“常见写法”改变一切的 html 小特性:accept真正的魔法:让