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

  • 質問

  • 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を持つことは出来ないのでしょうか?

    2019年2月26日 8:38

回答

  • takiruさん、こんにちは。フォーラムオペレーターのHarukaです。
    ご返信頂きありがとうございます。

    エラーを再現しました。[無視] をクリックすると、すべてが正常になります。

    どうぞよろしくお願いします。


    MSDN/ TechNet Community Support Haruka

    ~参考になった投稿には「回答としてマーク」をご設定ください。なかった場合は「回答としてマークされていない」も設定できます。同じ問題で後から参照した方が、情報を見つけやすくなりますので、
    ご協力くださいますようお願いいたします。また、MSDNサポートに賛辞や苦情がある場合は、MSDNFSF@microsoft.comまでお気軽にお問い合わせください。~

    • 回答としてマーク takiru 2019年5月22日 5:17
    2019年3月11日 0:37
    モデレータ

すべての返信

  • takiruさん、こんにちは。フォーラムオペレーターのHarukaです。
    MSDNフォーラムにご投稿くださいましてありがとうございます。

    コードをテストしたところ、エラーを再現できませんでしたので、詳しい情報などを教えていただけますでしょうか。 
    textBoxEx1をどこに追加しますか。
    genericClass_11のインスタンスはどこにありますか。

    ご返信をお待ちしております。どうぞよろしくお願いします。


    MSDN/ TechNet Community Support Haruka

    ~参考になった投稿には「回答としてマーク」をご設定ください。なかった場合は「回答としてマークされていない」も設定できます。同じ問題で後から参照した方が、情報を見つけやすくなりますので、
    ご協力くださいますようお願いいたします。また、MSDNサポートに賛辞や苦情がある場合は、MSDNFSF@microsoft.comまでお気軽にお問い合わせください。~

    2019年3月4日 8:13
    モデレータ
  • genericClass_11は、デザイナ上から、TextBoxExのGenericClassListプロパティに追加を行ったときに、出来上がったGenericClass<T>オブジェクトがDesigner.csファイルに記述されてきます。
    2019年3月4日 13:48
  • takiruさん、こんにちは。フォーラムオペレーターのHarukaです。
    ご返信頂きありがとうございます。

    テストするためにエラーを再現できるコードサンプルをご提供いただけますでしょうか。

    どうぞよろしくお願いします。


    MSDN/ TechNet Community Support Haruka

    ~参考になった投稿には「回答としてマーク」をご設定ください。なかった場合は「回答としてマークされていない」も設定できます。同じ問題で後から参照した方が、情報を見つけやすくなりますので、
    ご協力くださいますようお願いいたします。また、MSDNサポートに賛辞や苦情がある場合は、MSDNFSF@microsoft.comまでお気軽にお問い合わせください。~
    2019年3月5日 8:42
    モデレータ
  • 全ソースは以下になります。

    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.フォームを開く。

    動かすと画像のようになります。

    2019年3月6日 1:29
  • takiruさん、こんにちは。フォーラムオペレーターのHarukaです。
    ご返信頂きありがとうございます。

    エラーを再現しました。[無視] をクリックすると、すべてが正常になります。

    どうぞよろしくお願いします。


    MSDN/ TechNet Community Support Haruka

    ~参考になった投稿には「回答としてマーク」をご設定ください。なかった場合は「回答としてマークされていない」も設定できます。同じ問題で後から参照した方が、情報を見つけやすくなりますので、
    ご協力くださいますようお願いいたします。また、MSDNサポートに賛辞や苦情がある場合は、MSDNFSF@microsoft.comまでお気軽にお問い合わせください。~

    • 回答としてマーク takiru 2019年5月22日 5:17
    2019年3月11日 0:37
    モデレータ
  • 遅くなりましたが、ご回答ありがとうございます。

    まずそもそも、エラーにはなってほしくなかったので、それは難しいようですね。

    調べると、デザイナーに貼り付けるコントロール内部でジェネリックを利用する形を取ると発生するようです。
    コントロールクラスをラッピングして、貼り付けるコントロールとしてジェネリックが利用されていない形を取れば解決するようでした。

    上記の対応にすると、利用したいジェネリッククラスごとにラッピングしたクラスを予め用意しておかなければいけず、若干の面倒さが付いて回ることになりますが、エラーになるよりは、ということでその方法で回避することとしました。

    2019年5月22日 5:17