none
¿Como lleno un comboBox con los encabezados de una Bd? RRS feed

  • Pregunta

  • Hola, tengo un comboBox que quiero llenar con los encabezados de una tabla, lo intento con una función:

    Function consulta(ByVal Sql As String)
    
            Dim Dt As New DataTable
    
            Try
    
                Dim adapter As New NpgsqlDataAdapter(llenaSql, conexion)
    
                adapter.Fill(Dt)
    
            Catch ex As Exception
    
                MessageBox.Show("No se completo la consulta por: " & ex.ToString)
    
            End Try
    
            Return Dt
    
        End Function

    mi consulta SQL es: SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME='datos' ORDER BY ORDINAL_POSITION;

    El problema que tengo es que no sé como rellenar el combo box con los encabezados de la tabla, sí con los valores de una columna en concreto. ¿Podéis echarme un cable? Gracias,

    domingo, 14 de marzo de 2021 9:32

Respuestas

  • Hola, ya lo he solucionado el código resultante es, en el load:

    ... 
    While reader1.Read()
    
                maximo_cbox.Items.Add(reader1(0))
                maximo_cbox.DisplayMember = "COLUMN_NAME"
                minimo_cbox.Items.Add(reader1(0))
                minimo_cbox.DisplayMember = "COLUMN_NAME"
    
            End While
    ...

    y luego en el evento SelectedIndexChanged:

    Private Sub minimo_cbox_SelectedIndexChanged(sender As Object, e As EventArgs) Handles minimo_cbox.SelectedIndexChanged
    
            conexion.Open()
    
            Dim valor1 As String = minimo_cbox.Text
    
            Dim consulta1 As String = " Select min(" & valor1 & ") from datos; "
            Dim comando1 As NpgsqlCommand = New NpgsqlCommand(consulta1, conexion)
            Dim lector1 As NpgsqlDataReader
    
            lector1 = comando1.ExecuteReader
    
            If lector1.Read() Then
    
                minValor_lbl.Text = lector1(0)
    
            End If
    
            conexion.Close()
            conexion.Open()
    
            Dim consulta3 As String = " Select " & valor1 & " from minimos; "
            Dim comando3 As NpgsqlCommand = New NpgsqlCommand(consulta3, conexion)
            Dim lector3 As NpgsqlDataReader
    
            lector3 = comando3.ExecuteReader
    
            lector3.Read()
    
            minValor_lbl.Text = minValor_lbl.Text & " SOBRE UN MÍNIMO DE " & lector3(0)
    
            lector1.Close()
            lector3.Close()
            conexion.Close()
    
        End Sub
    Gracias por el interés.

    lunes, 15 de marzo de 2021 19:45

