2013-03-20 60 views
0

我必須我結合的容器與複雜的對象的陣列的PropertyGrid控件:PropertyGrid控件+定製的對象數組

// Collection 
public class ParametersCollection 
{ 
    private ParameterObject [] _parameters = null; 

    [Category("SubReportParams")] 
    public ParameterObject [] Parameters 
    { 
     get { return _parameters; } 
     set { _parameters = value; } 
    } 

    public ParametersCollection() 
    { 
     // _parameters initialization here... 
    } 
} 

// Complex object 
public class ParameterObject 
{ 
    private string _name = ""; 
    private string _value = ""; 

    [Category("Information"), DisplayName("Name")] 
    public string Name 
    { 
     get { return _name; } 
     set { _name = value; } 
    } 

    [Category("Information"), DisplayName("Value")] 
    public string Value 
    { 
     get { return _value; } 
     set { _value = value; } 
    } 
} 

一切正常,除了兩種情況:

  1. 例如,如果數組_parameters只有2個項目,則默認數組大小爲4,而索引2和3的項目爲空值。 PropertyGrid將這些項目顯示爲空字段。如何強制PropertyGrid忽略這些字段並且不顯示它?

  2. _parameters變量是一個數組類型,所以_parameters項顯示其索引從0到n。是否有一個posibillity來顯示他們的名字從屬性ParamObject.Name而不是他們的數組中的索引?

回答

1

對於第一個問題,最簡單的方法是添加一個「真實」屬性計算的「假」屬性。這不是完美的,但你可以使用各種屬性,以幫助:

  • 顯示名稱,以給假產權不動產
  • 可瀏覽(假)的名稱指示屬性網格跳過不動產
  • EditorBrowsable(從不)指示Visual Studio的智能感知不在外部代碼中顯示此屬性。

    [Browsable(false)] 
        public ParameterObject[] Parameters 
        { 
         get { return _parameters; } 
         set { _parameters = value; } 
        } 
    
        [Category("SubReportParams"), DisplayName("Parameters")] 
        [EditorBrowsable(EditorBrowsableState.Never)] 
        public ParameterObject[] NonEmptyParameters 
        { 
         get 
         { 
          return _parameters.Where(p => p != null).ToArray(); 
         } 
        } 
    

對於第二個問題,一個簡單的方法是添加一個toString()實現這樣的:

public class ParameterObject 
{ 
    public override string ToString() 
    { 
     return Name; 
    } 
} 

否則,你可以自定義TypeConverter添加到類。

+0

感謝您的回覆。在第一種情況下,「return _parameters.Where(p => p!= null).ToArray();」是正確的提示:-)他解決第二個問題是使用ICustomTypeDescriptor。 – 2013-03-26 06:33:32