El uso de los controles ComboBox y ListBox esta limitado al numero
maximo de opciones que se mostraran en esos controles. Aunque
tecnicamente un ComboBox o ListBox puede contener miles de items, en
la practica la realidad es que estos controles resultan muy poco
practicos en casos donde se tiene mas de una docena de opciones
posibles.
Mas claramente, usar un ComboBox o un ListBox para permitirle al
usuario seleccionar entre un maximo de 12 de opciones es completamente
viable; hacer lo mismo para que el usuario seleccione uno entre
decenas o cientos de opciones, no solamente no es practico sino que
puede llegar a ser bastante lento.
En e caso especifico de la seleccion de clientes, ademas de ser
inpractico debido a la cantidad de opciones posibles, tambien se le
anade el tema de la velocidad con la que se puede llenar el combobox o
listbox.
Supongamos que vendemos nuestro sistema a un cliente nuevo. Al inicio,
mientras el usuario va alimentando la tabla de clientes, el codigo
funcionara perfectamente. Pero a medida que el numero de clientes vaya
pasando de apenas unos pocos a unos cientos, y luego a unos miles, nos
encontraremos conque nuestro programa se tarda unos cuantos segundos
en poder llenar el combobox o listbox con todos los clientes
registrados.
Incluso si incluimos la posibilidad de ir filtrando interactivamente a
lista en base a lo que el cliente va escribiendo, de modo de solo
mostrar aquellos clientes que coinciden con la pista indicada, lo
cierto es que es muy probaable que las primeras 2 o 3 veces que
llenemos el combo o listbox con las opciones resultantes del
fiiltrado, aun tengamos que manejar cientos de resultados posibles.
En el pasado, yo he probado distintas tecnicas para manejar esta
situacion, desde el tipico codigo + descripcion, hasta esta tecnica
del combobox / listbox filtrado dinamicamente. Hasta ahora, solo dos
tecnicas me han funcionado de manear practica en ambientes de
produccion:
1. TextBox + Grid + (2) CommandButton: el usuario indica parte del
nombre del cliente deseado en el TextBox, y yo uso esa informacion
para realizar un query sobre la BD que me traiga los clientes que
coinciden con esa pista y muestro el cursor resultante en el Grid. Si
el cliente deseado aparece en el grid, el usuario pulsa en un boton
"Aceptar" que selecciona el codigo del cliente que este seleccionado
en el Grid. Si el cliente no aparece en la lista y se desea ingresarlo
como cliente nuevo, se pulsa en un boton "Nuevo Cliente" que invoca un
dialogo para tal efecto.
La ventaja de este metodo es que el Grid ofrece dos ventajas
importante sobre el ComboBo / ListBox: mayor velocidad de carga (casi
instantanea de hecho) y capacidad ilimitada de opciones.
2. Textbox + ComboBox: el usuario usa el TextBox para indicar el
codigo del cliente deseado o parte del nombre del mismo. Al pulsar
Enter se invoca una rutina que valida si el texto indicado corresponde
a un codigo de cliente registrado; si es el caso, se traen los datos
del cleinte y se llena el ComboBox con un solo registro
correspondiente a los datos del cliente. Si el texto indicado no
corresponde al codigo de ningun cliente registrado, entonces se asume
que es parte del nombre y se hace un query que traiga todos los
clientes cuyo nombre contenga el texto indicado. Con este cursor se
procede a llenar el ComboBox, anadiendo una opcion adicional al final
que diga "(Nuevo cliente)". Si el usuario seleccion cualquier opcion
que sea <= ListCount, entonces se toma el codigo de cliente del item
seleccionado, se asigna el valor al TextBox y se vuelve a invocar el
codigo de validcion (que esta vez si encontrara el cliente
directamente). Si se selecciona la ultima opcion (ListIndex =
ListCount), entonces se invoca un dialogo de creacion del cliente. Al
cerrarse este dialogo (asumiendo que efectivamente se creo el
cliente), se asigna el codigo del nuevo cliente al TextBox y se invoca
de nuevo la rutina de validacion, de modo que caiga en el caso 1
(textbox corresponde a codigo de cliente existente).
Espero que estas ideas te sean de utilidad
Saludos
Victor Espina