PropertyGrid
ヘルパー クラスでプロパティを表示するために使用した があります。PropertyGrid
ヘルパー クラスを次のように割り当てます。
myPropertyGrid.SelectedObject = mySettingsHelper;
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 が読み取り専用である一方で、2 番目のオブジェクトの 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 { }
}
}