none
Buscar texto en un ListBox

    Pregunta

  • Hola, estoy empezando a programar usando Vb express 2010 y tengo en un formulario un contol ListBox , he logrado llenar el control de esta manera

    ListBox1.Items.Add("AAA")
            ListBox1.Items.Add("ABA")
            ListBox1.Items.Add("ABC")
            ListBox1.Items.Add("BBB")
            ListBox1.Items.Add("BCE")
            ListBox1.Items.Add("CCC")
            ListBox1.Items.Add("CAB")

    ahora bien cuando la aplicacion corre y entro al listBox  y quiero buscar una palabra escribiendo "ABA"sobre el control  se posiciona en el item "AAA", o sea al presionar la "A" se posiciona en "AAA" luego al presionar la "B" se posiciona en "BBB" y luego al presionar la "A" se posiciona en "AAA" , solo busca el primer elemento que comience con la letra pulsada ,  nunca busca la palabra completa que es lo que yo necesito, en el programa que tengo en VB 6 lo hacia , buscaba la palabra completa , no se si puede cambiar este modo de busqueda modificando alguna propiedad del control.

    He intetado armar la palabra y buscarla colcando esta función en el evento keypress:

     Private Sub FindMyString(ByVal searchString As String)
            ' Ensure we have a proper string to search for.
            If searchString <> String.Empty Then
                ' Find the item in the list and store the index to the item.
                Dim index As Integer = ListBox1.FindString(searchString)
                ' Determine if a valid index is returned. Select the item if it is valid.
                If index <> -1 Then
                    ListBox1.SetSelected(index, True)
                Else
                    MessageBox.Show("The search string did not match any items in the ListBox)
                End If
            End If
        End Sub

    Pero siempre predomina el metodo de busqueda del control y FindMyString nunca parece ejecutarse desde el evento keypress. Desde ya les agradezco su ayuda, Saludos

    jueves, 16 de febrero de 2012 1:25

Respuestas

  • "Marcelo24" escribió:

    > cuando la aplicacion corre y entro al listBox  y quiero buscar
    > una palabra escribiendo "ABA"sobre el control  se posiciona en
    > el item "AAA", o sea al presionar la "A" se posiciona en "AAA"
    > luego al presionar la "B" se posiciona en "BBB" y luego al
    > presionar la "A" se posiciona en "AAA" , solo busca el primer
    > elemento que comience con la letra pulsada ,  nunca busca la
    > palabra completa que es lo que yo necesito.
    >
    > Pero siempre predomina el metodo de busqueda del control y
    > FindMyString nunca parece ejecutarse desde el evento keypress.

    Hola:

    Como parece ser que estás utilizando el evento KeyPress del control ListBox para llamar al método FindMyString, habría que ver qué código estás utilizando en dicho evento, porque si solamente te estás limitando a llamar al método FindMyString pasándole el carácter de la tecla presionada, es normal que ocurra lo que te está ocurriendo.

    Antes de llamar al método FindMyString, tienes que indicar que se está controlando explícitamente el evento KeyPress del control ListBox, por lo que dicho evento lo tendrás que cancelar:

        Private Sub ListBox1_KeyPress(sender As Object, e As KeyPressEventArgs) Handles ListBox1.KeyPress

            ' Indicamos que se está controlando el evento KeyPress.
            '
            e.Handled = True

            ' Cadena de búsqueda.
            '
            cadenaBusqueda &= e.KeyChar

            FindMyString(cadenaBusqueda)

        End Sub

    Pero fíjate que en alguna parte tienes que almacenar los valores de las teclas presionadas sucesivamente para pasárselas al método FindMyString, porque si no lo haces así, solamente le estarás pasando la tecla actualmente presionada.

    Para ello, a nivel del formulario declararías el siguiente campo privado:

        Private cadenaBusqueda As String

    Y limpiarías el valor del campo cuando el control ListBox pierda el foco, es decir, en su evento Leave:

        Private Sub ListBox1_Leave(sender As Object, e As EventArgs) Handles ListBox1.Leave

            ' Cuando el control ListBox pierda el foco,
            ' limpiamos el valor del campo 'searchString'.
            '
            cadenaBusqueda = String.Empty

        End Sub

    Insisto que ignoro el código que estás ejecutando en el evento KeyPress, pero por los "síntomas que describes", no me queda más que pensar que no estás ejecutando:

        e.Handled = True

    Si no cancelas el evento KeyPress, por defecto el control ListBox seleccionará el primer elemento que se corresponda con la letra tecleada, independientemente que llames o no a su método FindString.

    Un saludo


    Enrique Martínez
      [MS MVP - VB]

    Nota informativa: La información contenida en este mensaje, así como el código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin garantías de ninguna clase, y no otorga derecho alguno. Usted asume cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o sugerido en el presente mensaje.

    Si esta respuesta le ha resultado útil, recuerde marcarla como satisfactoria.

    Si usas Visual Basic .NET y deseas ser productivo y feliz, activa la instrucción Option Strict.






    jueves, 16 de febrero de 2012 16:15

Todas las respuestas

  • estas tratando de implementar esto

    el tema es que de por si solo no se eejcuta ese metodo, deberias unirlo en algun evento como podrias ser el keypress y alli lanzarlo

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina

    jueves, 16 de febrero de 2012 2:52
  • "Marcelo24" escribió:

    > cuando la aplicacion corre y entro al listBox  y quiero buscar
    > una palabra escribiendo "ABA"sobre el control  se posiciona en
    > el item "AAA", o sea al presionar la "A" se posiciona en "AAA"
    > luego al presionar la "B" se posiciona en "BBB" y luego al
    > presionar la "A" se posiciona en "AAA" , solo busca el primer
    > elemento que comience con la letra pulsada ,  nunca busca la
    > palabra completa que es lo que yo necesito.
    >
    > Pero siempre predomina el metodo de busqueda del control y
    > FindMyString nunca parece ejecutarse desde el evento keypress.

    Hola:

    Como parece ser que estás utilizando el evento KeyPress del control ListBox para llamar al método FindMyString, habría que ver qué código estás utilizando en dicho evento, porque si solamente te estás limitando a llamar al método FindMyString pasándole el carácter de la tecla presionada, es normal que ocurra lo que te está ocurriendo.

    Antes de llamar al método FindMyString, tienes que indicar que se está controlando explícitamente el evento KeyPress del control ListBox, por lo que dicho evento lo tendrás que cancelar:

        Private Sub ListBox1_KeyPress(sender As Object, e As KeyPressEventArgs) Handles ListBox1.KeyPress

            ' Indicamos que se está controlando el evento KeyPress.
            '
            e.Handled = True

            ' Cadena de búsqueda.
            '
            cadenaBusqueda &= e.KeyChar

            FindMyString(cadenaBusqueda)

        End Sub

    Pero fíjate que en alguna parte tienes que almacenar los valores de las teclas presionadas sucesivamente para pasárselas al método FindMyString, porque si no lo haces así, solamente le estarás pasando la tecla actualmente presionada.

    Para ello, a nivel del formulario declararías el siguiente campo privado:

        Private cadenaBusqueda As String

    Y limpiarías el valor del campo cuando el control ListBox pierda el foco, es decir, en su evento Leave:

        Private Sub ListBox1_Leave(sender As Object, e As EventArgs) Handles ListBox1.Leave

            ' Cuando el control ListBox pierda el foco,
            ' limpiamos el valor del campo 'searchString'.
            '
            cadenaBusqueda = String.Empty

        End Sub

    Insisto que ignoro el código que estás ejecutando en el evento KeyPress, pero por los "síntomas que describes", no me queda más que pensar que no estás ejecutando:

        e.Handled = True

    Si no cancelas el evento KeyPress, por defecto el control ListBox seleccionará el primer elemento que se corresponda con la letra tecleada, independientemente que llames o no a su método FindString.

    Un saludo


    Enrique Martínez
      [MS MVP - VB]

    Nota informativa: La información contenida en este mensaje, así como el código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin garantías de ninguna clase, y no otorga derecho alguno. Usted asume cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o sugerido en el presente mensaje.

    Si esta respuesta le ha resultado útil, recuerde marcarla como satisfactoria.

    Si usas Visual Basic .NET y deseas ser productivo y feliz, activa la instrucción Option Strict.






    jueves, 16 de febrero de 2012 16:15
  • Muchas gracias SoftJaén , con "e.Handled = True" pude solucionar el problema y me resultaron muy útlies tus sugerencias.
    viernes, 17 de febrero de 2012 19:30