Property as enum llenada manualmente

17/03/2005 - 23:21 por Imac_Man | Informe spam
saludos amigos

necesito encontrar una forma de presentar una property en para un user
control al que yo pueda enumerar con los valores de una tabla, les ruego me
ayuden, gracias de antemano.

Preguntas similare

Leer las respuestas

#1 Eduardo A. Morcillo [MS MVP VB]
18/03/2005 - 04:21 | Informe spam
Aunque tiene la complejidad de la conexion a la BD para buscar la data, es
bastante simple de realizar. Lo que debes hacer es crear una clase derivada
de TypeConverter y sobreescribir sus metodos para devolver la lista de
valores y hacer las conversiones necesarias. Un ejemplo para una propiedad
de tipo Integer donde tomamos los valores de una tabla con dos campos: Id y
Descripcion:

Public Class EnumDinamicoConverter
Inherits TypeConverter

Private _data As DataTable

Private Sub InicializarData(ByVal context As
System.ComponentModel.ITypeDescriptorContext)

' Aqui llenas el DataTable con tu tabla. Si necesitas acceder al
' control que se esta editando para obtener por
' ejemplo la cadena de conexion utiliza context.Instance

End Sub

Public Overloads Overrides Function CanConvertFrom( _
ByVal context As System.ComponentModel.ITypeDescriptorContext, _
ByVal sourceType As System.Type) As Boolean

If sourceType Is GetType(String) Then
Return True
End If

Return MyBase.CanConvertFrom(context, sourceType)

End Function

Public Overloads Overrides Function CanConvertTo( _
ByVal context As System.ComponentModel.ITypeDescriptorContext, _
ByVal destinationType As System.Type) As Boolean

If destinationType Is GetType(String) Then
Return True
End If

Return MyBase.CanConvertTo(context, destinationType)

End Function

Public Overloads Overrides Function ConvertFrom( _
ByVal context As System.ComponentModel.ITypeDescriptorContext, _
ByVal culture As System.Globalization.CultureInfo, _
ByVal value As Object) As Object

If TypeOf value Is String Then ' ¿Estoy convirtiendo desde un
String?

' Cargo la tabla si todavia no se cargo
If _data Is Nothing Then InicializarData(context)

' Obtengo el valor como String
Dim valor As String = DirectCast(value, String)

If RegEx.IsMatch(valor, "^\d+$") Then ' ¿Es un numero?

' Convierto el String a Integer y lo devuelvo
Return Integer.Parse(valor)

Else

' Selecciono los registros que tienen la
' descripcion a convertir
Dim rows() As DataRow = _data.Select("Descripcion='" &
valor & "'")

If rows.Length > 0 Then

' Devuelvo el Id del primer registro encontrado
Return CType(rows(0).Item("Id"), Integer)

Else

' No se encontro la descripcion.
' Devuelvo un valor por defecto.
Return 0

End If

End If

End If

Return MyBase.ConvertFrom(context, culture, value)

End Function

Public Overloads Overrides Function ConvertTo( _
ByVal context As System.ComponentModel.ITypeDescriptorContext, _
ByVal culture As System.Globalization.CultureInfo, _
ByVal value As Object, _
ByVal destinationType As System.Type) As Object

If destinationType Is GetType(String) Then ' ¿Tengo que
convertir a String?

If _data Is Nothing Then InicializarData(context)

If TypeOf value Is Integer Then ' ¿El valor es un entero?

' Obtengo el valor entero
Dim valor As Integer = DirectCast(value, Integer)

' Selecciono los registros donde el Id es
' igual al valor entero
Dim rows() As DataRow = _data.Select("Id=" & valor)

If rows.Length > 0 Then

' Devuelvo la descripcion
Return rows(0).Item("Descripcion")

Else

' No se encontro el Id en la tabla.
Return "Id no existe en tabla: " & valor.ToString

End If

End If

End If

Return MyBase.ConvertTo(context, culture, value,
destinationType)

End Function

Public Overloads Overrides Function GetStandardValues( _
ByVal context As System.ComponentModel.ITypeDescriptorContext) _
As System.ComponentModel.TypeConverter.StandardValuesCollection

If _data Is Nothing Then InicializarData(context)

' Creo un arreglo con los valores de los Ids
Dim valores(_data.Rows.Count - 1) As Integer

' Copio los Ids del DataTable al arreglo
With _data.Rows
For i As Integer = 0 To _data.Rows.Count - 1
valores(i) = CType(.Item(i).Item("Id"), Integer)
Next
End With

' Devuelvo una coleccion de valores inicializada con los Ids
Return New StandardValuesCollection(valores)

End Function

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

Return True

End Function

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

Return True

End Function

End Class

Luego solo queda que asignes esta clase como TypeConverter de la propiedad:

<TypeConverter(GetType(EnumDinamicoConverter))> _
Public Property MiPropiedad() As Integer
...
End Property

Eduardo A. Morcillo [MS MVP VB]
http://www.mvps.org/emorcillo
https://mvp.support.microsoft.com/p...4EF5A4191C
email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida