2011-06-27 54 views
3

什麼是最簡單的編輯方式和堅持收集像decimal[]List<string> WinForms設計器?在DesignMode中編輯集合的最簡單方法是什麼?

第一個問題是需要一個無參數的構造函數。所以我做了一個簡單的包裝類: (在某些時候這就像MyObject<T>,但WinForms的designercode發電機不知道如何處理它)

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

現在我想基於答案在這裏對計算器和articless上codeproject.com各種各樣的東西:

  • 十進制[]字段ArrayEditor
  • 自定義類型轉換器,用於目錄的MyObject
  • 自定義集合類
  • 的容器類
  • 自定義編輯器與實施的EditValue
  • 實施的MyObject
  • 的IComponent接口
  • 讀/寫性能
  • 試過添加DesignerSerializationVisibility(DesignerSerializationVisibility.Content)

我沒有得到它的工作,使

  • 收集是在將designMode
  • 可見的收集是在將designMode編輯
  • 新項目可以被添加到集合中的designMode

然而,通過保存,關閉和重新打開集合中的元素永遠不會持久化。

編輯: 漢斯給了我一些提示(他的評論以某種方式進入了虛空)。我遵循他的指導原則,並更新了上面的源代碼,但遺憾的是仍然無法正常工作......

回答

4

我建議您儘可能公開一個與框架中已經使用的類型相同的colletion屬性,重用現有的集合編輯器。例如,如果您使用的是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; } 
    } 
+0

太好了!這工作:) 這不是我喜歡的CollectionEditor,但我會啓動反射器,並檢查我在我的實現中究竟做了什麼錯誤.. – 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; } 
} 
相關問題