Foros del Web » Programación para mayores de 30 ;) » .NET »

Rellenar combo con Estructura y Datareader

Estas en el tema de Rellenar combo con Estructura y Datareader en el foro de .NET en Foros del Web. Bueno, disculpen por el titulo, no sabia como resumirlo pero lo imprtante es que salen las palabras clave. Pues miren, ando últimamente rellenando mis combobox ...
  #1 (permalink)  
Antiguo 08/11/2005, 06:45
Avatar de moNTeZIon  
Fecha de Ingreso: enero-2005
Ubicación: Lliçà de Munt - BCN
Mensajes: 1.625
Antigüedad: 19 años, 3 meses
Puntos: 9
Rellenar combo con Estructura y Datareader

Bueno, disculpen por el titulo, no sabia como resumirlo pero lo imprtante es que salen las palabras clave.

Pues miren, ando últimamente rellenando mis combobox con el siguente método.

Dada esta estructura:
Código:
  Public Structure OpcionCombo
    Private m_ValorReal, m_ValorMostrado As String

    Public Sub New(ByVal ValorMostrado As String, ByVal ValorReal As String)
      Me.m_ValorReal = ValorReal
      Me.m_ValorMostrado = ValorMostrado
    End Sub

    Public ReadOnly Property ValorReal() As String
      Get
        Return m_ValorReal
      End Get
    End Property

    Public ReadOnly Property ValorMostrado() As String
      Get
        Return m_ValorMostrado
      End Get
    End Property
  End Structure
Me lo monto así:
Código:
  Dim miEstado() As OpcionCombo = { _
  New OpcionCombo("Reparada", 1), _
  New OpcionCombo("Ausente", 2), _
  New OpcionCombo("Pendiente Pieza", 3), _
  New OpcionCombo("Pendiente Reparacion", 4)}
Y por último, asigno esta variable como Datasource:
Código:
  txtEstado.DataSource = miEstado
  txtEstado.DisplayMember = "ValorMostrado"
  txtEstado.ValueMember = "ValorReal"
  txtEstado.DataBindings.Add("SelectedValue", miDataSet, "Urgencias.Estado")
Pues bien, tengo el problema que no se como hacer lo mismo, pero recuperando los valores de un DataReader:
Código:
Private Function DameClientes() As OpcionCombo
  Dim misClientes As OpcionCombo
  Dim dR As OleDbDataReader
  Dim cM As New OleDbCommand("SELECT * FROM Clientes ORDER BY Apellidos, Nombre", miConn)
  miConn.Open()
  dR = cM.ExecuteReader
  While dR.Read
    misClientes.Add(New OpcionCombo(dR(0), dR(1))) '--> Esto es lo que no se hacer, deberia ser algo así, pero el método Add no existe obiamente.
  End While
  miConn.Close()
  return misClientes
End Function
Espero haberme explicado y que me puedan ayudar, seguro que es sencillito..
Gracias y saludos!
__________________
..:: moNTeZIon ::..
  #2 (permalink)  
Antiguo 08/11/2005, 10:19
Avatar de moNTeZIon  
Fecha de Ingreso: enero-2005
Ubicación: Lliçà de Munt - BCN
Mensajes: 1.625
Antigüedad: 19 años, 3 meses
Puntos: 9
Bien, por fin lo tengo.

Dentro del While

Redim Preserve misClientes(UBound(misClientes)+1)
misClientes(UBound(misClientes)) = New OpcionCombo(dr("Apellidos") & ", " & dr("Nombre"), dr("IdCliente"))

Saludos!
__________________
..:: moNTeZIon ::..
  #3 (permalink)  
Antiguo 08/11/2005, 10:24
Avatar de moNTeZIon  
Fecha de Ingreso: enero-2005
Ubicación: Lliçà de Munt - BCN
Mensajes: 1.625
Antigüedad: 19 años, 3 meses
Puntos: 9
Pero me ocurre un problema.
Quiero hacer el Binding el el Formulario con el mismo Dataset, donde tengo varias tablas.
Resulta que si lo hago como indiqué arriba, rellenando los datos con el datareader, una vez en el formulario, no me muestra el cliente que tiene asignado ese registro. Pero si selecciono alguno y guardo los datos si se guardan bien.
Entonces he intentado meterle como Datasource el propio Dataset y como DisplayMember y ValueMenber "Clientes.Apellidos" y "Clientes.IdCliente"
Pues bien, así funciona correctamente y me mantiene el Cliente que tiene asignado actualmente el registro.
Ahora bien, necesito mostrar también el Nombre al lado del Apellido. Como lo hago esta vez, manteniendo como DataSource el Dataset?
Sería fantastico, por ejemplo, si pudiera crearme un campo calculado en el DataSet que conste de los dos campos, para usarlo como DisplayMember.
Saben si puedo hacer esto?
Muchas gracias.
Un saludo.
__________________
..:: moNTeZIon ::..

