none
Modificar Datos de un Combobox RRS feed

  • Pregunta

  • 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

                                 Campo 1             Campo 2

                                      3                         2

                                      2                         1

                                      1                        " "

    Imagino que se podrá poner un If que diga : Si valor de combobox es " " o "0" quítalo. O con un bucle que compare todos los registros con el " " y que si coincide se pueda eliminar.

    Utilizo Visual Basic 2015

    Gracias!

    Un saludo.

     


    • Editado Damuoza martes, 17 de enero de 2017 12:51
    • Cambiado Enrique M. Montejo martes, 24 de enero de 2017 12:21 Pregunta relacionada con el acceso a datos con Access.
    martes, 17 de enero de 2017 12:51

Todas las respuestas

  • hola, podrías postear algo del código de como lo vienes haciendo?


    Si la respuesta te fue útil vótala como tal,y si fue respuesta márcala. Solo dejo en el foro mis post si fueron útiles , de lo contrario y por mantener el orden los borro. Saludos. Lima-Perú.

    martes, 17 de enero de 2017 13:45
  • Hola, Claro! 

    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.

    Muchas gracias por la ayuda!

    miércoles, 18 de enero de 2017 8:02
  • Hola, has considerado plantearlo de esta forma

    http://ltuttini.blogspot.pe/2010/03/winforms-combobox-anidados.html


    Si la respuesta te fue útil vótala como tal,y si fue respuesta márcala. Solo dejo en el foro mis post si fueron útiles , de lo contrario y por mantener el orden los borro. Saludos. Lima-Perú.

    miércoles, 18 de enero de 2017 13:53
  • Buenas, 

    He estado mirando el artículo, y aunque no utiliza visual basic, lo que entiendo es que comprueba que esté o no vacio para rellenarlo. 

    Mi problema es que sí se completa pero se completa con opciones vacías. Aquí comentaba lo que pasaba.

    Mi intención es eliminar esas opciones en blanco.

    Por ejemplo

                                 Campo 1             Campo 2

                                      3                         2

                                      2                         1

                                      1                        " "

    El combobox al seleccionar el campo 1, me permite elegir entre 3 2 1 y cuando selecciono el campo 2 me permite elegir entre 2 1 y "Espacio vacío (en blanco)"

    Imagino que se podrá poner un If que diga : Si valor de combobox es " " o "0" quítalo. O con un bucle que compare todos los registros con el " " y que si coincide se pueda eliminar.

    Utilizo Visual Basic 2015

    Un saludo.

    Gracias.

    miércoles, 18 de enero de 2017 14:42
  • Damuoza,

    Creo que el diseño de la tabla no es la correcta, lo que defines como columnas deberían ser filas.

    La consulta de selección (sql) debe filtrar por aquellas filas que no deseas mostrar, por ejemplo:

    SELECT * FROM NombreTabla WHERE Campo2 <> '' AND Campo2 <> ' '  AND Campo2 <> '0'


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    • Propuesto como respuesta Joyce_AC jueves, 19 de enero de 2017 15:24
    miércoles, 18 de enero de 2017 15:20
  • Buenas, 

    Utilizo conexión a base de datos porque son alrededor de 8000 municipios los que introduzco. Cada Provincia tiene muchos municipios. 

    Creo que una posible solución sería lo que ha comentado Willams, generar una consulta a la base y que con un filtro quite o evite los valores vacíos ( creo que los llama NULL) y así se pudieran evitar. 

    He intentado generar la consulta pero no se como hacerlo. 

    Además, cada vez que creo la consulta me crea un FillBy que no se para que es. 

    Muchas gracias por su ayuda. 

    Un saludo.

    miércoles, 18 de enero de 2017 16:16
  • sería bueno que postearas la estructura de tu tabla o tablas que intervienen en el proceso.

    Si la respuesta te fue útil vótala como tal,y si fue respuesta márcala. Solo dejo en el foro mis post si fueron útiles , de lo contrario y por mantener el orden los borro. Saludos. Lima-Perú.

    miércoles, 18 de enero de 2017 16:19
  • Public Class Datos Private Sub Datos_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 = "Albacete" End If If ComboBox2.Text = "Alicante" Then ComboBox3.DataSource = BindingSource1 ComboBox3.DisplayMember = "Alicante" End If End Sub

    Este es parte del código, ya que es igual para todas las provincias. 

    Enlazo con la tabla 1 que contiene como campos todos las provincias y sus registros son los municipios. 

    Como la cantidad de municipios de Albacete no es la misma que la de Alicante, tengo valores vacios cuando selecciono por ejemplo Alicante. 

    Gracias.

    miércoles, 18 de enero de 2017 16:42
  • Como te han comentado la estructura de tu tabla no esta del todo bien deberías tener las provincias como filas y no como cabeceras, si te animas  a hacerlo con código tal como lo tienes quizas esto ayude

    Imports System.Data.OleDb
    
    Public Class Form2
    
    
        Public Function ColumnNames() As DataTable
            Dim dt As New DataTable
            dt.Columns.Add("PROVINCIAS", GetType(String))
    
            Dim tableName As String = "Provincias"
            Dim filterValues = {Nothing, Nothing, tableName, Nothing}
    
            Using conn = New OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=|DataDirectory|/Provincias.accdb")
                conn.Open()
                Dim columns = conn.GetSchema("Columns", filterValues)
                For Each row As DataRow In columns.Rows
                    dt.Rows.Add(row.Item("column_name"))
                Next
            End Using
            Return dt
        End Function
    
        Private Sub Form2_Load(sender As Object, e As EventArgs) Handles MyBase.Load
            cboProvincias.DisplayMember = "PROVINCIAS"
            cboProvincias.ValueMember = "PROVINCIAS"
            cboProvincias.DataSource = ColumnNames()
        End Sub
    
        Private Sub cboProvincias_SelectionChangeCommitted(sender As Object, e As EventArgs) Handles cboProvincias.SelectionChangeCommitted
            PoblarMunicipios(cboProvincias.Text)
    
        End Sub
    
        Sub PoblarMunicipios(ByVal provincia As String)
            Dim dt As New DataTable
    
            Using conn = New OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=|DataDirectory|/Provincias.accdb")
                conn.Open()
                Dim cmd As New OleDbCommand("select " + provincia + " from provincias where " + provincia + " is not null", conn)
                Dim da As New OleDbDataAdapter(cmd)
    
                da.Fill(dt)
    
            End Using
    
            cboMunicipios.DataSource = dt
            cboMunicipios.DisplayMember = provincia
            cboMunicipios.ValueMember = provincia
    
        End Sub
    End Class


    Si la respuesta te fue útil vótala como tal,y si fue respuesta márcala. Solo dejo en el foro mis post si fueron útiles , de lo contrario y por mantener el orden los borro. Saludos. Lima-Perú.

    • Propuesto como respuesta Joyce_AC jueves, 19 de enero de 2017 15:24
    • Votado como útil Joyce_AC lunes, 23 de enero de 2017 17:25
    miércoles, 18 de enero de 2017 17:52
  • Buenas, 

    He estado mirando el código que me propones pero no lo entiendo demasiado bien, disculpa. 

    Creo que lo que proponéis es que en Access aparezca:

    PROVINCIAS            Campo1           Campo2           Campo3 ....

    Albacete                 Municipio1      Municipio 2         Municipio 3

    Alicante                  Municipio1      Municipio 2        

    Almeria                  Municipio1      Municipio 2          Municipio 3

         ...

    (La he puesto suponiendo que Alicante tiene solo 2 municipios)

    Es eso lo que sugerís? No estoy familiarizado con el uso del DataTable y conexión OleDb (uso la opción que me permite realizarlo desde el combobox para establecer conexión), si ordeno el Access como acabo de mostrar y pongo el codigo "igual" cambiando algunas cosas como las forms y combobox, funcionaría? 

    Entiendo que usando Datatable sería menos "pesado" de trabajar ya que mi intención es reducir el tiempo que tarda en abrir el form. Cuando lo realicé con bindingSource para cada provincia (cada provincia en 1 tabla) provocó que el form no apareciera durante unos 15 segundos y ya luego aparecía. 

    Muchas gracias. 

    Un saludo.

    jueves, 19 de enero de 2017 11:47
  • Damuoza,

    No es la manera correcta como quieres estructurar los datos, desde mi punto de vista puedes hacer dos cosas:

    1. Diseñar una tabla donde se permita referenciar a las filas "padre" (dentro la misma tabla), en ese sentido es fácil saber los municipios de una provincia como la provincia a la que pertenece determinado municipio.
    2. Crear dos tablas: una para contener provincias y la segunda para contener los municipios. 

    Te recomiendo leer el siguiente enlace, Crear relación entre una tabla persona y una tabla domicilio.


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    • Propuesto como respuesta Joyce_AC viernes, 20 de enero de 2017 16:11
    jueves, 19 de enero de 2017 15:43
  • Buenas, 

    Me podrías poner un ejemplo de como se realiza lo que me propones? No tengo ni idea de como hacerlo. 

    Crees que haciéndolo así permitiría ser mas fluido al programa? Ya que son unos 8000 municipios y lo mismo de ninguna manera va a ser mas fluido...

    Muchas gracias. 

    sábado, 21 de enero de 2017 13:27