none
Busqueda RRS feed

  • Pregunta

  • Hola solo para un consejo lo que deseo realizer es un tipo de buscador donde me lleve ala celda de mi datagriview

    ejemplo algo similar lo que hace excel Tengo conectado mi datagrid con sql , espero pueda ayudarme o darme la indicaciones que deberias hacer

    le anexo la imagen a lo que deseo llegar  , y poder hacer busqueda desde otro from espero alguien me ayude

    miércoles, 10 de octubre de 2018 15:11

Respuestas

  • Darwin yo de nuevo, me queda mucha duda sobre tu primer error alguna información falta ahí en mi comentario anterior te decía eso, al final era a mi que me faltaba información, me quede con la duda así que probé conectar mi grid con una base de datos y puede corraborar que tu primer error si es viable, resulta que cuando los traigo de la base de datos los valores quedan fuertemente tipados y por lo tanto pueden generarse varios errores al momento de hacer la comparación , por lo tanto la solución sería convertir el valor que se comparará a cadena, cambia de nuevo la línea y reemplazala por esta:

     

    Dim nextCell As DataGridViewCell = (From c As DataGridViewCell In DataGridView1.Rows(rowIndex).Cells _
                                                    Where CStr(IIf(IsDBNull(c.Value), String.Empty, c.Value)) = dato And c.ColumnIndex > colIndex).FirstOrDefault

    Ahora si ya no deberías tener problemas, me avisas.

    ..................................

    Darwin, quise mejorar un poco mas la búsqueda, asi que añadí que no hiciera distinción de mayúsuclas y minúsculas y que además de que no fuese necesaria la palabra completa, por ejemplo si en tu grid en un campo estuviese mi nombre "Yerald Mora", entonces si escribes en tu búsqueda "yerald" no me encontraría por dos razones: 

    1-"Yerald Mora" comienza con mayúscula mientras que "yerald" con minúscula.

    2-"Yerald Mora" no es igual a "yerald" porque "yerald" es una palabra de 6 dígitos mientras que "Yerald Mora" es de 11 dígitos

    Asi que la mejore para que si escribes "yerald" entonce encuentre "Yerald Mora" porque comparará los datos en minúscula y luego buscará si en parte el campo en la grid contiene la palabra "yerald", si la quieres usar así, este sería el código

    Dim nextCell As DataGridViewCell = (From c As DataGridViewCell In DataGridView1.Rows(rowIndex).Cells _
                                                    Where (CStr(IIf(IsDBNull(c.Value) Or IsNothing(c.Value), String.Empty, c.Value))).ToLower.Contains(dato.ToLower) _
                                                    And c.ColumnIndex > colIndex).FirstOrDefault

    • Editado Yerald Mora jueves, 11 de octubre de 2018 18:50 Mejora de búsqueda
    • Marcado como respuesta Darwin123456 jueves, 11 de octubre de 2018 21:34
    jueves, 11 de octubre de 2018 18:25

