none
Evento Keypress en búsquedas de datagridView RRS feed

  • Pregunta

  • Buenos días a todos. Os cuento mi problema:

    Tengo un formulario con un datagridview que carga datos de productos, en concreto hay dos columnas, una con el código del producto y la otra con el nombre del producto. Para probar la aplicación con datos, creo un bucle que carga 1000 registros en el evento load del formulario con datos que van de código de producto 0 al 1000 y cada nombre del articulo es Producto nº 0, Producto nº 1 , así hasta 1000. El código que uso en concreto es este:

     Dim Productos As New List(Of EProducto)
    
            For contador As Integer = 0 To 1000
                Dim producto As New EProducto
                producto.IdProducto = contador
                producto.Descripcion = String.Concat("Producto nº ", Convert.ToString(contador))
                Productos.Add(producto)
            Next
    
            dgvDatos.AutoGenerateColumns = False
            dgvDatos.DataSource = Productos
     

    Ahora, en el formulario tengo un textbox en el que el usuario puede introducir un término de búsqueda y se va seleccionando la coincidencia en el datagrid a medida que se va escribiendo. El datagrid tiene el método de seleccion en FullRowSelect.

    Esto lo hago en el evento textChange del control con el siguiente código:

     Dim query = From fila As DataGridViewRow In dgvDatos.Rows.Cast(Of DataGridViewRow)()
                         Where CStr(fila.Cells(1).Value).StartsWith(TextBox1.Text.ToString())
                         Select fila
            For Each fila In query
                fila.Selected = True
                dgvDatos.CurrentCell = fila.Cells(1)
                Exit For
            Next
        End Sub

    Uso el Exit For para que siempre me muestre la primera coincidencia.

    Ahora viene mi problema. Quiero que el usuario sólo pueda introducir letras en el textbox que estén en la columna nombre del datagrid. Por ejemplo, si  todos los productos empiezan por Producto nº... Si el cliente pone p que le deje escribirlo, pero si pone l como ninguno empieza con l que no salga la letra en el textbox.

    Lo he intentado haciendolo en el evento keypress pero no sale. Me deja intruducir cualquier palabra, y si borro una hace cosas raras. El código que he probado es este:

    Dim query = From fila As DataGridViewRow In DirectCast(Me.Owner, Form1).dgvDatos.Rows.Cast(Of DataGridViewRow)()
                         Where CStr(fila.Cells(1).Value).StartsWith(TextBox1.Text.ToString())
                         Select fila
    
    If query.Count = 0 Then
          e.handled = True
    Else
          e.Handled = False
    End If

    Pero no funciona. Alguien me puede echar una mano?


    lunes, 8 de mayo de 2017 10:38

Respuestas

  • Bueno, al final lo he solucionado revisando la sentencia de linq. 

    Con esto ya funciona:

     Dim query = From fila As DataGridViewRow In DirectCast(Me.Owner, Form1).dgvDatos.Rows.Cast(Of DataGridViewRow)()
                        Where CStr(fila.Cells(1).Value).StartsWith(String.Concat(TextBox1.Text.ToString(), e.KeyChar.ToString()), StringComparison.OrdinalIgnoreCase)
                        Select fila
    
            If query.Count = 0 AndAlso Asc(e.KeyChar) <> 8 Then
                e.Handled = True
            End If

    En el if compruebo que si el usuario pulsa la tecla de retroceso para borrar algún carácter, esta funcione.

    lunes, 8 de mayo de 2017 13:44

Todas las respuestas

  • Bueno, al final lo he solucionado revisando la sentencia de linq. 

    Con esto ya funciona:

     Dim query = From fila As DataGridViewRow In DirectCast(Me.Owner, Form1).dgvDatos.Rows.Cast(Of DataGridViewRow)()
                        Where CStr(fila.Cells(1).Value).StartsWith(String.Concat(TextBox1.Text.ToString(), e.KeyChar.ToString()), StringComparison.OrdinalIgnoreCase)
                        Select fila
    
            If query.Count = 0 AndAlso Asc(e.KeyChar) <> 8 Then
                e.Handled = True
            End If

    En el if compruebo que si el usuario pulsa la tecla de retroceso para borrar algún carácter, esta funcione.

    lunes, 8 de mayo de 2017 13:44
  • Hola Joaquín Domingo,

    Gracias por visitar los foros y compartir tu solución.

    Saludos

    Joyce

    __________________________________________________________________________________________
    Por favor, recuerde "Marcar como respuesta" las respuestas que hayan resuelto su problema, hace que sea más fácil para los otros visitantes encontrar la solución  más tarde. Microsoft ofrece este servicio de forma gratuita, con la finalidad de ayudar a los usuarios y la ampliación de la base de datos de conocimientos relacionados con los productos y tecnologías de Microsoft. Este contenido es proporcionado "tal  cual" y no implica ninguna responsabilidad de parte de Microsoft.

    martes, 9 de mayo de 2017 20:08
    Moderador