none
Buscar (filtrar) en un DatagridView

    Pregunta

  • Cordial saludo.

    el problema es el siguiente:

    Necesito buscar por medio de un ComboBox y un TextBox, datos de un DatagridView el cual muestra información tomada de una tabla en SQL.

    el DatagridView esta constituido de la siguiente manera:

    Codigo   -      Nombre     -    Cedula      -   año

    111      -   juan perez     -    12345      -  2016

    112      -   maria Diaz     -    76545      -  2015

    123      -   Jose leon       -    65677      -   2016

    la idea es que yo ingrese en le ComboBox la columna por la cual voy a buscar, y en el TextBox el dato a buscar 

    ejemplo: ComboBox1= Nombre,  TextBox1= Maria Diaz

    el codigo que tengo es el siguiente: 

    Private Sub Buscar()
            Try
                Dim DS As New DataSet
                DS.Tables.Add(DT.Copy)
                Dim dv As New DataView(DS.Tables(0))

                dv.RowFilter = ComboBox1.Text & " like '" & TextBox1.Text & "%'"

                If dv.Count <> 0 Then
                   DatagridView1.DataSource = dv
                
                Else    
                    DatagridView1.DataSource = Nothing

                End If
            Catch ex As Exception
                MsgBox(ex.Message)
            End Try
        End Sub

     pero no me filtra nada: que error hay, o como hago una búsqueda correcta?


    miércoles, 24 de agosto de 2016 14:16

Respuestas

  • JorgeLeonardoDC,

    Puedes hacer algo simple apoyándote con LinQ:

    Private Sub btnFiltrar_Click(sender As Object, e As EventArgs)
    
            Dim dt As DataTable = DirectCast(DataGridView1.DataSource, DataTable)
    
            DataGridView1.DataSource = dt.AsEnumerable() _
                .Where(Function(r) r.Field(Of String)(ComboBox1.Text) = TextBox1.Text) _
                .CopyToDataTable()
        End Sub

    Considera cargar como elementos del desplegable todas las columnas del objeto DataTable.


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    miércoles, 24 de agosto de 2016 17:27

Todas las respuestas

  • Hola, puede ser por las dobles comillas, prueba con

     dv.RowFilter = String.Format(ComboBox1.Text & " LIKE '{0}%'", TextBox1.Text)
            DataGridView1.DataSource = dv

    miércoles, 24 de agosto de 2016 17:00
  • Una pregunta y porque no realizas la búsqueda mediante una consulta SQL en el evento TextChanched del textbox.

    Algo asi:

    Private Sub TBusqueda_TextChanged(sender As Object, e As EventArgs) Handles TBusqueda.TextChanged
            If TBusqueda.Text <> "" Then
               SQl = "Select * From tutabla Where " & combobox1.text & " = '" & tbusqueda.text & "'"
    'operaciones.....
    datagridview1.datasource = tutabla
            End If
    
        End Sub




    Alexander Jimenez

    miércoles, 24 de agosto de 2016 17:08
  • JorgeLeonardoDC,

    Puedes hacer algo simple apoyándote con LinQ:

    Private Sub btnFiltrar_Click(sender As Object, e As EventArgs)
    
            Dim dt As DataTable = DirectCast(DataGridView1.DataSource, DataTable)
    
            DataGridView1.DataSource = dt.AsEnumerable() _
                .Where(Function(r) r.Field(Of String)(ComboBox1.Text) = TextBox1.Text) _
                .CopyToDataTable()
        End Sub

    Considera cargar como elementos del desplegable todas las columnas del objeto DataTable.


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    miércoles, 24 de agosto de 2016 17:27
  • me sale el error:

    no se puede encontrar la columna [Codigo]

    y así es con las demás columnas 

    miércoles, 24 de agosto de 2016 21:43
  • JorgeLeonardoDC,

    ¿Cómo cargas las columnas al desplegable? Considera que la búsqueda es por el nombre de la columna mas no por el título de la columna.

    ¿Podrías colocar el código que has desarrollado?


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    miércoles, 24 de agosto de 2016 21:54
  •   Public Function Mostrar() As DataTable
            Try
                Conectado()
                cmd = New SqlCommand("mostrar_DatosDelPredio")
                cmd.CommandType = CommandType.StoredProcedure
                cmd.Connection = cnn

                If cmd.ExecuteNonQuery Then
                    Dim DT As New DataTable
                    Dim DA As New SqlDataAdapter(cmd)
                    DA.Fill(DT)
                    Return DT

                Else
                    Return Nothing

                End If

            Catch ex As Exception
                MsgBox(ex.Message)
                Return Nothing
            Finally
                Desconectado()

            End Try
        End Function

    y luego llamo la función mostrar en el form

    Private Sub mostar()

            Try
                Dim func As New DDatosPredio
                DT = func.Mostrar

                If DT.Rows.Count <> 0 Then
                    DataListado.DataSource = DT
                    DataListado.ColumnHeadersVisible = True
                    Inexistente.Visible = False

                Else
                    DataListado.DataSource = Nothing
                    DataListado.ColumnHeadersVisible = False
                    Inexistente.Visible = True
                End If
            Catch ex As Exception
                MsgBox(ex.Message)
            End Try

            Inexistente.Visible = False

       End Sub    

    Ahora:

    solo necesito buscarlo solo por el "codigo" (nombre de la columna)

    entonces ya no necesitaría el ComboBox, solo el TextBox.


    miércoles, 24 de agosto de 2016 22:07
  • JorgeLeonardoDC,

    ¿Cómo realizas el filtro?

    miércoles, 24 de agosto de 2016 22:17
  • Hola, una pregunta, ¿ como sería en el caso de que el datasource fuera del tipo BindingSource ?.

    Gracias.

    jueves, 25 de agosto de 2016 8:31
  •  Private Sub Buscar()
            Try
                Dim DS As New DataSet
                DS.Tables.Add(DT.Copy)
                Dim dv As New DataView(DS.Tables(0))

                dv.RowFilter = cb_Campo.Text & " like '" & txt_Buscar.Text & "%'"

                If dv.Count <> 0 Then
                    Inexistente.Visible = False
                    DataListado.DataSource = dv

                Else
                    Inexistente.Visible = True
                    DataListado.DataSource = Nothing

                End If
            Catch ex As Exception
                MsgBox(ex.Message)
            End Try
        End Sub

    Solo funciona después de guardar un valor, ¿porque?

    jueves, 25 de agosto de 2016 14:41