Última edición por moNTeZIon; 09/11/2005 a las 04:54
  #4 (permalink)  
Antiguo 09/11/2005, 04:56
Avatar de moNTeZIon  
Fecha de Ingreso: enero-2005
Ubicación: Lliçà de Munt - BCN
Mensajes: 1.625
Antigüedad: 19 años, 3 meses
Puntos: 9
Socorro.. Alguna ayudita para conseguir este comportamiento pliz.

Miren, ahora mismo, con este código:
Código:
miDataSet.Tables("Clientes").Columns.Add("ApellidosNombre", GetType(String), "Apellidos + ', ' + Nombre")
    txtCliente.DataSource = miDataSet.Tables("Clientes")
    txtCliente.DisplayMember = miDataSet.Tables("Clientes").Columns("ApellidosNombre").ToString
    txtCliente.ValueMember = miDataSet.Tables("Clientes").Columns("IdCliente").ToString
    txtCliente.DataBindings.Add("SelectedValue", miDataSet, "Urgencias.Cliente")
Le intento agregar una columna calculada al dataset llamada ApellidosNombre, para poderla utilizar como DisplayMember en el txtCliente (que es un ComboBox). Pero asi tal cual, me muestra el IDCliente. En cambio, sustituyo el DisplayMember por el campo, por ejemplo, Apellidos, y lo muestra bien...

Alguna idea?

Mil gracias.
__________________
..:: moNTeZIon ::..

Última edición por moNTeZIon; 09/11/2005 a las 09:45
  #5 (permalink)  
Antiguo 09/11/2005, 11:12
Avatar de Jose_minglein2  
Fecha de Ingreso: noviembre-2004
Mensajes: 2.344
Antigüedad: 19 años, 5 meses
Puntos: 8
Has ejecutado paso a paso para ver si realmente está metiendo bien en el datatable el apellido y el nombre en esa columna???Quizá te está metiendo el id.
  #6 (permalink)  
Antiguo 09/11/2005, 12:51
Avatar de xknown  
Fecha de Ingreso: diciembre-2004
Ubicación: Cusco - Perú
Mensajes: 2.248
Antigüedad: 19 años, 3 meses
Puntos: 7
Hmm, no estás asignando bien las propiedades DisplayMember y ValueMember.
Código:
' Cambia
txtCliente.DisplayMember = miDataSet.Tables("Clientes").Columns("ApellidosNombre").ToString
txtCliente.ValueMember = miDataSet.Tables("Clientes").Columns("IdCliente").ToString

'Por

txtCliente.DisplayMember = "ApellidosNombre"
txtCliente.ValueMember = "IdCliente"
Saludos
__________________
Alex Concha
Buayacorp - Programación y Diseño
  #7 (permalink)  
Antiguo 10/11/2005, 03:45
Avatar de moNTeZIon  
Fecha de Ingreso: enero-2005
Ubicación: Lliçà de Munt - BCN
Mensajes: 1.625
Antigüedad: 19 años, 3 meses
Puntos: 9
Vaya, pues era eso. No veas con la mala info que corre por ahi, no lo había visto en un solo sitio, sino en varios.. pero en fin, gracias una vez más.

Ahora solo me queda un detalle.

En la columna del Grid donde se dibuja el combo, están los IdCliente de la tabla hija, que al posicionarse encima aparece el combo con los apellidos y el nombre, y al asignarlo guarda el Id y desaparece el combo.
Existe la forma que el dato que se muestra en la columna fuera también "Apellido, Nombre"? Manteniendo el valor real del Id, claro...
Todo esto es porqué el cliente no debe ver el Id, no le sirve para nada. Lo que tendría que ver son los nombres también...
Gracias!
__________________
..:: moNTeZIon ::..

Última edición por moNTeZIon; 11/11/2005 a las 03:38
  #8 (permalink)  
Antiguo 11/11/2005, 12:04
Avatar de moNTeZIon  
Fecha de Ingreso: enero-2005
Ubicación: Lliçà de Munt - BCN
Mensajes: 1.625
Antigüedad: 19 años, 3 meses
Puntos: 9
Algun empujoncito?
Seguro que alguien ha tenido que hacerlo alguna vez. Queda muy feo ver los IDs en la columna, en vez del Nombre o el apellido...
Solo me falta este detallito para tener el formulario a tutti pleni.

Muchas gracias y disculpen que reviva el post, pero con varias respuestas y tirando para abajo, podia quedar en el olvido.
__________________
..:: moNTeZIon ::..
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 19:41.