UserControl 中包含封装了集合对象的属性被设计器自动初始化所引起的错误!也有关于List的问题
在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的问题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 报告称:你的智能家居设备每周可能遭受10
- 下一篇: AlphaZero 五子棋实现(附完整代