Pregunta

Estoy usando un PropertyGrid en una aplicación que estoy escribiendo para permitir a los usuarios ver y editar en ocasiones casos de mis objetos. A veces, el usuario puede tener un archivo abierto en modo de lectura / escritura en el que puedan realizar cambios en el archivo a través de la rejilla de propiedades. En otros casos es posible que tengan un archivo abierto en modo de sólo lectura, y no debe ser capaz de realizar ningún cambio en los objetos a través de la PropetyGrid. Mis clases también tienen propiedades dinámicas que son devueltos mediante la implementación de ICustomTypeDescriptor. Es por eso que realmente quiero aprovechar la flexibilidad integrada de un control PropertyGrid.

No parece que haya una manera fácil de establecer una propiedad de la red a un modo de sólo lectura. Si desactivo un PropertyGrid esto también evita que el usuario desplazarse por la lista. Así que estoy pensando la mejor manera de hacer esto es añadir ReadOnlyAttributes a las propiedades en tiempo de ejecución. ¿Hay alguna otra manera?

¿Fue útil?

Solución

Dado que va a implementar ICustomTypeDescriptor no hay necesidad de añadir ningún atributo; sólo puede anular IsReadOnly en el PropertyDescriptor. Estoy pensando que debería ser bastante fácil de escribir un tipo de intermediario que imita (vía ICustomTypeDescriptor y TypeConverter) un tipo envuelto, pero siempre vuelve casos PropertyDesciptor de sólo lectura? Avisadme si quieres un ejemplo (que no es triviales sin embargo).

También puede ser que desee comprobar si algo como este ofertas se construyó.

Otros consejos

Me han encontrado una solución muy rápida para thoses que no se preocupan por el PropertyGrid ser atenuada.

TypeDescriptor.AddAttributes(myObject, new Attribute[]{new ReadOnlyAttribute(true)});
propertyGrid1.SelectedObject = myObject;

Mi consejo sería escribir un control personalizado que hereda de control PropertyGrid, y en ese control personalizado, tienen un valor booleano de sólo lectura, y después se anulan algunas cosas y comprobar, si (sólo lectura) y luego cancelar la acción

me encontré con éste. Yo quería un control que fue de sólo lectura, pero no en gris.

Heredar del control de la red de propiedad y crear su propia lectura única versión añadiendo el siguiente código para anular pulsaciones de teclas

#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
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top