2013-03-20 132 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