问题
I am using a PropertyGrid
control to edit my class properties and I am trying to set certain properties read-only depending on other property settings.
This is the code of my class:
Imports System.ComponentModel
Imports System.Reflection
Public Class PropertyClass
Private _someProperty As Boolean = False
<DefaultValue(False)>
Public Property SomeProperty As Boolean
Get
Return _someProperty
End Get
Set(value As Boolean)
_someProperty = value
If value Then
SetReadOnlyProperty("SerialPortNum", True)
SetReadOnlyProperty("IPAddress", False)
Else
SetReadOnlyProperty("SerialPortNum", False)
SetReadOnlyProperty("IPAddress", True)
End If
End Set
End Property
Public Property IPAddress As String = "0.0.0.0"
Public Property SerialPortNum As Integer = 0
Private Sub SetReadOnlyProperty(ByVal propertyName As String, ByVal readOnlyValue As Boolean)
Dim descriptor As PropertyDescriptor = TypeDescriptor.GetProperties(Me.GetType)(propertyName)
Dim attrib As ReadOnlyAttribute = CType(descriptor.Attributes(GetType(ReadOnlyAttribute)), ReadOnlyAttribute)
Dim isReadOnly As FieldInfo = attrib.GetType.GetField("isReadOnly", (BindingFlags.NonPublic Or BindingFlags.Instance))
isReadOnly.SetValue(attrib, readOnlyValue)
End Sub
End Class
This is the code I am using to edit the values:
Dim c As New PropertyClass
PropertyGrid1.SelectedObject = c
The problem is that when I set SomeProperty
to True
, nothing happens and when I then set it to False
again it sets all properties Read-Only. Can someone see an error in my code?
回答1:
Try decorating ALL of your class properties with the ReadOnly
attribute:
<[ReadOnly](False)> _
Public Property SomeProperty As Boolean
Get
Return _someProperty
End Get
Set(value As Boolean)
_someProperty = value
If value Then
SetReadOnlyProperty("SerialPortNum", True)
SetReadOnlyProperty("IPAddress", False)
Else
SetReadOnlyProperty("SerialPortNum", False)
SetReadOnlyProperty("IPAddress", True)
End If
End Set
End Property
<[ReadOnly](False)> _
Public Property IPAddress As String = "0.0.0.0"
<[ReadOnly](False)> _
Public Property SerialPortNum As Integer = 0
Found it from this Code Project: Enabling/disabling properties at runtime in the PropertyGrid
In order for all this to work properly, it is important to statically define the ReadOnly attribute of every property of the class to whatever value you want. If not, changing the attribute at runtime that way will wrongly modify the attributes of every property of the class.
来源:https://stackoverflow.com/questions/10992719/setting-readonly-property-in-propertygrid-sets-all-properties-readonly