Todas las respuestas

  • no sé como rellenar el combo box con los encabezados de la tabla, sí con los valores de una columna en concreto.

    Fíjate que esa consulta que has escrito precisamente devuelve una tabla, y los datos de esa tabla resultan ser los encabezados de la otra tabla.

    Si sabes llenar el combo con los valores de una columna, entonces ya lo tienes: Llénalo con los valores de la columna que te devuelve la consulta que acabas de escribir. Esos valores resultan ser los encabezados de la tabla 'datos'.

    En resumen, toma el Dt que ya tienes, ponlo en el DataSource del combo, y al combo ponle que el DisplayMember es "COLUMN_NAME".

    • Marcado como respuesta solilopi domingo, 14 de marzo de 2021 10:07
    • Desmarcado como respuesta solilopi domingo, 14 de marzo de 2021 19:01
    domingo, 14 de marzo de 2021 9:56
  • Mil gracias!!!
    domingo, 14 de marzo de 2021 10:07
  • Hola, disculpa, pero entonces en el SelectedIndex que pongo, porque no me devuelve bien lo que le pido.

    minimo_cbox.DataSource = dt
            minimo_cbox.DisplayMember = "COLUMN_NAME"
            minimo_cbox.SelectedIndex = 0

    Me da error en el select, me dice que no existe la función min, cuando ejecutas el SQL en DBeaver y no hay problema.

    Npgsql.PostgresException: '42883: no existe la función min()'. ¿Qué puedo hacer?. Gracias.

    domingo, 14 de marzo de 2021 19:06
  •  no existe la función min()

    Pero si dijiste que la sentencia que tenías era "SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME='datos' ORDER BY ORDINAL_POSITION;"

    Ahí no se usa ninguna función min(). Se te ha tenido que mezclar con alguna otra sentencia que tenías en otro sitio. Pon un punto de ruptura con el debugger y examina lo que te llega en la variable llenaSql justo antes de ejecutar el Fill.

    Lo del SelectedIndex no lo entiendo. ¿Qué tiene que ver con este asunto? Esa propiedad se usa para determinar cuál es el valor que quieres que aparezca por defecto después de cargarlos, por ejemplo, si pones minimo_cbox.SelectedIndex = 0 se selecciona el primer elemento. Pero esto solo puedes hacerlo después de haber cargado los datos. Si lo haces antes da un error porque todavía no tiene ningún elemento, y en consecuencia no puedes seleccionar el primero de los elementos.

    domingo, 14 de marzo de 2021 19:34
  • Hola, el problema que tengo es que  utilizo la propiedad SelectedIndexChanged del ComboBox para con la función Select min... llenar una variable:

    Private Sub minimo_cbox_SelectedIndexChanged(sender As Object, e As EventArgs) Handles minimo_cbox.SelectedIndexChanged
    
            conexion.Open()
    
            Dim valor1 As String = minimo_cbox.SelectedText
    
            Dim consulta1 As String = " Select min(" & valor1 & ") from datos; "
            Dim comando1 As NpgsqlCommand = New NpgsqlCommand(consulta1, conexion)
            Dim lector1 As NpgsqlDataReader = Nothing
    
            lector1 = comando1.ExecuteReader
    
            lector1.Read()
    
            minValor_lbl.Text = lector1(0)
    
            lector1.Close()
            conexion.Close()
    
        End Sub

    Por eso necesito el SelectIndex, para que me devuelva el valor que quiero y no lo hace.

    domingo, 14 de marzo de 2021 20:50
  • Se te está disparando antes de tiempo. Estás ejecutando el SelectedIndexChanged antes de que se haya seleccionado nada en el combo. Por eso el SelectedText está vacío y al ponerlo dentro del min(valor1) queda min() y eso da un error.

    Podrías poner un control para que no se ejecute si no hay nada seleccionado. Por ejemplo

    If minimo_cbox.SelectedIndex<0 Then Return

    o

    If Not String.IsNullOrWhitespace(valor1) Then ...

    domingo, 14 de marzo de 2021 21:22
  • Hola, disculpa mi ignorancia pero no sé donde poner el control que me dices, lo he puesto dentro del evento y no hace nada.
    Private Sub minimo_cbox_SelectedIndexChanged(sender As Object, e As EventArgs) Handles minimo_cbox.SelectedIndexChanged
    
            'conexion.Open()
    
            Dim valor1 As String = minimo_cbox.SelectedText
    
            If Not String.IsNullOrWhiteSpace(valor1) Then
    
                Dim consulta1 As String = " Select min(" & valor1 & ") from datos; "
                Dim comando1 As NpgsqlCommand = New NpgsqlCommand(consulta1, conexion)
                Dim lector1 As NpgsqlDataReader = Nothing
    
                lector1 = comando1.ExecuteReader
    
                If lector1.Read() Then
    
                    minValor_lbl.Text = lector1(0)
    
                End If
    
                lector1.Close()
                conexion.Close()
    
            End If
    
        End Sub

    Estoy perdido, lo siento. Gracias.
    lunes, 15 de marzo de 2021 5:49
  • Sí, está bien como lo has puesto. La idea de ponerlo así es precisamente que "no haga nada" mientras no le llegue un valor para que pueda "hacer algo" con él.

    Si no hace nada nunca, en ninguna de las veces que se dispara, puede ser que siempre le esté llegando vacío el SelectedText. Compruébalo poniendo un punto de ruptura con el debugger.

    Recuerda que un Combo puede devolver valores de dos formas: Una es que el usuario teclee el texto a mano, y la otra es que despliegue la lista de items y seleccione un item de la lista. Para recuperar el item de la lista se usa SelectedValue en lugar de SelectedText si no recuerdo mal.

    lunes, 15 de marzo de 2021 7:13
  • Hola, solucionado el tema del error, no devuelve nada la variable valor1 por lo que el label correspondiente no hace nada.

    Private Sub minimo_cbox_SelectedIndexChanged(sender As Object, e As EventArgs) Handles minimo_cbox.SelectedIndexChanged
    
            Dim valor1 As String = minimo_cbox.SelectedText
    
            If Not String.IsNullOrWhiteSpace(valor1) Then
    
                Dim consulta1 As String = " Select min(" & valor1 & ") from datos; "
                Dim comando1 As NpgsqlCommand = New NpgsqlCommand(consulta1, conexion)
                Dim lector1 As NpgsqlDataReader
    
                lector1 = comando1.ExecuteReader
    
                If lector1.Read() Then
    
                    minValor_lbl.Text = lector1(0)
    
                End If
    
                lector1 = Nothing
                lector1.Close()
                conexion.Close()
    
            End If
    
        End Sub

    valor1 no recibe nada, por lo que se  salta el if. ¿Cómo lo puedo arreglar? Gracias.




    • Editado solilopi lunes, 15 de marzo de 2021 9:55 error
    lunes, 15 de marzo de 2021 9:48
  • Hola,

    Gracias por levantar tu consulta en los foros de MSDN.

    Eric Ruiz

    ____________________________

    Por favor recuerde "Marcar como respuesta" las respuestas que hayan resuelto su problema, es una forma común de reconocer a aquellos que han ayudado, y hace que sea más fácil para los otros visitantes encontrar la solución más tarde.

    Si tiene algún cumplido o reclamo sobre el soporte de MSDN siéntase en la libertad de contactar MSDNFSF@microsoft.com.

    lunes, 15 de marzo de 2021 14:36
    Moderador
  • Hola, ya lo he solucionado el código resultante es, en el load:

    ... 
    While reader1.Read()
    
                maximo_cbox.Items.Add(reader1(0))
                maximo_cbox.DisplayMember = "COLUMN_NAME"
                minimo_cbox.Items.Add(reader1(0))
                minimo_cbox.DisplayMember = "COLUMN_NAME"
    
            End While
    ...

    y luego en el evento SelectedIndexChanged:

    Private Sub minimo_cbox_SelectedIndexChanged(sender As Object, e As EventArgs) Handles minimo_cbox.SelectedIndexChanged
    
            conexion.Open()
    
            Dim valor1 As String = minimo_cbox.Text
    
            Dim consulta1 As String = " Select min(" & valor1 & ") from datos; "
            Dim comando1 As NpgsqlCommand = New NpgsqlCommand(consulta1, conexion)
            Dim lector1 As NpgsqlDataReader
    
            lector1 = comando1.ExecuteReader
    
            If lector1.Read() Then
    
                minValor_lbl.Text = lector1(0)
    
            End If
    
            conexion.Close()
            conexion.Open()
    
            Dim consulta3 As String = " Select " & valor1 & " from minimos; "
            Dim comando3 As NpgsqlCommand = New NpgsqlCommand(consulta3, conexion)
            Dim lector3 As NpgsqlDataReader
    
            lector3 = comando3.ExecuteReader
    
            lector3.Read()
    
            minValor_lbl.Text = minValor_lbl.Text & " SOBRE UN MÍNIMO DE " & lector3(0)
    
            lector1.Close()
            lector3.Close()
            conexion.Close()
    
        End Sub
    Gracias por el interés.

    lunes, 15 de marzo de 2021 19:45