1. 程式人生 > >UserControl 的一個值得注意的問題 [屬性" * "的程式碼生成失敗.錯誤是:"程式集"*.Version=1.0.0.0,Culture=neutral,..........無標記為序列化"

UserControl 的一個值得注意的問題 [屬性" * "的程式碼生成失敗.錯誤是:"程式集"*.Version=1.0.0.0,Culture=neutral,..........無標記為序列化"

開發時在做UserControl,需要注意的List<>集合問題~~~!

其他型別的集合可能也存在這樣的問題,但是我沒去測試,在寫集合的時候一般List<>用的多點,所以經常碰到以下錯誤:

提示:屬性" ******** "的程式碼生成失敗.錯誤是:"程式集"********.Version=1.0.0.0,Culture=neutral,..........無標記為序列化""]

例如下面一個MyUserControl,其中寫了一個List<>屬性

     public partial class MyUserControl : UserControl
      {
         public MyUserControl()
        {
          InitializeComponent();
          m_ReceiverList = new List<DuxUser>();
        }
     
         public MyUserControl(List<DuxUser> receiverlist)
        {
          InitializeComponent();
          m_ReceiverList = receiverlist;
        }
     
        #region Properties
     
        private List<DuxUser> m_ReceiverList=null;
        public List<DuxUser> ReceiverList
        {
          get { return m_ReceiverList; }
          set
          {
            m_ReceiverList = value;
          }
        }
        #endregion
      }
     
      public class DuxUser     //定義的一個DuxUser類
      {
        public DuxUser() { }
      }


這個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]

      [Serializable]
      public class DuxUser
      {
        public DuxUser() { }
        
        //.........
      }

3. 如下:

        private List<DuxUser> m_ReceiverList=null;
     
        [Bindable(false), Browsable(false)]
        [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
        public List<DuxUser> ReceiverList
        {
          get { return m_ReceiverList; }
          set
          {
            m_ReceiverList = value;
          }
        }

想看到下面這段程式碼,請選擇第二種方法(把類[DuxUser]標記為可序列化):

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

第一:寫在這裡是為了做筆記..(好記性不如爛筆頭)

第二:願有緣人找到此程式碼,以免出來問題束手無策.....
---------------------
作者:wxm3630478
來源:CSDN
原文:https://blog.csdn.net/wxm3630478/article/details/4295122
版權宣告:本文為博主原創文章,轉載請附上博文連結!

 

 

我按照上面做還是沒能解決問題,然後我想了一下,還要做如下工作

1、清理專案

2、重新新增專案間引用(如果需要)

3、刪除該使用者控制元件所在專案的bin和obj目錄

4、關閉VS,重新生成

大功告成!