Ocultar/Mostrar propiedad en PropertyGrid

03/09/2004 - 12:40 por Fer | Informe spam
Alguien sabe como puedo hacer para mostrar/ocultar una
propiedad de una clase en un PropertyGrid en función del
valor de otra propiedad de la misma clase?

Se que con las atributos de la propiedad se puede hacer en
tiempo de diseño, pero ¿tambien se puede hacer en tiempo
de ejecución?

Gracias.

Preguntas similare

Leer las respuestas

#1 Eduardo A. Morcillo [MS MVP VB]
03/09/2004 - 18:08 | Informe spam
Se que con las atributos de la propiedad se puede hacer en
tiempo de diseño, pero ¿tambien se puede hacer en tiempo
de ejecución?



Si, se puede hacer creando un TypeConverter para la clase. Por ejemplo, si
la clase tienes dos propiedades, Prop y MostrarProp, el TypeConverter seria
asi:

Public Class MyTypeConverter
Inherits System.ComponentModel.TypeConverter

Public Overloads Overrides Function GetProperties( _
ByVal context As System.ComponentModel.ITypeDescriptorContext, _
ByVal value As Object, _
ByVal attributes() As System.Attribute) As
System.ComponentModel.PropertyDescriptorCollection

' Obtengo una coleccion de PropertyDescriptor
' con todas las propiedades visibles de la clase
Dim props As PropertyDescriptorCollection TypeDescriptor.GetProperties(value, attributes)

' Creo una nueva coleccion de PropertyDescriptors
Dim propsc As New PropertyDescriptorCollection(Nothing)

Dim ctrl As MiControl = DirectCast(value, MiControl)

' Copio los PropertyDescriptors de una coleccion a la otra
For Each propdesc As PropertyDescriptor In props

' Copio la propiedad Prop solo si MostrarProp es True
If (propdesc.Name = "Prop" And ctrl.MostrarProp = True) Or _
propdesc.Name <> "Propiedad1" Then
propsc.Add(propdesc)
End If

Next

' Devuelvo la coleccion
Return propsc

End Function

Public Overloads Overrides Function GetPropertiesSupported( _
ByVal context As System.ComponentModel.ITypeDescriptorContext) As
Boolean

' Indico que GetProperties esta implementado
Return True

End Function

End Class

En la clase deberas agregar unos atributos para indicar el TypeConverter y
que se refresque la ventana de propiedades al cambiar el valor de
MostrarProp:

<TypeConverter(GetType(MyTypeConverter))> _
Public Class MiControl
Inherits System.ComponentModel.Component

Private _prop As String
Private _mostrarProp As Boolean = True

Public Property Prop() As String
Get
Return _prop
End Get
Set(ByVal value As String)
_prop = value
End Set
End Property

<RefreshProperties(RefreshProperties.All)> _
Public Property MostrarProp() As Boolean
Get
Return _mostrarProp
End Get
Set(ByVal value As Boolean)
_mostrarProp = value
End Set
End Property

End Class

Eduardo A. Morcillo [MS MVP VB]
http://www.mvps.org/emorcillo
Respuesta Responder a este mensaje
#2 Fer
06/09/2004 - 14:34 | Informe spam
probe tu codigo y sin problemas

Gracias Eduardo
Se que con las atributos de la propiedad se puede hacer




en
tiempo de diseño, pero ¿tambien se puede hacer en tiempo
de ejecución?



Si, se puede hacer creando un TypeConverter para la


clase. Por ejemplo, si
la clase tienes dos propiedades, Prop y MostrarProp, el


TypeConverter seria
asi:

Public Class MyTypeConverter
Inherits System.ComponentModel.TypeConverter

Public Overloads Overrides Function GetProperties( _
ByVal context As


System.ComponentModel.ITypeDescriptorContext, _
ByVal value As Object, _
ByVal attributes() As System.Attribute) As
System.ComponentModel.PropertyDescriptorCollection

' Obtengo una coleccion de PropertyDescriptor
' con todas las propiedades visibles de la clase
Dim props As PropertyDescriptorCollection >TypeDescriptor.GetProperties(value, attributes)

' Creo una nueva coleccion de PropertyDescriptors
Dim propsc As New PropertyDescriptorCollection


(Nothing)

Dim ctrl As MiControl = DirectCast(value,


MiControl)

' Copio los PropertyDescriptors de una coleccion


a la otra
For Each propdesc As PropertyDescriptor In props

' Copio la propiedad Prop solo si MostrarProp


es True
If (propdesc.Name = "Prop" And


ctrl.MostrarProp = True) Or _
propdesc.Name <> "Propiedad1" Then
propsc.Add(propdesc)
End If

Next

' Devuelvo la coleccion
Return propsc

End Function

Public Overloads Overrides Function


GetPropertiesSupported( _
ByVal context As


System.ComponentModel.ITypeDescriptorContext) As
Boolean

' Indico que GetProperties esta implementado
Return True

End Function

End Class

En la clase deberas agregar unos atributos para indicar


el TypeConverter y
que se refresque la ventana de propiedades al cambiar el


valor de
MostrarProp:

<TypeConverter(GetType(MyTypeConverter))> _
Public Class MiControl
Inherits System.ComponentModel.Component

Private _prop As String
Private _mostrarProp As Boolean = True

Public Property Prop() As String
Get
Return _prop
End Get
Set(ByVal value As String)
_prop = value
End Set
End Property

<RefreshProperties(RefreshProperties.All)> _
Public Property MostrarProp() As Boolean
Get
Return _mostrarProp
End Get
Set(ByVal value As Boolean)
_mostrarProp = value
End Set
End Property

End Class

Eduardo A. Morcillo [MS MVP VB]
http://www.mvps.org/emorcillo


.

email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida