Только для чтения PropertyGrid - PullRequest
4 голосов
/ 23 февраля 2010

Я использую PropertyGrid в приложении, которое пишу, чтобы пользователи могли просматривать, а иногда и редактировать экземпляры моих объектов. Иногда у пользователя может быть файл, открытый в режиме чтения / записи, где он может вносить изменения в файл через сетку свойств. В других случаях у них может быть файл, открытый в режиме только для чтения, и он не сможет вносить какие-либо изменения в объекты с помощью PropetyGrid. Мои классы также имеют динамические свойства, которые возвращаются реализацией ICustomTypeDescriptor. Вот почему я действительно хочу воспользоваться встроенной гибкостью элемента управления PropertyGrid.

Кажется, нет простого способа установить сетку свойств в режим только для чтения. Если я отключу PropertyGrid, это также не позволит пользователю прокручивать список. Поэтому я думаю, что лучший способ сделать это - добавить атрибуты ReadOnlyAttributes к свойствам во время выполнения. Есть ли другой способ?

Ответы [ 4 ]

7 голосов
/ 05 декабря 2012

Я нашел очень быстрое решение для тех, кто не заботится о том, чтобы сетка свойств была недоступна.

TypeDescriptor.AddAttributes(myObject, new Attribute[]{new ReadOnlyAttribute(true)});
propertyGrid1.SelectedObject = myObject;
2 голосов
/ 23 февраля 2010

Поскольку вы реализуете ICustomTypeDescriptor, нет необходимости добавлять какие-либо атрибуты; Вы можете просто переопределить IsReadOnly на PropertyDescriptor. Я думаю, что было бы довольно просто написать промежуточный тип, который имитирует (через ICustomTypeDescriptor и TypeConverter) упакованный тип, но всегда возвращает только для чтения PropertyDesciptor экземпляры? Дайте мне знать, если вам нужен пример (хотя это не тривиально ).

Возможно, вы также захотите проверить, предлагает ли что-то , подобное этому, , которое его построило.

0 голосов
/ 12 апреля 2011

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

Наследуйте от элемента управления сеткой свойств и создайте свою собственную версию только для чтения, добавив следующий код для переопределения нажатий клавиш

#Region "Non-greyed read only support"

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


Protected Overrides Function ProcessDialogKey(ByVal keyData As Keys) As Boolean
    If Me.isReadOnly Then Return True
    Return MyBase.ProcessDialogKey(keyData)
End Function

Public Function PreFilterMessage(ByRef m As Message) As Boolean
    If m.Msg = &H204 Then 'WM_RBUTTONDOWN
        If Me.isReadOnly Then Return True
    End If
    Return False
End Function
#End Region
0 голосов
/ 23 февраля 2010

Мой совет - написать пользовательский элемент управления, который наследуется от элемента управления propertygrid, и в этом пользовательском элементе управления иметь логическое значение readonly, а затем переопределить некоторые вещи и проверить, если (только для чтения) отменить действие

...