Visual Basic.NET - Llenar combobox desde Access, Visual Basic 2015

 
Vista:
sin imagen de perfil

Llenar combobox desde Access, Visual Basic 2015

Publicado por DaniM (18 intervenciones) el 21/01/2017 14:21:43
Buenas,

Estoy metiendo una base de datos a un combobox, según lo seleccionado en ese combobox, otro combobox se rellena. El problema es que la base de datos está en access y son campos, cada campo tiene el nombre de cada opción del primer combobox y así se completa el 2 combobox, pero como no tienen el mismo número de regristros, cuando por ejemplo selecciono la 2 opción del primer combobox, en el segundo combobox al final de las opciones hay valores en blanco. Mi intención es eliminar esas opciones en blanco.

Por ejemplo
1
2
3
4
Campo 1               Campo 2
3                         2
2                         1
1                        " "
Imagino que se podrá poner un If que diga : Si valor de combobox es " " o "NULL" quítalo. O con un bucle que compare todos los registros con el " " y que si coincide se pueda eliminar.
La intención es que en el primer combobox (Combobox2) estén las capitales de provincia y en el segundo (Combobox 3) los municipios.

La conexiónse realiza a la base de datos Access y luego enlazo directamente con un BindingSource y con un TableAdapter.

Private Sub ComboBox2_TextChanged(sender As Object, e As EventArgs) Handles ComboBox2.TextChanged

If ComboBox2.Text = "Albacete" Then
ComboBox3.DataSource = MunicipiosBindingSource
ComboBox3.DisplayMember = "Albacete"

If ComboBox2.Text = "Almería" Then
ComboBox3.DataSource = MunicipiosBindingSource
ComboBox3.DisplayMember = "Almería"

......

End Sub

Así con todos.

El problema es que como por ejemplo Albacete tiene 90 municipios y Almería tiene 100 (por ejemplo) el desplegable del combobox de municipios (Combobox 3) me muestra para Albacete 90 municipios y 10 huecos.

Hay municipios donde aparecen 50 en blanco..


Otra opción que he realizado es poner en vez de los municipios en campos, en tablas de una misma base de datos y realizar un bindingSource a cada tabla y así no hay huecos pero en principio me ralentiza el programa.

Lo he realizado al contrario, es decir poniendo cada provincia como nombre de tabla y en el primer campo pongo todos sus municipios, así tengo unas 50 tablas (1 por provincia) pero así no tengo el problema de los huecos vacíos.... El problema de hacerlo así es que cuando inicio el programa, está como 15 segundos invisible (imagino que cargando todas las tablas y conexiones) Tengo unas 50 bindingSource con sus respectivos TableAdapter.

El codigo es prácticamente igual. Pero al hacer la referencia, el bindingSource es diferente para cada 1.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Public Class Datos
Private Sub Municipios_Load(sender As Object, e As EventArgs) Handles MyBase.Load
         Me.ÁlavaTableAdapter.Fill(Me.Municipios_acabadosDataSet2.Tabla1)
         Me.AlbaceteTableAdapter.Fill(Me.Municipios_acabadosDataSet2.Tabla1)
 
Private Sub ComboBox2_TextChanged(sender As Object, e As EventArgs) Handles ComboBox2.TextChanged
         If ComboBox2.Text = "Albacete" Then
            ComboBox3.DataSource = BindingSource
            ComboBox3.DisplayMember = "Campo1"
        End If
        If ComboBox2.Text = "Alicante" Then
            ComboBox3.DataSource = BindingSource1
            ComboBox3.DisplayMember = "Campo1"
 End If
 End Sub



Estoy abierto a nuevas formas de hacerlo con tal de que sea mas fluido.

Utilizo Visual Basic 2015

Muchas Gracias!

Saludos.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de Diego
Val: 605
Bronce
Ha mantenido su posición en Visual Basic.NET (en relación al último mes)
Gráfica de Visual Basic.NET

Llenar combobox desde Access, Visual Basic 2015

Publicado por Diego (190 intervenciones) el 23/01/2017 04:05:22
Hola DaniM, lo que yo utilizaría es el metodo select de los datatable que enlazas al combobox2, que supuestamente es el que se rellena segun lo elegido en el combobox1. De ese modo filtrarias tu campo1 segun en valor Text de tu combobox1, para que sea ese resultado el que enlazas con el combobox2.

O la propiedad filter de tu BindingSource1.....

No se si fui claro, cualquier duda, consultas.
Saludos y +bytes.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

Llenar combobox desde Access, Visual Basic 2015

Publicado por Daniel (18 intervenciones) el 23/01/2017 10:47:05
Buenos días,

Podrías comentarme como hago lo del selec o lo del filtro?
He buscado ambas pero no se como poner el código...

Ahora funciona, pero me ha ralentizado el programa, ya que utilizo un BindingSource para cada provincia.. (tengo 52 BindingSource).
Crees que utilizando un solo BindingSource y con una de las soluciones que me propones va a agilizar el programa?
Mi única intención es agilizar el programa.

Muchas gracias!!

Un saludo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Diego
Val: 605
Bronce
Ha mantenido su posición en Visual Basic.NET (en relación al último mes)
Gráfica de Visual Basic.NET

Llenar combobox desde Access, Visual Basic 2015

Publicado por Diego (190 intervenciones) el 24/01/2017 13:12:04
En tu caso, es preferible utilizar datatables. A ver si puedo ponerlo en un modo mas grafico.
Tenés 2 columnas, en una de ellas está la provincia, y en el segundo campo tenes la comuna. Bueno, suponé el siguiente código:

1
2
3
4
dim DA as new oledbdataadapter("SELECT campo1, campo2 FROM tabla1 ORDER BY campo1, campo2", conexion)
dim datos as new datatable
 
da.fill(datos)

Hasta ahí, tenés todos los datos cargados en 2 columnas (campo1 y campo2)

Ahora..... para obtener todos los registros de la tabla1 donde el campo1 cumpla cierta condicion, solo tenés que ejecutar la instruccion:

1
dim filtro as datatable = datos.select("campo1 ='" & combobox1.text & "'").copytodatatable

Ese codigo debería ir en algun evento del combobox1 como selectionchanged o selectedindexchanged , y lo que va a hacer es lo siguiente, va a filtrar todos los registros donde el campo1 tenga el valor seleccionado en el combobox1. El combobox1.text va entrecomillado simple, ya que es un string lo que filtra. Bueno, el copytodatatable final es para que transforme el resultado en un datatable que se lo asignas al nuevo objeto de nombre filtro. Lo unico que resta es enlazar el combobox2 a ese datatable.

1
combobox2.datasource = filtro

Listo, asi deberías poder primero seleccionar en combobox1 y en base a esa seleccion, se llena el combobox2.
Espero haberte podido ayudar.

Saludos y +Bytes
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar