0

我有一个 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 显示。是否可以使用属性 ParamObject.Name 中的名称而不是数组中的索引来显示它们?

4

1 回答 1

1

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

  • 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添加到类中。

于 2013-03-21T09:29:29.613 回答