开发时在做UserControl,需要注意的List<>集合问题~~~!
其他类型的集合可能也存在这样的问题,但是我没去测试,在写集合的时候一般List<>用的多点,所以经常碰到以下错误:
提示:属性" ******** "的代码生成失败.错误是:"程序集"********.Version=1.0.0.0,Culture=neutral,..........无标记为序列化""]
例如下面一个MyUserControl,其中写了一个List<>属性
public partial class MyUserControl : UserControl
{
public MyUserControl()
{
InitializeComponent();
m_ReceiverList = new List();
}
public MyUserControl(List receiverlist)
{
InitializeComponent();
m_ReceiverList = receiverlist;
}
#region Properties
private List m_ReceiverList=null;
public List ReceiverList
{
get { return m_ReceiverList; }
set
{
m_ReceiverList = value;
}
}
#endregion
}
public class DuxUser //定义的一个DuxUser类
{
public DuxUser() { }
}
为什么会这样呢?
例如: 把一个MyUserControl控件拖到一个Form1上,那么Form1.Designer.cs里就会出现这么一条代码:
this.myUserControl1.ReceiverList =
((System.Collections.Generic.List
这段代码就是错误的根源,因为DuxUser类没有标记为可序列化 [Serializable],所以List
为什么Form1.Designer.cs中会有那么一段代码呢,原因在MyUserControl的无参数构造函数上:
m_ReceiverList = new List
我们在做集合的时候,一般都会给他实例化一下,这样可以避免调用控件的集合Add() 或者 Remove,foreach 等操作的时候出现Null值异常!
但是就是这段代码,Form1.Designer.cs文件中自动生成了那么一段怪代码,导致出错
解决的办法有3种:
1. 无参数构造方法中 m_ReceiverList=null 或者不写; 然后再Load事件中进行初始化),那么在Form1.Designer.cs中看到的就是this.ReceiverList = null;
需要注意的是:Load事件中要判断集合是否为null值,是null才去初始化,因为有可能是手动写代码添加到容器(如:窗体),而不是拖,写代码的方式有可能在Load之前给集合属性赋值
2. 把DuxUser类,标记为可序列化的类[Serializable]
[Serializable]
public class DuxUser
{
public DuxUser() { }
//.........
}
3. 如下:
private List m_ReceiverList=null;
[Bindable(false), Browsable(false)]
[DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
public List ReceiverList
{
get { return m_ReceiverList; }
set
{
m_ReceiverList = value;
}
}
想看到下面这段代码,请选择第二种方法(把类[DuxUser]标记为可序列化):
this.myUserControl1.ReceiverList = ((System.Collections.Generic.List
第一:写在这里是为了做笔记..(好记性不如烂笔头)
第二:愿有缘人找到此代码,以免出来问题束手无策.....