UserControl 中包含封装了集合对象的属性被设计器自动初始化所引起的错误!也有关于List的问题
2008-09-23 14:55
459 查看
在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 <接口> 类型字段的属性,编译后造成引用了该 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的问题
- UserControl 中包含封装了集合对象的属性被设计器自动初始化所引起的错误!也有关于List的问题
- 自定义UserControl中包含封装了集合对象的属性被设计器自动初始化所引起的错误
- JSON转换包含Date日期属性的对象的List集合报错问题
- 关于直接比较两个对象是否相等或则说List集合里是否包含某个对象的问题
- List 对象集合的操作和使用 List 集合对象 对象集合 自动属性 对象初始化 集合初始化器
- 基础知识提问:关于HashTable和List两个容器Add改变了属性的同一对象的问题
- 关于前台封装List Map集合的问题
- android 关于使用SharedPreferences来保存对象里既有属性又有集合的问题
- 使用sql server时碰到的错误 关于对象.属性qingjia.id' 无效,因为该列没有包含在聚合函数或 GROUP BY 子句中
- [.NET 3.x新特性一]自动属性,对象初始化及集合初始化
- ###struts模型驱动(必须new)能够封装【对象类型属性的属性】.页面传参错误导致的问题:HTTP Status 500 - could not execute statement;
- [.NET 3.x新特性一]自动属性,对象初始化及集合初始化
- 关于spring MVC 返回集合或对象自动转成json串的问题
- 关于const指针和指向const对象的指针的初始化问题
- ######保存角色,add表单页面Ajax传参给action,多个集合属性,【较为复杂的页面传参(封装ajax json参数)】:注意表单数据序列化,jquery遍历,json对象转String
- List去重:根据集合中对象特定属性去重(2)
- Struts2中表达式集合对象List<T>与对象<T>的取值时遇到的变量名的问题
- 关于ListBox控件的一个很逗的错误:“设置DataSource属性后无法修改项集合。”
- 由于错误 0xC0011008“从 XML 加载时出错。没有关于此问题的更详细错误信息,因为没有传递可存储详细错误信息的 Events 对象。”,无法加载包。