none
Crear clases derivads de TypeConverter RRS feed

  • Pregunta

  • Hola:

    Quisiera hacer una consulta respecto a un problema que tengo con los TypeConverter. Lo que ocurre es que cuando intento heredar de una clase derivada de TypeConverter y luego uso esa clase como typeconverter de una propiedad, al obtener el TypeConverterAttribute obtengo una cadena vacía para la propiedad converteratribute.ConverterTypeName.

    Es decir:

    1- Creo una clase base que hereda de typeconverter:

    Public Class BaseCustomTypeConverter
        Inherits TypeConverter

        Public Sub New()
            MyBase.New()
        End Sub

        'Especifica el ancho del control en el que se muestra la propiedad
        Public Overridable ReadOnly Property ControlWidth() As Integer
            Get
                 return 5
            End Get
        End Property

        'Especifica si el control de la propiedad es del tipo TextArea
        '(solo para controles textbox)
        'Los controles textarea son similares a un textbox pero multilinea.
        Public Overridable ReadOnly Property IsTextArea() As Boolean
            Get
                Return False
            End Get
        End Property

        'Especifica la cantidad de líneas que mostrará el control textbox
        '(solo para cuando se establece la propiedad TextArea como "true")
        Public Overridable ReadOnly Property Rows() As String
            Get
                Return 1
            End Get
        End Property
    End Class

    2- Luego, creo varios TypeConverters que hereden de esta clase base (creo
    tantos TypeConverters como a propiedades necesite asignarles uno). Por
    simplicidad, aquí solo mostraré el código de uno de ellos.

        Public Class JefeConverter
            Inherits BaseCustomTypeConverter

            Private ancho_control As Integer

            Public Sub New()
                MyBase.New()
                ancho_control=20
            End Sub

            Public Overrides ReadOnly Property ControlWidth() As Integer
                Get
                    Return ancho_control
                End Get
            End Property
        End Class

    3- Finalmente asigno el TypeConverter a la propiedad:

    <AttributeProvider(GetType(IListSource)), _
        Browsable(True), Category("Laboral"), _
        [ReadOnly](False), _
        TypeConverter(GetType(JefeConverter))> _
        Public Property Jefe() As JefeEmpleado
            Get
                Return _jefe
            End Get
            Set(ByVal value As JefeEmpleado)
                _jefe = value
            End Set
        End Property


    Lo curioso es que cuando lo ejecuto y hago

    Dim propiedades As PropertyDescriptorCollection =
    TypeDescriptor.GetProperties(empleado, False)
    Dim propiedad As PropertyDescriptor = propiedades.Find("Jefe", True)
    Dim atributos As AttributeCollection = propiedad.Attributes
    Dim converteratribute As TypeConverterAttribute =
    atributos(GetType(TypeConverterAttribute))

    Obtengo una cadena vacía para la propiedad converteratribute.ConverterTypeName

    Por el contrario, si hago que "JefeConverter" herede directamente de la
    clase TypeConverter en lugar de heredar de la derivada
    "BaseCustomTypeConverter", entonces cuando haga

    Dim propiedades As PropertyDescriptorCollection =
    TypeDescriptor.GetProperties(empleado, False)
    Dim propiedad As PropertyDescriptor = propiedades.Find("Jefe", True)
    Dim atributos As AttributeCollection = propiedad.Attributes
    Dim converteratribute As TypeConverterAttribute =
    atributos(GetType(TypeConverterAttribute))

    obtendré el nombre de clase adecuado en la propiedad
    converteratribute.ConverterTypeName y por lo tanto podré crear una instancia
    del Typeconverter JefeConverter.

    Como he dicho antes, es muy extraño lo que sucede. ¿Por qué al derivar de una clase derivada es como si el TypeConverter no existiese? ¿hay alguna limitación para derivar los typeconverters de esta forma?

    Desde ya gracias.
    Saludos, Diego

    viernes, 12 de enero de 2007 20:02