none
Filtrar datagridview

    Pregunta

  • Hola, como puedo hacer para buscar un valor de una celda que se encuentra dentro de un datagridview, teniendo en cuenta que los registros del datagrid no están relacionado con ninguna base de datos.

    Quiero me seleccione el valor que se esta buscando en el text y me oculte el resto.

    Lo que tengo es lo siguiente.

      Private Sub txtbuscar_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles txtbuscar.TextChanged
            For i As Integer = 0 To Me.DataGridView1.Rows.Count - 2
                For x As Integer = 0 To DataGridView1.ColumnCount - 1
                    If DataGridView1.Rows(i).Cells(1).Value.ToString.Contains(Me.txtbuscar.Text) Then
                        Me.DataGridView1.CurrentCell = DataGridView1.Rows(i).Cells(1)
    
                        Exit Sub
                    End If
                Next x
            Next i
        End Sub
    El problema que tengo con esto es que no me oculta el resto de registros no buscados y ademas no me busca los registros cuando los valores de la Cells(3) son igual a "0".

    Saludos.
    miércoles, 28 de diciembre de 2016 23:17

Respuestas

  • Federico3213,

    Basta con indicar el nombre de la columna:

    Private Sub txtbuscar_TextChanged(sender As Object, e As EventArgs)
    
    	Dim Buscar As String = DirectCast(sender, TextBox).Text.ToUpper
    
    	DataGridView1.CurrentCell = Nothing
    
    	For Each Fila As DataGridViewRow In DataGridView1.Rows.Cast(Of DataGridViewRow).
    			Where(Function(f) Not f.IsNewRow)			
    		Fila.Visible = Convert.ToString(Fila.Cells("NombreCol").Value).ToUpper.Contains(Buscar)
    	Next
    
    End Sub


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    • Marcado como respuesta Federico32113 jueves, 29 de diciembre de 2016 16:52
    jueves, 29 de diciembre de 2016 1:55

Todas las respuestas

  • Federico3213,

    No entiendo que quieres decir con "no me oculta el resto de los registros". Prueba el siguiente código e indícanos si cubrió tus necesidades (es de esperar que tengas configurado la propiedad SelectionMode a CellSelect).

    Dim RefCelda As DataGridViewCell = Nothing
    For Each Fila As DataGridViewRow In DataGridView1.Rows.Cast(Of DataGridViewRow)().
    		Where(Function(f) Not f.IsNewRow)
    	For Each Celda As DataGridViewCell In Fila.Cells
    		If Convert.ToString(Celda.Value).Equals(txtbuscar.Text,
    			StringComparison.CurrentCultureIgnoreCase) Then
    			RefCelda = Celda
    		End If
    	Next
    Next
    
    If RefCelda IsNot Nothing Then
    	DataGridView1.ClearSelection()
    	DataGridView1.CurrentCell = RefCelda
    Else
    	MessageBox.Show("No se ha encontrado ninguna coincidencia")
    End If

    El código propuesto selecciona la última celda que coincida con el valor de búsqueda. 


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    miércoles, 28 de diciembre de 2016 23:34
  • En parte realiza lo que necesito.

    _Faltaría que me oculte el resto de las filas que no coinciden con el valor del textbox , necesito que muestre solamente las filas que coincidan con el textbox, por ejemplo si ingreso "hola" que me muestre todos los registros que contengan ese valor.

    _Con tu código busco mediante el "Id" como puedo hacer para buscar por la columna siguiente en este caso "Nombre".

    _Mientras voy tecleando que me muestre las filas que corresponden.

    _Necesito seleccionar la fila completa "FullRowSelect"

    No sabes como editar el código mencionado al principio para que me oculte el resto de las filas no contienen el valor del text?


    miércoles, 28 de diciembre de 2016 23:55
  • Federico3213,

    El código que te propongo busca un valor en cada celda por cada fila, si el valor se encuentra se pinta la celda caso contrario se oculta la fila.

    Private Sub txtbuscar_TextChanged(sender As Object, e As EventArgs)
    
    	Dim Buscar As String = DirectCast(sender, TextBox).Text.ToUpper
    
    	DataGridView1.CurrentCell = Nothing
    
    	For Each Fila As DataGridViewRow In DataGridView1.Rows.Cast(Of DataGridViewRow).
    			Where(Function(f) Not f.IsNewRow)
    			
    		Fila.Visible = Fila.Cells.Cast(Of DataGridViewCell)().
    			Any(Function(c) Convert.ToString(c.Value).ToUpper.Contains(Buscar))
    
    		If Fila.Visible Then
    			For Each Celda As DataGridViewCell In Fila.Cells.Cast(Of DataGridViewCell)().
    				Where(Function(c) Convert.ToString(c.Value).ToUpper.Contains(Buscar))
    				Celda.Style.BackColor = IIf(String.IsNullOrEmpty(Buscar), 
    							Color.White, Color.LightGreen)
    			Next
    		End If
    	Next
    
    End Sub



    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.

    jueves, 29 de diciembre de 2016 1:10
  • El código que publicaste antes hace exactamente lo que yo queria.

      Dim txt As TextBox = DirectCast(sender, TextBox)
    
            DataGridView1.CurrentCell = Nothing
            DataGridView1.Rows.Cast(Of DataGridViewRow)().ToList().
             ForEach(Function(f) f.Visible = True)
    
            For Each Fila As DataGridViewRow In DataGridView1.Rows.Cast(Of DataGridViewRow).
              Where(Function(f) Not f.IsNewRow)
                Fila.Visible = Fila.Cells.Cast(Of DataGridViewCell)().
                 Any(Function(c) Convert.ToString(c.Value).ToUpper.Contains(txt.Text.ToUpper))
            Next
    Una ultima cosa, como puedo modificar el código de tal manera que pueda buscar por una columna determinada.

    jueves, 29 de diciembre de 2016 1:29
  • Federico3213,

    Basta con indicar el nombre de la columna:

    Private Sub txtbuscar_TextChanged(sender As Object, e As EventArgs)
    
    	Dim Buscar As String = DirectCast(sender, TextBox).Text.ToUpper
    
    	DataGridView1.CurrentCell = Nothing
    
    	For Each Fila As DataGridViewRow In DataGridView1.Rows.Cast(Of DataGridViewRow).
    			Where(Function(f) Not f.IsNewRow)			
    		Fila.Visible = Convert.ToString(Fila.Cells("NombreCol").Value).ToUpper.Contains(Buscar)
    	Next
    
    End Sub


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    • Marcado como respuesta Federico32113 jueves, 29 de diciembre de 2016 16:52
    jueves, 29 de diciembre de 2016 1:55