2011-06-27 14 views
3

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

第1の問題は、パラメータのないコンストラクタが必要であることです。だから私は、単純なラッパークラスを作った: 我々はプロパティを定義し、追加のコンテナクラスで

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

を(いくつかの点で、これはMyObject<T>ようなものだったが、リサイズのdesignercodeジェネレータはそれを処理する方法を知りませんでした)それに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; } 
     } 
} 

は、今私はcodeproject.com上のstackoverflowのとarticlessに、ここでの回答に基づいて、あらゆる種類のものを試してみました:

  • 一覧
  • 読む/ MyObjectに
  • ためIComponentインターフェイスを実装EditValue
  • の実装でコンテナクラス
  • カスタムエディタにプロパティを書くためのMyObjectに
  • カスタムコレクションクラスの小数点[]フィールド
  • カスタムのTypeConverterでArrayEditor (DesignerSerializationVisibility.Content)

DesignerSerializationVisibilityを追加しようとした

  • 私は、コレクションはのdesignMode
  • で編集可能ですので、コレクションはのdesignModeに見える

    • こと
    • 新しいアイテムがしかしのdesignMode

    にコレクションに追加することができ、それが動作するように手に入れましたフォームを保存、終了、再オープンすることによって、コレクション内の要素は永続化されません。

    編集: ハンスは私にいくつかのヒントを与えました(彼のコメントは何とか無効になりました)。私は彼のガイドラインに従い、上記のソースを更新しましたが残念ながらまだ動作しません。

    答えて

    4

    可能であれば、フレームワークですでに使用されているものと同じタイプのcolletionプロパティを公開することをお勧めします。既存のコレクションエディタを再利用します。あなたはStringCollectionクラスを使用する場合は、[]が、その後これを行う文字列を公開することができた場合たとえば、あなたはまた...

    [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; } 
        } 
    

    を次の操作を実行し、エディタを既存のWinFormsを再利用することができます...オブジェクトのプロパティの一覧と

    [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; } 
        } 
    
    +0

    グレート!それは動作します:) 私は好きだったCollectionEditorではありませんが、私はReflectorを起動し、私の実装で間違っていたことを確かめます。 – Laoujin

    0

    例:


    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; } 
    }