3

またはWinFormsデザイナーでコレクションを編集して保持する最も簡単な方法は何ですか?decimal[]List<string>

最初の問題は、パラメーターなしのコンストラクターが必要なことです。そこで、単純なラッパー クラスを作成しましたMyObject<T>

[Serializable()]
public class MyObject
{
      public MyObject() {}
      public decimal Value {get; set;}
}

コンテナー クラスで、プロパティを定義し、それに CollectionEditor 属性を追加します。

public class MyContainer
{
      private List<MyObject> _col = new List<MyObject>();

      [Editor(typeof(CollectionEditor), typeof(System.Drawing.Design.UITypeEditor))]
      public List<MyObject> Collection
      {
           get { return _col; }
           set { _col = value; }
      }
}

ここで、stackoverflow の回答と codeproject.com の記事に基づいて、あらゆる種類のことを試しました。

  • decimal[] フィールドを持つ ArrayEditor
  • MyObject のカスタム TypeConverter
  • リストのカスタム コレクション クラス
  • コンテナー クラスの読み取り/書き込みプロパティ
  • EditValue を実装したカスタム エディター
  • MyObject の IComponent インターフェイスを実装する
  • DesignerSerializationVisibility(DesignerSerializationVisibility.Content) を追加してみました

私はそれを機能させたので、

  • コレクションは DesignMode で表示されます
  • コレクションは DesignMode で編集可能です
  • DesignMode で新しいアイテムをコレクションに追加できます

ただし、フォームを保存して閉じ、再度開くと、コレクション内の要素は保持されません。

編集: Hans は私にいくつかのヒントをくれました (彼のコメントはどういうわけか空白になりました)。私は彼のガイドラインに従い、上記のソースを更新しましたが、残念ながらまだ動作しません...

4

2 に答える 2

4

可能であれば、フレームワークで既に使用されているものと同じタイプのコレクション プロパティを公開して、既存のコレクション エディターを再利用できるようにすることをお勧めします。たとえば、StringCollectionクラスを使用する場合、次の操作を実行して、WinForms の既存のエディターを再利用できます...

    [DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
    [Editor("System.Windows.Forms.Design.StringCollectionEditor, 
             System.Design, Version=2.0.0.0, Culture=neutral, 
             PublicKeyToken=b03f5f7f11d50a3a", typeof(UITypeEditor))]
    public StringCollection Items
    {
        get { return _myStringCollection; }
    }

または、 string[]を公開できる場合は、これを行います...

    [DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
    [Editor("System.Windows.Forms.Design.StringArrayEditor, 
            System.Design, Version=2.0.0.0, Culture=neutral, 
            PublicKeyToken=b03f5f7f11d50a3a", typeof(UITypeEditor))]
    public string[] Lines
    {
        get { return _myStringArray; }
        set { myStringArray = value; }
    }
于 2011-06-28T10:58:25.400 に答える
2

List of Objects プロパティを使用した例:


public partial class SCon : UserControl
{
    public SCon()
    {
        InitializeComponent();
        if (Persoanas == null)
        {
            Persoanas = new List<Persoana>();
        }
    }

    [DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
    public List<Persoan> Persoanas { get; set; }

}

[Serializable]
public class Persoan   
{
    public int Id { get; set; }
    public String Name { get; set; }
}
于 2014-02-19T10:01:37.123 に答える