Apariencia de lista

09/08/2004 - 20:20 por Emiliano | Informe spam
Hola a todos!
Según sé la nueva forma en .NET de darle apariencia a la
lista es manejando el evento OnDrawItem (tengo algunos
ejemplo de eso). Bueno, yo quiero justamente recuperar los
objetos que introduje en la lista y mostrar el miembro del
objeto segun lo que ponga en el DisplayMember... Lo que me
falta saber es como acceder a este miembro si de antemano
no lo conozco...
Gracias

Preguntas similare

Leer las respuestas

#6 Emiliano
11/08/2004 - 14:53 | Informe spam
Creo entender tu idea... deberia crear dentro de mi clase
algo asi como una propiedad por defecto a la que le paso
como parametro el string del nombre de la propiedad que
quiero acceder y luego dentro de esa propiedad un Select
para retornar la propiedad seleccionada... pero esto lo
deberia hacer sobreescribiendo esa propiedad en cada clase
heredada, no es asi??
Yo me imaginaba que habia una forma más automática de
hacerlo, porque de alguna manera ya la lista lo hace, es
decir, yo le pongo un objeto (cualquiera), le seteo la
propiedad DisplayMember, e internamente ya sabe que
miembro de la clase mostrar.
Voy a tratar de seguir alguna solución intermedia (aunque
no sea tan buena) para no tener que agregar tanto codigo.
Igualmente muchas gracias por ayudarme.

Bueno, ahora si creo comprenderlo. Lo que no se es si
sabré explicarlo. :-)

Bases deberás implementar alguna interface para recorrer
los elementos Base, lo ideal es que soporte IList o
IListSource, por seguir la norma del framework sobre
enlace a datos. Al menos, procura que soporte
IEnumerable.

Cualquiera de estas interfaces, deberá permitir obtener
los elementos de tipo Base, simplemente reocrriendolo con
For Each. A su vez Base deberá tener un miembro para
acceder a sus campos. En este caso, doy por hecho que
este miembro es una propiedad predeterminada:

O sea:

dim fila as Base
for each fila in Me.mBases
msgbox(fila(Me.DisplayMember))
next

¿Se comprende lo que quiero decir?
.

Respuesta Responder a este mensaje
#7 Tristan
11/08/2004 - 15:10 | Informe spam
No comprendo tu razonamiento. ¿Por qué tendrías que sobreescribir esa
propiedad en cada clase heredada?.

De todas formas, tal y como te digo, si se puede usar reflection para
obtener la propiedad. GetProperty(...) y de esta GetValue(...) sirven para
obtener el valor de una propiedad en función de su nombre. Pero esta debe
ser siempre la última opción. Reflection es mucho, pero mucho menos
eficiente que un enlace estático, y realmente no veo por qué no puedes
hacerlo en tus clases.

Juan Carlos Badiola
MVP - C#
Respuesta Responder a este mensaje
#8 Tristan
11/08/2004 - 16:38 | Informe spam
Bueno, no tengo claro haber comprendido la idea, pero a ver si es algo así
lo que quieres:

Public Class Base
Private _Nombre As String
Property Nombre() As String
Get
Return _Nombre
End Get
Set(ByVal Value As String)
_Nombre = Value
End Set
End Property
End Class

Public Class Bases
Inherits CollectionBase
Sub Add(ByVal value As Base)
Me.List.Add(value)
End Sub

Default Public Property Item(ByVal index As Integer) As Base
Get
Return DirectCast(List(index), Base)
End Get
Set(ByVal Value As Base)
List(index) = Value
End Set
End Property
End Class


Dim lista As New Bases
Dim unaBase As New Base
unaBase.Nombre = "Juan Carlos"
lista.Add(unaBase)
unaBase = New Base
unaBase.Nombre = "Pedro"
lista.Add(unaBase)
ListBox1.DataSource = lista
ListBox1.DisplayMember = "Nombre"


Esta parte es reflection:

Dim item As Base
For Each item In lista
Dim propiedad As PropertyInfo item.GetType().GetProperty(ListBox1.DisplayMember)
MsgBox(propiedad.GetValue(item, Nothing))
Next


Juan Carlos Badiola
MVP - C#
Respuesta Responder a este mensaje
#9 Emiliano
11/08/2004 - 17:50 | Informe spam
En general no son listas que se carguen con mas de 50
elementos (como mucho) y entonces que el rendimiento no se
veria tan perjudicado con el uso de reflection (el ejemplo
me es muy util!!!).
Por otra parte, sobre la idea de la propiedad por defecto,
entonces soy yo el que no entendio, porque lo que yo
entendí era mas o menos esto...

Default Public ReadOnly Property Miembros(ByVal
NombreMiembro as string)
Get
Select NombreMiembro
Case "Nombre"
Return me.Nombre
Case "Apellido"
Return me.Apellido
End Select
End Get
End Property

...puesto en cada clase

Bueno, no tengo claro haber comprendido la idea, pero a


ver si es algo así
lo que quieres:

Public Class Base
Private _Nombre As String
Property Nombre() As String
Get
Return _Nombre
End Get
Set(ByVal Value As String)
_Nombre = Value
End Set
End Property
End Class

Public Class Bases
Inherits CollectionBase
Sub Add(ByVal value As Base)
Me.List.Add(value)
End Sub

Default Public Property Item(ByVal index As Integer)


As Base
Get
Return DirectCast(List(index), Base)
End Get
Set(ByVal Value As Base)
List(index) = Value
End Set
End Property
End Class


Dim lista As New Bases
Dim unaBase As New Base
unaBase.Nombre = "Juan Carlos"
lista.Add(unaBase)
unaBase = New Base
unaBase.Nombre = "Pedro"
lista.Add(unaBase)
ListBox1.DataSource = lista
ListBox1.DisplayMember = "Nombre"


Esta parte es reflection:

Dim item As Base
For Each item In lista
Dim propiedad As PropertyInfo >item.GetType().GetProperty(ListBox1.DisplayMember)
MsgBox(propiedad.GetValue(item, Nothing))
Next


Juan Carlos Badiola
MVP - C#


.

Respuesta Responder a este mensaje
#10 Tristan
11/08/2004 - 20:20 | Informe spam
Ummm, pues es muy posible que tengas razón. :-)

Creo que ahora ya entiendo tu problema.


Juan Carlos Badiola
MVP - C#
email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una pregunta AnteriorRespuesta Tengo una respuesta
Search Busqueda sugerida