none
Winform Textbox Autocompletar con Like RRS feed

  • Pregunta

  • Hola amigos,

    Tengo una consulta se como realizar un Textbox con autocompletar. Pero lo que requiero esta vez es un TextBox que busque en una BD directo pero con like y que devuelva la lista dentro del textbox.

    Alguna idea por favor y gracias por su apoyo.

    Saludos

    Carlos Onocuica


    Conocuica

    martes, 25 de septiembre de 2018 1:25

Respuestas

  • Revise lo que dices y efectivamente hay un detalle en el código, y es que cuando la caja de texto queda vacía entonces la consulta devuelve todos los registros de la tabla, es como hacerle un select a la tabla sin filtro, supongo que en tu caso se "pega" talvez por la cantidad de registros que trae cuando no tiene filtro, así que solo hay que añadir lo siguiente:

    'Si la caja de texto está vacía entonces no hay datos que desplegar, 'solo limpiamos los elementos y dejamos la lista invisible

    Private Sub TextProveedorNombre_TextChanged(sender As Object, e As EventArgs) Handles TextProveedorNombre.TextChanged

    If TextProveedorNombre.Text = String.Empty Then KryptonListBoxProveedor.Items.Clear() KryptonListBoxProveedor.Visible = False Return End If

    Dim BLProveedor As New BLProveedor'...Acá el resto de tu código... no olvides el try catch

    También debes acostumbrarte a utilizar la instrucción Try Catch, que evitará que un error inesperada quiebre la aplicación.

    Nos avisas como te va.

    Saludos

    • Marcado como respuesta conocuica miércoles, 26 de septiembre de 2018 14:22
    miércoles, 26 de septiembre de 2018 13:37

Todas las respuestas

  • Hola, podrías revisar

    C# – AutoComplete ComboBox o TextBox


    Votar es agradecer.
    Saludos.
    Lima-Perú

    martes, 25 de septiembre de 2018 1:40
  • Hola Augusto,

    Muchas gracias por el aporte pero no es lo que se requiere. Lo que necesito es:

    Cuando el usuario digite en el el textox

    Se despliegue una lista con los resultados que contengan lo ingresado.

    El método que me pasaste lo realiza con las primeras letras de las palabras es un Autocompletar. Necesito un like dentro de la lista.

    Alguna otra idea.

    Gracias


    Conocuica


    • Editado conocuica martes, 25 de septiembre de 2018 2:20
    martes, 25 de septiembre de 2018 2:12
  • Hola Carlos

    Para que la lista se desplegue dentro del textobox debes usar la propiedad autocomplete la que no tendrá un comportamiento funcional si modificas la colección cada vez que se cambia el texto del textbox, al parecer no se pensó para eso, te lo digo porque lo intenté hacer para contestar tu pregunta, pero cada vez que reiniciaba la colección en "AutoCompleteCustomSource" desplegaba la lista por un momento pero se ocultaba, por lo que no creo que sea posible que sea en el textbox, por lo que probé hacerlo de esta forma, no es en el textbox pero simula lo que deseas hacer, usé un textbox y un listbox:

    Al iniciar deja el listbox con Visible = False

    Cada vez que escriba algo en el textbox, se consultará la base de datos y se actualizarán los elementos del listbox, si borra todo entonces no hay resultados y el listbox se oculta (no se que base de datos usas, este ejemplo es con sqlserver)

    Private Sub TextBox1_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TextBox1.TextChanged
        Dim con As New SqlConnection("data source=servidor;initial catalog=nombrebd;user id=usuario;password=contraseña")
        Dim sql As String = "SELECT campo_lista FROM TUTABLA WHERE campo_lista like @nombre"
        Dim cmd As New SqlCommand(sql, con)
        Dim da As New SqlDataAdapter(cmd)
        Dim dt As New DataTable
    
        cmd.Parameters.AddWithValue("nombre", TextBox1.Text & "%")
        con.Open()
        da.Fill(dt)
        Try
    'Cada vez que cambie el texto reiniciamos la lista desde la bd consultando con un like
            ListBox1.Items.Clear()
            ListBox1.Items.AddRange(dt.AsEnumerable().Select(Function(dr As DataRow) dr(0).ToString).ToArray())
    'Si hay resultados los mostramos en el listbox
            If ListBox1.Items.Count > 0 Then
                ListBox1.Visible = True
            Else
                ListBox1.Visible = False
            End If
    
        Catch ex As Exception
            MsgBox(ex.Message)
        End Try
      con.Close()
    End Sub

    Si el usuario selecciona algún elemento del listbox entonces ese deberá ser el texto de textbox

     Private Sub ListBox1_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ListBox1.SelectedIndexChanged
            TextBox1.Text = ListBox1.SelectedItem.ToString
            ListBox1.Visible = False
        End Sub

    Eso simularía lo que desea hacer, espero te funcione, por favor coméntanos si te funciona.

    martes, 25 de septiembre de 2018 16:47
  •     Private Sub TextProveedorNombre_TextChanged(sender As Object, e As EventArgs) Handles TextProveedorNombre.TextChanged
    
            Dim BLProveedor As New BLProveedor
    
            Dim BEProveedor As New BEProveedor
    
            Dim TablaProveedor As New DataTable
    
            BEProveedor.ParProvNombre = Me.TextProveedorNombre.Text
    
            TablaProveedor = BLProveedor.ListarLike(BEProveedor)
    
            Me.KryptonListBoxProveedor.Items.Clear()
            Me.KryptonListBoxProveedor.Items.AddRange(TablaProveedor.AsEnumerable().Select(Function(dr As DataRow) dr("nombre").ToString).ToArray())
    
            If Me.KryptonListBoxProveedor.Items.Count > 0 Then
                Me.KryptonListBoxProveedor.Visible = True
            Else
                Me.KryptonListBoxProveedor.Visible = False
            End If
    
        End Sub
    
        Private Sub 
    
        Private Sub KryptonListBoxProveedor_SelectedIndexChanged(sender As Object, e As EventArgs) Handles KryptonListBoxProveedor.SelectedIndexChanged
    
            If Me.KryptonListBoxProveedor.SelectedItems.Count > 0 Then
                Me.TextProveedorNombre.Text = Me.KryptonListBoxProveedor.SelectedItem.ToString
                Me.KryptonListBoxProveedor.Visible = False
            End If
    
        End Sub
    Me funciono pero cuando dígito varias veces en el Me.TextProveedorNombre.Text se pega el ListView y no se oculta. Trate de hacer un DEBUG en el evento . Pero no muestra el error se tiene que cerrar el WinForm y volver abrir. Alguna idea para solucionar y otra alternativa conoces. Gracias por tu aporte.

    KryptonListBoxProveedor_SelectedIndexChanged


    Conocuica

    miércoles, 26 de septiembre de 2018 0:12
  • Revise lo que dices y efectivamente hay un detalle en el código, y es que cuando la caja de texto queda vacía entonces la consulta devuelve todos los registros de la tabla, es como hacerle un select a la tabla sin filtro, supongo que en tu caso se "pega" talvez por la cantidad de registros que trae cuando no tiene filtro, así que solo hay que añadir lo siguiente:

    'Si la caja de texto está vacía entonces no hay datos que desplegar, 'solo limpiamos los elementos y dejamos la lista invisible

    Private Sub TextProveedorNombre_TextChanged(sender As Object, e As EventArgs) Handles TextProveedorNombre.TextChanged

    If TextProveedorNombre.Text = String.Empty Then KryptonListBoxProveedor.Items.Clear() KryptonListBoxProveedor.Visible = False Return End If

    Dim BLProveedor As New BLProveedor'...Acá el resto de tu código... no olvides el try catch

    También debes acostumbrarte a utilizar la instrucción Try Catch, que evitará que un error inesperada quiebre la aplicación.

    Nos avisas como te va.

    Saludos

    • Marcado como respuesta conocuica miércoles, 26 de septiembre de 2018 14:22
    miércoles, 26 de septiembre de 2018 13:37
  • Hola Yerald,

    He agregado tus sugerencias pero el problema sigue, se queda pegado en el List por mas que selecciono un elemento no lo envía al textbox y haciendo un debug en tiempo de ejecución no ingresa al SelectedIndexChanged del List. Solo ingresa la primera vez.


    Conocuica

    miércoles, 26 de septiembre de 2018 14:14
  • Yerald,

    Corrección; si funciona con el control  nativo de .NET es decir yo estoy usando un Framework Krypto (KryptonListBox) para mejorar el diseño de los controles.

    Lo probé con un ListView y si funciona correctamente. Muchas gracias por el Apoyo.


    Conocuica

    miércoles, 26 de septiembre de 2018 14:21