Con el presente explico -para aquellos a los que les pueda ser útil-, cómo consultar y asignar valores de forma dinámica a las propiedades de cualquier objeto o control de servidor. Requiere el Framework .Net 2.0+ (o superior)
A mi me costó bastante encotrar información, y me ha resultado de mucha utilidad para el gran proyecto -fase 1/3 para 2/3- que llevo desarrollando desde el 2007 [Fase1: GoldByWebs]
Primero mostraré el contexto con algún ejemplo y luego descubro el código mínimo-necesario para tal fin (para no enrollarse y para que descubras lo básico; así luego cada cual con lo suyo ..).
Supongamos que tenemos un GridView -o cualquier otro control e incluso un objeto(object)-, para el que los valores que queremos asignar a sus propiedades no los sabemos en tiempo de diseño; bien los recojemos de una base de datos, o bien de un array, o de donde sea pero sin saber de antemano; ni los valores que vamos a darlas, ni las mismas propiedades a las que asignar dichos valores, ..
-
EJEMPLO PRACTICO:
Tenemos un aplicativo en el que queremos que cada usuario pueda personalizar determinadas propiedades de un control GridView; al que llamaremos UserGridView.
Los usuarios acceden a un formulario donde se les pide que definan que valores quieren personalizar para determinadas propiedades de un GridView:
El usuario Pepito a definido que quiere personalizar dicho gridview con los siguientes valores:
Caption = “Pepito quiere así su gridview”, Width = “400px” y Backcolor = “Yelow”
Fulanita por ello define:
Caption = “GridView de Fulanita”, Width = “550px” , Backcolor = “Pink” y BorderStyle=”Dashed”.
Dichos datos son guardados -están almacenados pues- en la base de datos.
COMO PODEMOS HACER PARA QUE A LOS USUARIOS SE LES MUESTRE EL GRID COMO ELLOS QUERIAN. COMO PODEMOS ASIGNAR PROPIEDADES DE FORMA DINAMICA EN .NET
::TENIENDO Y TOMANDO COMO BASE::
-Que determinada consulta a la base de datos para determinado usuario a devuelto un List(of ListItem) con el par “NombreDePropiedad/ValorQueDefinióElUsuario” (.text/.value) [aunque también podría tratarse de un datatable, etc ..]
Lo que muchos hacen, -sólo si saben las propiedades que pueden definir los usuarios, o bien si implementan condicionales tipo If Not IsNothing- es programar algo así como:
-EJEMPLO NO DINÁMICO-
‘[Consulta a la DBA para rellenar este List con el Par NombrePropiedad/Valor (.text/.value)]
Dim ObjPropertiesListOfListItem As New List(Of ListItem)
‘ Según el gráfico, en este caso No Dinámico, sabemos que 0=Caption
UserGridView.Caption = ObjPropertiesListOfListItem(0).Value
UserGridView.Width = ObjPropertiesListOfListItem(1).Value
‘ ..
-
-EJEMPLO DINAMICO- IMPLEMENTANDO PROPIEDADES DINAMICAS EN .NET - REFLECTION
'.. [Consulta a la DBA para rellenar este List con el Par NombrePropiedad/Valor (.text/.value)]
Dim ObjPropertiesListOfListItem As New List(Of ListItem) yyy
'Creamos un ArrayList que se rellena con las propiedades que descubre la Function arrPropiedadesDeObjeto para el GridView
Dim arrDePropiedadesDeMiUserGridView As ArrayList = arrPropiedadesDeObjeto(UserGridView)
'Para tantas propiedades customizadas cómo se recojiesen de la dba (almacenadas en: ObjPropertiesListOfListItem)
For x = 0 To ObjPropertiesListOfListItem.Count - 1
'Comprobamos si el objeto (UserGridView) admite -tiene- x determinada propiedad; buscando si esta en el array
If arrDePropiedadesDeMiUserGridView.Contains(ObjPropertiesListOfListItem(x).Text) Then
'Si fuere el caso, llamamos a SetProperty para customizar el objeto con el valor de propiedad
SetProperty(UserGridView, ObjPropertiesListOfListItem(x).Text, ObjPropertiesListOfListItem(x).Value)
End If
Next
Ahora el Function y el Sub, tan esperados !!
''' <summary>Devuelve un array que contiene las propiedades de determinado objeto.</summary>
''' <param name="objeto">Cualquier objeto; aunque normalmente suelen ser Controles de Servidor</param>
Public Function arrPropiedadesDeObjeto(ByVal objeto As Object) As ArrayList
Dim PropertyInfo As System.Reflection.PropertyInfo() = objeto.GetType.GetProperties() 'Me.GetType.GetProperties()
Dim PropertyItem As System.Reflection.PropertyInfo
Dim _arrAvolver As New ArrayList
For Each PropertyItem In PropertyInfo : _arrAvolver.Add(PropertyItem.Name) : Next
Return _arrAvolver
End Function
''' <summary>Adjudica un valor a una propiedad de un determinado objeto</summary>
''' <param name="Objeto">El objeto al que -por reflection- pasar el PropertyValue</param>
''' <param name="PropertyName">El nombre de la propiedad</param>
''' <param name="PropertyValue">El valor que se la quiere adjudicar</param>
Public Sub SetProperty(ByVal Objeto As Object, ByVal PropertyName As String, ByVal PropertyValue As String)
Dim userType As Type = Me.GetType()
Dim UserProp As System.Reflection.PropertyInfo = userType.GetProperty(PropertyName)
UserProp.SetValue(Objeto, PropertyValue, Nothing)
End Sub
Las ventajas que ofrece el uso del dinamismo, són enormes en lo que refiere a escalabilidad, aunque hay que anotar que el uso de “Reflection” siempre conlleva una demora de tiempo, es decir, que las páginas o forms tardarán algo más en cargarse, pero no mucho ..
–——
El autor cede los derechos de publicación del presente artículo siempre y cuando se mencione al mismo y a esta url-dirección web.
———
