開發時在做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")));
第一:寫在這里是為了做筆記..(好記性不如爛筆頭)
第二:願有緣人找到此代碼,以免出來問題束手無策.....
在使用編寫完成的用戶控件時,有時會現理某某屬性代碼生成失敗,程序集未標記為可序列化,解決方法參考另一位博主寫的很好的
我按照上面做還是沒能解決問題,然后我想了一下,還要做如下工作
1、清理項目
2、重新添加項目間引用(如果需要)
3、刪除該用戶控件所在項目的bin和obj目錄
4、關閉VS,重新生成
大功告成!
非常感謝 點擊打開鏈接
轉:http://blog.csdn.net/blogtjf/article/details/47098689
轉:http://blog.csdn.net/wxm3630478/article/details/4295122