我有一个PropertyGrid
,用来显示helper类中的属性。我将helper类分配给PropertyGrid
,如下所示:
myPropertyGrid.SelectedObject = mySettingsHelper;
在helper类中,我在设计时将ReadOnlyAttribute
赋值为:
[DisplayName("DisplayExA"),
Description("DescriptionExA"),
ReadOnlyAttribute(true)]
public string PropertyA { get; set; }
[DisplayName("DisplayExB"),
Description("DescriptionExB"),
ReadOnlyAttribute(false)]
public string PropertyB { get; set; }
[DisplayName("DisplayExC"),
Description("DescriptionExC"),
ReadOnlyAttribute(true)]
public string PropertyC { get; set; }
但是现在我需要能够在运行时动态地更改单个属性的这个属性。根据某些条件,这些属性中的一些可能需要是只读的或非只读的。我如何在运行时动态地进行更改呢?
编辑:
我尝试了下面的代码,但这会为对象的每个示例设置ReadOnly属性!我想对每个对象都这样做。有时一个对象的PropertyA可能是只读的,而另一个对象的PropertyA可能不是只读的。
public static class PropertyReadOnlyHelper
{
public static void SetReadOnly(object container, string name, bool value)
{
try
{
PropertyDescriptor descriptor = TypeDescriptor.GetProperties(container.GetType())[name];
ReadOnlyAttribute attribute = (ReadOnlyAttribute)descriptor.Attributes[typeof(ReadOnlyAttribute)];
FieldInfo fieldToChange = attribute.GetType().GetField("isReadOnly",
System.Reflection.BindingFlags.NonPublic |
System.Reflection.BindingFlags.Instance);
fieldToChange.SetValue(attribute, value);
}
catch { }
}
}
7条答案
按热度按时间rbpvctlc1#
我能够使用这篇CodeProject文章中的库来完成我所需要的(只读属性的对象级赋值)。令人高兴的是,它使我能够仍然使用.NET
PropertyGrid
,而只是使用自定义属性来处理动态设置。k5ifujac2#
使用反射获取
ReadOnlyAttribute
类的示例引用,然后切换该示例上的IsReadOnly
属性。最后,如果需要,通过将其SelectedObjects设置为null并重置它,重新选择PropertyGrid中的项目。您可能也可以使用PropertyGridRefreshTabs
方法来完成此操作,我不确定。编辑:
不幸的是,IsReadOnly属性本身是只读的...在这种情况下,我们必须使用反射来更改IsReadOnly属性的支持字段的值。
w6mmgewl3#
添加只读
移除只读
bbuxkriu4#
在PropertyGrid中动态设置属性的browsable或readonly属性通常需要同时进行,而且它们是类似的工作
经过几次修改后,***Reza Aghaei***关于“Hide some properties in PropertyGrid at run-time“的伟大回答也适用于操作readonly属性。
用途:
yptwkmov5#
tkqqtvp16#
下面的代码是一个很好的例子:
xcitsw887#
查看此页面:
https://www.codeproject.com/Articles/152945/Enabling-disabling-properties-at-runtime-in-the-Pr
引自上述帖子:
静态地定义类的每个属性的ReadOnly属性为你想要的值是很重要的。2否则,在运行时改变属性会错误地修改类的每个属性的属性。
在运行时使用反射修改目标属性的“ReadOnly”特性以实现您的目标。设置一个属性应用于所有属性的问题是因为您需要显式地将同一PropertyGrid对象中的所有属性设置为ReadOnly特性以避免该问题。