2

Мне нужно показать объект в PropertyGrid со следующими требованиями: объект и его вспомогательный объект должны быть доступны только для чтения, чтобы активировать CollectionEditors PropertyGrid.Только для чтения PropertyGrid

Я нашел образец, который близок к тому, что мне нужно, но есть неожиданное поведение, которое я не мог понять. У меня есть несколько объектов PropertyGrids для разных объектов. В SetBrowsablePropertiesAsReadOnly я зацикливаю один объект, но, как ни странно, все свойства PropertyGrids в моем проекте становятся только для чтения. Может кто-нибудь мне помочь. Вот код:



Imports System.Reflection 
Imports System.ComponentModel 

Public Class PropertyGridEx 
    Inherits PropertyGrid 

    Private isReadOnly As Boolean 
    Public Property [ReadOnly]() As Boolean 
     Get 
      Return Me.isReadOnly 
     End Get 
     Set(ByVal value As Boolean) 
      Me.isReadOnly = value 
      Me.SetBrowsablePropertiesAsReadOnly(Me.SelectedObject, value) 
     End Set 
    End Property 

    Protected Overloads Sub OnSelectedObjectsChanged(ByVal e As EventArgs) 
     Me.SetBrowsablePropertiesAsReadOnly(Me.SelectedObject, Me.isReadOnly) 
     MyBase.OnSelectedObjectsChanged(e) 
    End Sub 

    Private Sub SetBrowsablePropertiesAsReadOnly(ByRef selectedObject As Object, ByVal isReadOnly As Boolean) 
     If selectedObject IsNot Nothing Then 
      Dim props As PropertyDescriptorCollection = TypeDescriptor.GetProperties(selectedObject) 
      For Each propDescript As PropertyDescriptor In props 
       If propDescript.IsBrowsable AndAlso propDescript.PropertyType.GetInterface("ICollection", True) Is Nothing Then 
        Dim attr As ReadOnlyAttribute = TryCast(propDescript.Attributes(GetType(ReadOnlyAttribute)), ReadOnlyAttribute) 
        If attr IsNot Nothing Then 
         Dim field As FieldInfo = attr.[GetType]().GetField("isReadOnly", BindingFlags.NonPublic Or BindingFlags.Instance) 
         field.SetValue(attr, isReadOnly, BindingFlags.NonPublic Or BindingFlags.Instance, Nothing, Nothing) 
        End If 
       End If 
      Next 
     End If 
    End Sub 
End Class 

ответ

0

Атрибут ReadOnly устанавливается на определение класса, а не на экземпляр объекта. Следовательно, это повлияет на все экземпляры этого класса.

Для достижения того, что вы хотите, создайте пользовательский PropertyDescriptor, в котором вы переопределите свойство IsReadOnly и примените его к свойствам экземпляра объекта.

0

Я уверен, что это не правильный синтаксис VB, но это может быть сделано путем добавления атрибута:

Private Sub SetBrowsablePropertiesAsReadOnly(ByRef selectedObject As Object, ByVal isReadOnly As Boolean) 
If selectedObject IsNot Nothing Then 
    TypeDescriptor.AddAttributes(selectedObject, New Attribute[] { New ReadOnlyAttribute(isReadOnly) }); 
End If 
End Sub 

 Смежные вопросы

  • Нет связанных вопросов^_^