• Viernes 8 de Noviembre de 2024, 21:47

Autor Tema:  ComboBox utilizando Listitem  (Leído 1705 veces)

mafering

  • Nuevo Miembro
  • *
  • Mensajes: 3
  • Nacionalidad: ec
    • Ver Perfil
ComboBox utilizando Listitem
« en: Miércoles 13 de Mayo de 2009, 00:22 »
0
Saludos amigos

Necesito que me ayuden con un problema que se me presento, al cargar información en un combobox utilizando la clase ListItem.
Utilizo esta clase por que necesito el id de cada registro pero que en el combo me liste solo los nombres.

El caso es que en una consulta sql me despliega casi 1500 registros y al utilizar la clase Listitem se demora una eternidad en cargar estos datos en el combo. Así que la ayuda que necesito es ver si hay alguna forma de optimizar esto o si hay otro método mucho mejor para cargar los registros al combobox y poder optener el id de cada registro para utilizar mas adelante..

El código que utilizo para cargar los datos en el combo es el siguiente:

Dim ObjCtoComplemtario As ListItem

''Cargo mi dr con los datos con el sql respectivo
Do While dr.Read()

     ObjCtoComplemtario = New L    ListItem(dr.Item("SPROY_NOMBRE").ToString(), CInt(dr.Item("CTO_ID")))

      CboContrato.Items.Add(ObjCtoComplemtario)

Loop

El problema se da justo cuando pasar por el bucle.. do while


De antemano gracias por su valiosa ayuda..

Att. Mauricio

Nebire

  • Miembro HIPER activo
  • ****
  • Mensajes: 670
    • Ver Perfil
Re: ComboBox utilizando Listitem
« Respuesta #1 en: Jueves 14 de Mayo de 2009, 15:54 »
0
Cita de: "mafering"
''Cargo mi dr con los datos con el sql respectivo
Do While dr.Read()
Att. Mauricio

Podrías especificar que tipo de objeto es 'dr' ? , a ti te parece obvio, pero yo tengo que jugar a adivinar...
Una vez me lo aclares, podré confirmar si es lo que me temo... y darte alguna indicación para solventarlo.
«Ma non troppo»
----> ModoVacaciones = False<----

mafering

  • Nuevo Miembro
  • *
  • Mensajes: 3
  • Nacionalidad: ec
    • Ver Perfil
Re: ComboBox utilizando Listitem
« Respuesta #2 en: Jueves 14 de Mayo de 2009, 18:13 »
0
en la variable dr se asigna un DataReader eso es todo..
Gracias por tu ayuda..!!!

Saludos
Mauricio

Nebire

  • Miembro HIPER activo
  • ****
  • Mensajes: 670
    • Ver Perfil
Re: ComboBox utilizando Listitem
« Respuesta #3 en: Domingo 17 de Mayo de 2009, 13:26 »
0
Cita de: "mafering"
en la variable dr se asigna un DataReader eso es todo..
Gracias por tu ayuda..!!!

Saludos
Mauricio

Bueno al decir que tipo, esperaba que pusiersa la declaración, al final del post te digo por qué ...

De entrada puedes hacer un rendimiento más óptimo al bucle si conoces el tipo de datos que tratas de recuperar. el datareader recupera los datos como objetos, por ello luego debes hacer una conversión al tipo deseado utilizando .ToString . si sabes que es un String y un integer invócalos de esta manera:
Código: vb.net
  1.  
  2.     dr.gestString("SPROY_NOMBRE")
  3.     dr.GetInt32("CTO_ID")
  4.  
  5.  
Con ello se ahorra la conversión desde object al tipo de datos que es.

Otra mejora que puedes hacer es que si conoces la posición del campo dentro de la tabla te refieras con su índice en vez de con su nombre. Esto tiene una desventaja que es preciso conocer, si en un futuro haces modificaciones en la tabla y el campo 'SPROY_NOMBRE' antes era (pongamos) el campo nº 2 y ahora es el campo nº 3, no nos devolverá lo que esperamos... Por contra sucede la inversa, si en un futuro cambiamos el nombre del campo 2 que antes se llamaba 'SPROY_NOMBRE'  y ahora se llama 'NOMBRE_SPROY' , no lo encontrará pero todavía si lo encontraría referenciando el campo 2. en fin esto son decisiones que deben tomarse cuando uno diseña y debe decidir si hay cambios en un futuro como serán los cambios, añadir, quitar,reordenar campos ? o incluso cambiar nombres de campos.. ?

Esto se haría del siguiente modo:
 
Código: vb.net
  1.  
  2.     dr.gestString(2)  ' el campo eneavo que le corresponda.
  3.     dr.GetInt32(6)  ' por poner un ejemplo...
  4.  
  5.  

Sin embargo con esto sólo se consiguen mejoras no muy significativas (para el problema que supuestamente tu tienes). Me temo que el problema lo tienes en la propia declaración del DataReader, qué es lo que realmente quería ver cuando te solicitaba que tipo de datos era dr, el nombre lo sugiere (aunque prefiero verificarlo), sin embargo esperaba que pusieras la declaración.

Ponme la declaración de la línea:
Código: vb.net
  1.  
  2. dim dr as sqldatareader = Command.Execute....( .... )
  3.  
  4.  
Es con esto (dr= command.Exec....) , con lo que pudo confirmar mis sospechas e indicarte la solución.
«Ma non troppo»
----> ModoVacaciones = False<----