[レコード]UserControlの注意すべき問題[属性"*"のコード生成に失敗しました.エラーは、「プログラムセット」*.Version=1.0.0、Culture=neutral,.......シーケンス化とマークされていません」です.

7743 ワード

開発時に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();
 7     }
 8  
 9      public MyUserControl(List receiverlist)
10     {
11       InitializeComponent();
12       m_ReceiverList = receiverlist;
13     }
14  
15     #region Properties
16  
17     private List m_ReceiverList=null;
18     public List 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コントロールをForm 1にドラッグすると、Form 1.Designer.csには次のコードが表示されます.
this.myUserControl1.ReceiverList = 
((System.Collections.Generic.List)(resources.GetObject("myUserControl1.ReceiverList")));
このコードがエラーの元になります.DuxUserクラスにはシリアル化可能とマークされていないので、リストはシリアル化できません.
なぜ?Designer.csにはMyUserControlの無パラメータ構造関数に次のようなコードがあります.
m_ReceiverList = new List();
私たちは集合をするとき、一般的に彼にインスタンス化して、このようにコントロールの集合Add()やRemove、foreachなどの操作を呼び出すときにNull値の異常が発生することを避けることができます!
しかし、このコードです.Form 1.Designer.csファイルに変なコードが自動的に生成され、エラーが発生しました.
解決策は3つあります.
1.パラメータなし構築方法におけるm_ReceiverList=nullまたは書かない;その後Loadイベントで初期化)すると、Form 1.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 m_ReceiverList=null;
 2  
 3     [Bindable(false), Browsable(false)]
 4     [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
 5     public List ReceiverList
 6     {
 7       get { return m_ReceiverList; }
 8       set
 9       {
10         m_ReceiverList = value;
11       }
12     }

次のコードを参照するには、2つ目の方法を選択します(クラス[DuxUser]をシーケンス可能にマークします):
this.myUserControl1.ReceiverList = ((System.Collections.Generic.List)(resources.GetObject("myUserControl1.ReceiverList")));
第一:ここに书くのはノートを作るためです..(記憶力がいいのは下手な筆頭に及ばない)
第二:縁のある人がこのコードを見つけて、問題が手の施しようがないようにしたい....----本文はCSDNブロガー「wxm 3630478」のオリジナル文章で、CC 4.0 by-saの著作権協定に従い、原文の出典リンクと本声明を転載してください.テキストリンク:https://blog.csdn.net/wxm3630478/article/details/4295122