sólo lectura PropertyGrid
-
22-09-2019 - |
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?
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