【问题标题】:PropertyGrid control + array of custom objectsPropertyGrid 控件 + 自定义对象数组
【发布时间】:2013-03-20 10:12:37
【问题描述】:

我有一个 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 中的名称而不是数组中的索引来显示它们?

【问题讨论】:

    标签: arrays winforms propertygrid


    【解决方案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

    【讨论】:

    • 感谢您的重播。在第一种情况下“return _parameters.Where(p => p != null).ToArray();”是正确的提示:-) 他对第二个问题的解决方案是使用 ICustomTypeDescriptor。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-04-02
    • 2016-05-10
    • 1970-01-01
    • 1970-01-01
    • 2018-10-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多