トップ回答者
ジェネリッククラスを持つリストのプロパティはコントロールに用意できない?

質問
-
C# 2017
.Net Framework 4.5ジェネリッククラスがList管理されているプロパティをコントロールに用意したいと思い、以下のコードを書きました。
※現象を最も簡素化した状態なので、このコード自体に意味はありません。namespace WindowsFormsApp2 { public class SampleItem { public int Value { get; set; } = 0; public DateTime DateTime { get; set; } = System.DateTime.Now; } }
namespace WindowsFormsApp2 { public class GenericClass<T> { [Browsable(true)] public string FieldName { get; set; } = "Column1"; } }
namespace WindowsFormsApp2 { public class TextBoxEx : TextBox { [DesignerSerializationVisibility(DesignerSerializationVisibility.Content)] public List<GenericClass<SampleItem>> GenericClassList { get; set; } = new List<GenericClass<SampleItem>>(); } }
これを行うと、一度目はデザイナーで、対象プロパティを編集できます。
しかし、コードは一切変更していないのに、一度リビルドを行ってデザイナーを開くと、必ずエラーになります。
メソッド 'System.Collections.Generic.List`1[[WindowsFormsApp2.GenericClass`1[[WindowsFormsApp2.SampleItem, WindowsFormsApp2, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]], WindowsFormsApp2, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]].Add' が見つかりません。
Form1.Designer.cs内で対象プロパティにAdd()を行っている部分でエラーになっているようです。
this.textBoxEx1.GenericClassList.Add(genericClass_11);
これを解決させる方法はあるのでしょうか?
それともコントロールに、ジェネリッククラスを管理するListを持つことは出来ないのでしょうか?
回答
-
takiruさん、こんにちは。フォーラムオペレーターのHarukaです。
ご返信頂きありがとうございます。
エラーを再現しました。[無視] をクリックすると、すべてが正常になります。
どうぞよろしくお願いします。
MSDN/ TechNet Community Support Haruka
ご協力くださいますようお願いいたします。また、MSDNサポートに賛辞や苦情がある場合は、MSDNFSF@microsoft.comまでお気軽にお問い合わせください。~- 回答としてマーク takiru 2019年5月22日 5:17
すべての返信
-
takiruさん、こんにちは。フォーラムオペレーターのHarukaです。
MSDNフォーラムにご投稿くださいましてありがとうございます。
コードをテストしたところ、エラーを再現できませんでしたので、詳しい情報などを教えていただけますでしょうか。
textBoxEx1をどこに追加しますか。
genericClass_11のインスタンスはどこにありますか。
ご返信をお待ちしております。どうぞよろしくお願いします。
MSDN/ TechNet Community Support Haruka
ご協力くださいますようお願いいたします。また、MSDNサポートに賛辞や苦情がある場合は、MSDNFSF@microsoft.comまでお気軽にお問い合わせください。~ -
takiruさん、こんにちは。フォーラムオペレーターのHarukaです。
ご返信頂きありがとうございます。
テストするためにエラーを再現できるコードサンプルをご提供いただけますでしょうか。どうぞよろしくお願いします。
MSDN/ TechNet Community Support Haruka
ご協力くださいますようお願いいたします。また、MSDNサポートに賛辞や苦情がある場合は、MSDNFSF@microsoft.comまでお気軽にお問い合わせください。~ -
全ソースは以下になります。
SampleItem.cs
using System; namespace WindowsFormsApp3 { public class SampleItem { public int Value { get; set; } = 0; public DateTime DateTime { get; set; } = System.DateTime.Now; } }
GenericClass.cs
using System.ComponentModel; namespace WindowsFormsApp3 { public class GenericClass<T> { [Browsable(true)] public string FieldName { get; set; } = "Column1"; } }
TextBoxEx.cs
using System.Collections.Generic; using System.ComponentModel; using System.Windows.Forms; namespace WindowsFormsApp3 { public class TextBoxEx : TextBox { [DesignerSerializationVisibility(DesignerSerializationVisibility.Content)] public List<GenericClass<SampleItem>> GenericClassList { get; set; } = new List<GenericClass<SampleItem>>(); } }
発生手順
1.適当なフォームにTextBoxExを貼り付ける。
2.TextBoxExのGenericClassListプロパティに1つ値を追加する。
3.保存してデザイナを閉じる。
4.リビルドする。
5.フォームを開く。動かすと画像のようになります。
-
takiruさん、こんにちは。フォーラムオペレーターのHarukaです。
ご返信頂きありがとうございます。
エラーを再現しました。[無視] をクリックすると、すべてが正常になります。
どうぞよろしくお願いします。
MSDN/ TechNet Community Support Haruka
ご協力くださいますようお願いいたします。また、MSDNサポートに賛辞や苦情がある場合は、MSDNFSF@microsoft.comまでお気軽にお問い合わせください。~- 回答としてマーク takiru 2019年5月22日 5:17
-
遅くなりましたが、ご回答ありがとうございます。
まずそもそも、エラーにはなってほしくなかったので、それは難しいようですね。
調べると、デザイナーに貼り付けるコントロール内部でジェネリックを利用する形を取ると発生するようです。
コントロールクラスをラッピングして、貼り付けるコントロールとしてジェネリックが利用されていない形を取れば解決するようでした。上記の対応にすると、利用したいジェネリッククラスごとにラッピングしたクラスを予め用意しておかなければいけず、若干の面倒さが付いて回ることになりますが、エラーになるよりは、ということでその方法で回避することとしました。