PropertyGrid控件+自定义对象数组

时间:2013-03-20 10:12:38

标签: arrays winforms 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. 例如,如果array _parameters只有2个项,则默认数组大小为4,索引为2和3的项为空。 PropertyGrid将这些项显示为空字段。如何强制PropertyGrid忽略这些字段而不显示它?

  2. _parameters变量是一种数组类型,因此_parameters项目的索引从0到n显示。是否有可能使用属性ParamObject.Name而不是数组中的索引显示它们的名称?

1 个答案:

答案 0 :(得分:1)

对于第一个问题,最简单的方法是添加一个"假的"从" real"计算的属性属性。它并不完美,但您可以使用各种属性来提供帮助:

  • DisplayName为假属性提供不动产的名称
  • Browsable(false)指示属性网格跳过不动产
  • EditorBrowsable(never)指示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