如何动态或在运行时设置PropertyGrid的DefaultValueAttribute?

时间:2013-11-03 03:59:37

标签: c# .net winforms reflection propertygrid

我正在定义一个与PropertyGrid控件一起使用的自定义类。比如,其中一个属性定义如下:

[CategoryAttribute("Section Name"),
DefaultValueAttribute("Default value"),
DescriptionAttribute("My property description")]
public string MyPropertyName
{
    get { return _MyPropertyName; }
    set { _MyPropertyName = value; }
}

private string _MyPropertyName;

如您所见DefaultValueAttribute定义了属性的默认值。这种默认值用于两种情况:

  1. 如果此属性值从默认值更改为 PropertyGrid控件将以粗体显示,

  2. 如果我调用ResetSelectedProperty的{​​{1}}方法, 它会将该默认值应用于所选单元格。

  3. 这个概念很好,除了PropertyGrid的一个限制。它只接受一个常量值。所以我很好奇,我可以动态地设置它,例如,从构造函数或稍后的代码中设置它吗?

    编辑:我找到了this code,让我可以阅读DefaultValueAttribute

    DefaultValueAttribute

    问题是,你如何设置它?

1 个答案:

答案 0 :(得分:12)

最后,我得到了答案!我已经遇到了很多网站,展示了如何实现ICustomTypeDescriptorPropertyDescriptorhere's one),如果您想要将两页代码添加到您的10-线类。

这是一种更快捷的方式。我找到了一个提示here。祝福那些真正发表建设性意见的人!

所以答案是在你的班级中提供两种方法。一个是private bool ShouldSerializePPP(),另一个是private void ResetPPP(),其中PPP是您的属性名称。前一个方法将由PropertyGrid调用以确定属性值是否从默认值更改,并且只要PropertyGrid项重置为默认值,就会调用后一个方法。

以下是我的类应该如何使用这些添加内容,这将允许在运行时为属性设置默认值:

[CategoryAttribute("Section Name"),
DescriptionAttribute("My property description")]
public string MyPropertyName
{
    get { return _MyPropertyName; }
    set { _MyPropertyName = value; }
}
private bool ShouldSerializeMyPropertyName()
{
    //RETURN:
    //      = true if the property value should be displayed in bold, or "treated as different from a default one"
    return !(_MyPropertyName == "Default value");
}
private void ResetMyPropertyName()
{
    //This method is called after a call to 'PropertyGrid.ResetSelectedProperty()' method on this property
   _MyPropertyName = "Default value";
}

private string _MyPropertyName;