zoukankan      html  css  js  c++  java
  • [记录]UserControl 的一个值得注意的问题 [属性" * "的代码生成失败.错误是:"程序集"*.Version=1.0.0.0,Culture=neutral,..........无标记为序列化"

    开发时在做UserControl,需要注意的List<>集合问题~~~!

    其他类型的集合可能也存在这样的问题,但是我没去测试,在写集合的时候一般List<>用的多点,所以经常碰到以下错误:

    提示:属性" ******** "的代码生成失败.错误是:"程序集"********.Version=1.0.0.0,Culture=neutral,..........无标记为序列化""]

    例如下面一个MyUserControl,其中写了一个List<>属性

     1  public partial class MyUserControl : UserControl
     2   {
     3      public MyUserControl()
     4     {
     5       InitializeComponent();
     6       m_ReceiverList = new List<DuxUser>();
     7     }
     8  
     9      public MyUserControl(List<DuxUser> receiverlist)
    10     {
    11       InitializeComponent();
    12       m_ReceiverList = receiverlist;
    13     }
    14  
    15     #region Properties
    16  
    17     private List<DuxUser> m_ReceiverList=null;
    18     public List<DuxUser> ReceiverList
    19     {
    20       get { return m_ReceiverList; }
    21       set
    22       {
    23         m_ReceiverList = value;
    24       }
    25     }
    26     #endregion
    27   }
    28  
    29   public class DuxUser     //定义的一个DuxUser类
    30   {
    31     public DuxUser() { }
    32   }

    这个MyUserControl代码看起来时没有任何问题的,但是只要你往窗体上一拖就是报上面红色字体的错误,如果你是写代码添加到窗体上是不会出错的,只要拖到窗体上去就会报错!
    为什么会这样呢?

    例如: 把一个MyUserControl控件拖到一个Form1上,那么Form1.Designer.cs里就会出现这么一条代码:

    this.myUserControl1.ReceiverList = 

    ((System.Collections.Generic.List<DuxUser>)(resources.GetObject("myUserControl1.ReceiverList")));

    这段代码就是错误的根源,因为DuxUser类没有标记为可序列化 [Serializable],所以List<DuxUser>也就不能序列化啦!

    为什么Form1.Designer.cs中会有那么一段代码呢,原因在MyUserControl的无参数构造函数上:

    m_ReceiverList = new List<DuxUser>();

    我们在做集合的时候,一般都会给他实例化一下,这样可以避免调用控件的集合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]

    1   [Serializable]
    2   public class DuxUser
    3   {
    4     public DuxUser() { }
    5     
    6     //.........
    7   }

    3. 如下:

     1     private List<DuxUser> m_ReceiverList=null;
     2  
     3     [Bindable(false), Browsable(false)]
     4     [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
     5     public List<DuxUser> ReceiverList
     6     {
     7       get { return m_ReceiverList; }
     8       set
     9       {
    10         m_ReceiverList = value;
    11       }
    12     }

    想看到下面这段代码,请选择第二种方法(把类[DuxUser]标记为可序列化):

    this.myUserControl1.ReceiverList = ((System.Collections.Generic.List<DuxUser>)(resources.GetObject("myUserControl1.ReceiverList")));

    第一:写在这里是为了做笔记..(好记性不如烂笔头)

    第二:愿有缘人找到此代码,以免出来问题束手无策.....
    ---------------------
    版权声明:本文为CSDN博主「wxm3630478」的原创文章,遵循CC 4.0 by-sa版权协议,转载请附上原文出处链接及本声明。
    原文链接:https://blog.csdn.net/wxm3630478/article/details/4295122

  • 相关阅读:
    三级指针
    外挂指针
    内存四区(1)(转载)
    内存四区(3)(转载)
    劫持(1)
    过滤劫持和函数回调(2)
    劫持程序(3)
    dll注入实现MFC程序劫持(4)
    virtual hust 2013.6.20 数论基础题目 I
    virtual hust 2013.6.20 数论基础题目 D
  • 原文地址:https://www.cnblogs.com/yhuse/p/11352321.html
Copyright © 2011-2022 走看看