Вопрос

Я использую 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
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top