[レコード]UserControlの注意すべき問題[属性"*"のコード生成に失敗しました.エラーは、「プログラムセット」*.Version=1.0.0、Culture=neutral,.......シーケンス化とマークされていません」です.
7743 ワード
開発時にUserControlをしていますが、要注意のList<>集合問題~~~!
他のタイプの集合にもこのような問題があるかもしれませんが、私はテストを行っていません.集合を書くときは一般的にList<>で多く使うので、以下のエラーによく遭遇します.
ヒント:属性「********」のコード生成に失敗しました.エラーは、「プログラムセット」********.Version=1.0.0.0,Culture=neutral,..........シーケンス化としてマークされていない""
例えば、次のMyUserControlでは、List<>プロパティが書かれています.
この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]
3.次のようになります.
次のコードを参照するには、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
他のタイプの集合にもこのような問題があるかもしれませんが、私はテストを行っていません.集合を書くときは一般的に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