Только для чтения PropertyGrid
-
22-09-2019 - |
Вопрос
Я использую PropertyGrid в приложении, которое пишу, чтобы пользователи могли просматривать и иногда редактировать экземпляры моих объектов.Иногда пользователь может открыть файл в режиме чтения/записи, где он может вносить изменения в файл через сетку свойств.В других случаях у них может быть открыт файл в режиме только для чтения, и они не смогут вносить какие-либо изменения в объекты через PropetyGrid.Мои классы также имеют динамические свойства, которые возвращаются путем реализации ICustomTypeDescriptor.Вот почему я действительно хочу воспользоваться преимуществами встроенной гибкости элемента управления PropertyGrid.
Кажется, не существует простого способа установить сетку свойств в режим только для чтения.Если я отключу PropertyGrid, это также не позволит пользователю прокручивать список.Поэтому я думаю, что лучший способ сделать это — добавить ReadOnlyAttributes к свойствам во время выполнения.Есть ли другой способ?
Решение
Поскольку вы реализуете ICustomTypeDescriptor
нет необходимости добавлять какие-либо атрибуты;ты можешь просто переопределить IsReadOnly
на PropertyDescriptor
.Я думаю, что написать промежуточный тип, который имитирует (через ICustomTypeDescriptor
и TypeConverter
) обернутый тип, но всегда возвращает только чтение PropertyDesciptor
случаи?Дайте мне знать, если вам нужен пример (это не тривиальный хотя).
Вы также можете проверить, есть ли что-то так предлагает построить его.
Другие советы
Я нашел очень быстрое решение для тех, кого не волнует, что сетка свойств неактивна.
TypeDescriptor.AddAttributes(myObject, new Attribute[]{new ReadOnlyAttribute(true)});
propertyGrid1.SelectedObject = myObject;
Я бы посоветовал написать пользовательский элемент управления, который наследуется от элемента управления propertygrid, и в этом пользовательском элементе управления иметь логическое значение только для чтения, а затем переопределить некоторые вещи и проверить, если (только для чтения), а затем отменить действие.
Я столкнулся с этим.Мне нужен был элемент управления, который был доступен только для чтения, но не был выделен серым цветом.
Наследуйте элемент управления «Сетка свойств» и создайте собственную версию только для чтения, добавив следующий код для переопределения нажатий клавиш.
#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