Todas las respuestas

  • Saludos Darwin

    Analicé tu dilema e implementé la solución de esta forma:

    En Form1 tendría mi datagridview y frmBuscar sería mi cuadro de búsqueda ("Como Find and Replace" de tú imagen) :

    -Muestra el cuadro de diálogo con el boton btnBuscar de mi Form1

        Private Sub btnBuscar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button4.Click
    
            Dim frm As New frmBuscar
            frm.Owner = Me
            frm.TopMost = True
            frm.Show()
    
        End Sub

    -En mi frmBuscar tengo un TextBox1 que contendrá el texto a buscar, entonces hago una referencia a mi formulario Form1 y ejecuto la función pública "FindNext" de mi Form1 que recibe el texto a buscar contenido en TextBox1 de frmBuscar

        Private Sub btnFindNext_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnFindNext.Click
            Dim frm As Form1 = Me.Owner
            frm.FindNext(TextBox1.Text)
        End Sub

    Ahora viene lo importante la implementación de "FindNext" en Form1 que hará lo que deseas:

    'Esta función debe estar declarada en Form1
        Public Sub FindNext(ByVal dato As String)
    
            Dim Found As Boolean = False 'Para que mi bucle while sepa si debe seguir buscando
            Dim rowIndex As Integer = DataGridView1.CurrentCell.RowIndex 'Fila actual
            Dim colIndex As Integer = DataGridView1.CurrentCell.ColumnIndex 'Columna actual
            Dim CheckedFromTop As Boolean = False 'Para validar que sea una búsqueda completa
    
            While Not Found
                'Acá buscamos la siguiente celda que tenga el valor dato dentro de la fila actual, colIndex nos garantiza que sea la siguiente celda
                Dim nextCell As DataGridViewCell = (From c As DataGridViewCell In DataGridView1.Rows(rowIndex).Cells Where c.Value = dato And c.ColumnIndex > colIndex).FirstOrDefault
    
                If IsNothing(nextCell) Then
                    'Si no encuentra celda en esa fila entonces verifico que si es la última fila
                    If rowIndex = DataGridView1.Rows.Count - 1 Then
                        
                        If CheckedFromTop Then
                           'Si es la última fila y ya he revisado desde lo mas alto de la grid entonces el dato no existe en la grid
                            MessageBox.Show("No se encontraron resultados")
                            Found = True 'sale del bucle
                        End If
                       'Si es la última fila entonces busco dede arriba por si acaso la celda seleccionada era la última cuando el usuario le dio buscar
                        rowIndex = 0
                        CheckedFromTop = True
    
                    Else ' SI no es la última fila busco en la siguiente
                        rowIndex += 1
                    End If
    
                    colIndex = -1'Si es la siguiente fila debo buscar desde la columna 0
                Else ' Si encuentra una celda con valor "dato", entonces es la que debemos seleccionar como "Next"
                    DataGridView1.CurrentCell = nextCell
                    Found = True
                End If
    
            End While
    
        End Sub

    Y de esa forma consigues simular el "FindNext", el buscará después de la celda seleccionada, al llegar hasta el final entonces repetirá la búsqueda desde la primera coincidencia que se encuentre en la grid.

    Si necesitas alguna explicación del código me avisas, el código no es tan grande, pero los comentarios que incluí lo hacen ver muy cargado, pero los incluí así para que lo entendieras de forma mas sencilla.


    • Editado Yerald Mora miércoles, 10 de octubre de 2018 21:44
    • Propuesto como respuesta Pablo Rubio jueves, 11 de octubre de 2018 15:03
    miércoles, 10 de octubre de 2018 21:41
  • Tengo un dilemma mi datagriew esta conectado a una base de datos sigue siendo igual la misma busqueda ? , agradezco mucho te respuesta la implementare muchas gracias
    • Editado Darwin123456 miércoles, 10 de octubre de 2018 23:49 falto texto
    miércoles, 10 de octubre de 2018 23:46
  • Hola darwin.

    Sí sigue siendo igual, el método es independiente de la fuente de datos del datagridview pues trabaja directamente con los elementos del control no con su datasource, te recomiendo que primero pruebes el código, prueba el código y si te presenta algún inconveniente nos avisas.

    • Propuesto como respuesta Pablo Rubio jueves, 11 de octubre de 2018 15:03
    jueves, 11 de octubre de 2018 13:13
  • System.InvalidCastException
      Message=Conversion from string "Codo" to type 'Double' is not valid.

    Inner Exception 1:
    FormatException: Input string was not in a correct format.

    Cuando busco otro dato me sale este tipo de error

    Dim nextCell As DataGridViewCell = (From c As DataGridViewCell In DataGridView1.Rows(rowIndex).Cells Where c.Value = dato And c.ColumnIndex > colIndex).FirstOrDefault

    • Propuesto como respuesta Pablo Rubio jueves, 11 de octubre de 2018 17:21
    jueves, 11 de octubre de 2018 15:18
  • No le añadiste o cambiaste nada al código?, si "dato" es un string entonces no debería tener problemas cuando se campara contra un objeto es decir "c.Value = dato" no debería dar el error que describes, a menos que le hayas cambiado el tipo a la variable dato la cual debería ser string.

    Según veo y para que el error tenga sentido la variable "dato" la tienes como un Double y cuando la instrucción en cuestión compara tu "dato" (double) contra la información en tu grid entonces da el error de conversión porque en tu grid encuentra un objeto tipo string con valor "Codo" y no lo puede convertir a double para compararlo contra tu variable "dato"

    Verifica por favor que no hayas cambiado el tipo de la variable dato, dejalo string.

    .......................

    Me tomé el tiempo para mostrarte lo que te decía

    En esta primer imagen es el código original y el que te proveí anteriormente, podrás ver que "dato" es de tipo string, busco la palabra "Prueba" y no me da ningún error comparando la palabra "Prueba" contra todos los datos de la grid, si quiero buscar 56.6 entonces tampoco dará problemas

    En la segunda imagen, le cambio el valor a dato y lo convierte en double, recibo la variable "datos" en string, pero tomo ese valor y lo almaceno en "dato" tipo double y esto es lo que generará el error, en mi buscar escribo 56.65 me encontrará el primer resultado porque los primeros dos valores de la grid en la primera fila (156.56 y 56.65 sucesivamente) se pueden convertir a double y no tiene problemas al comparar, pero cuando encuentra el siguiente valor (en la segunda fila, primera columna) que es la palabra "Codo" entonces genera el error porque "Codo" no se puede convertir en double

    • Editado Yerald Mora jueves, 11 de octubre de 2018 17:39 Explicación con imagen
    jueves, 11 de octubre de 2018 17:18
  • Hola que tal no movi nada al codigo de echo ahora da distinto error

    System.InvalidCastException
      

    Message=Operator '=' is not defined for type 'DBNull' and string "codo".

    Public Sub FindNext(ByVal dato As String)
    
            Dim Found As Boolean = False
            Dim rowIndex As Integer = DGVTablaMina.CurrentCell.RowIndex
            Dim colIndex As Integer = DGVTablaMina.CurrentCell.ColumnIndex
            Dim CheckedFromTop As Boolean = False
    
            While Not Found
                Dim nextCell As DataGridViewCell = (From c As DataGridViewCell In DGVTablaMina.Rows(rowIndex).Cells Where c.Value = dato And c.ColumnIndex > colIndex).FirstOrDefault
    
                If IsNothing(nextCell) Then
                    If rowIndex = DGVTablaMina.Rows.Count - 1 Then
    
    
                        If CheckedFromTop Then
                            MessageBox.Show("No se Encontraron Resultados")
                            Found = True
                        End If
                        rowIndex = 0
                        CheckedFromTop = True
    
                    Else
                        rowIndex += 1
                    End If
                    colIndex = -1
                Else
                    DGVTablaMina.CurrentCell = nextCell
                    Found = True
                End If
    
            End While
    End sub 
    Y como puedes obsservar no cambie nada del codigo , agradezco mucho tu tiempo y apoyo

    jueves, 11 de octubre de 2018 17:46
  • Ese error si tiene sentido, sino cambiaste el código en nada, me queda mucha duda sobre tu primer error alguna información falta ahí...., pero pasando a este error Message=Operator '=' is not defined for type 'DBNull' and string "codo". si tu base de datos está enviando un dato NULL entonces ese error no es inesperado, pero se puede manejar modificando un poco la expresión de comparación, cambia únicamente el siguiente linea:

    Dim nextCell As DataGridViewCell = (From c As DataGridViewCell In DataGridView1.Rows(rowIndex).Cells _
                                                    Where IIf(IsDBNull(c.Value), String.Empty, c.Value) = dato And c.ColumnIndex > colIndex).FirstOrDefault

    jueves, 11 de octubre de 2018 18:10
  • Darwin yo de nuevo, me queda mucha duda sobre tu primer error alguna información falta ahí en mi comentario anterior te decía eso, al final era a mi que me faltaba información, me quede con la duda así que probé conectar mi grid con una base de datos y puede corraborar que tu primer error si es viable, resulta que cuando los traigo de la base de datos los valores quedan fuertemente tipados y por lo tanto pueden generarse varios errores al momento de hacer la comparación , por lo tanto la solución sería convertir el valor que se comparará a cadena, cambia de nuevo la línea y reemplazala por esta:

     

    Dim nextCell As DataGridViewCell = (From c As DataGridViewCell In DataGridView1.Rows(rowIndex).Cells _
                                                    Where CStr(IIf(IsDBNull(c.Value), String.Empty, c.Value)) = dato And c.ColumnIndex > colIndex).FirstOrDefault

    Ahora si ya no deberías tener problemas, me avisas.

    ..................................

    Darwin, quise mejorar un poco mas la búsqueda, asi que añadí que no hiciera distinción de mayúsuclas y minúsculas y que además de que no fuese necesaria la palabra completa, por ejemplo si en tu grid en un campo estuviese mi nombre "Yerald Mora", entonces si escribes en tu búsqueda "yerald" no me encontraría por dos razones: 

    1-"Yerald Mora" comienza con mayúscula mientras que "yerald" con minúscula.

    2-"Yerald Mora" no es igual a "yerald" porque "yerald" es una palabra de 6 dígitos mientras que "Yerald Mora" es de 11 dígitos

    Asi que la mejore para que si escribes "yerald" entonce encuentre "Yerald Mora" porque comparará los datos en minúscula y luego buscará si en parte el campo en la grid contiene la palabra "yerald", si la quieres usar así, este sería el código

    Dim nextCell As DataGridViewCell = (From c As DataGridViewCell In DataGridView1.Rows(rowIndex).Cells _
                                                    Where (CStr(IIf(IsDBNull(c.Value) Or IsNothing(c.Value), String.Empty, c.Value))).ToLower.Contains(dato.ToLower) _
                                                    And c.ColumnIndex > colIndex).FirstOrDefault

    • Editado Yerald Mora jueves, 11 de octubre de 2018 18:50 Mejora de búsqueda
    • Marcado como respuesta Darwin123456 jueves, 11 de octubre de 2018 21:34
    jueves, 11 de octubre de 2018 18:25
  • Perfecto muchisimas gracias , con esto quedo solucionado todo muchisimas gracias !!!
    jueves, 11 de octubre de 2018 21:34