Filtrar resultados usando DataView

En esta oportunidad quiero mostrarles como podemos filtrar los registros de un datagridview en visual basic .net. Este ejemplo está basado en este anterior, pero la diferencia radica en que en lugar de pasarle como datasource al datagridview una tabla, le pasamos un dataview.

Un DataView no es más que una vista de la tabla que nosotros le asignamos y en esta vista podemos realizar varias tareas como la que veremos en este ejemplo: filtrar las filas de la tabla utilizando la propiedad RowFilter.

Este ejemplo es breve y muy sencillo; necesitamos un formulario (Form1), un cuadro de texto (TextBox1) y un datagridview (DataGridView1). A continuación les paso el código completo del formulario

Imports System.Data
Imports System.Data.SqlClient

Public Class Form1
    Private dv As New DataView
    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Dim cnn As New SqlConnection("Data Source=MyServidor;Initial Catalog=MiBaseDeDatos;Integrated Security=SSPI;")

        Dim da As New SqlDataAdapter("SELECT * FROM Products", cnn)
        Dim ds As New DataSet

        da.Fill(ds)

        dv.Table = ds.Tables(0)

        DataGridView1.DataSource = dv
    End Sub

    Private Sub TextBox1_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TextBox1.TextChanged
        dv.RowFilter = String.Format("ProductName Like '%{0}%'", TextBox1.Text)
    End Sub
End Class

Noten que el dataview (dv) se instanció a nivel de formulario y no dentro del evento Load para luego poder acceder a el desde el evento textChange del textbox.

En este caso el filtro solo afecta la columna ProductName, pero seguro ustedes pueden mejorarlo para adaptarlo a sus necesidades.

El resultado debería verse como en la siguiente imagen.



54 Responses to “Filtrar resultados usando DataView”

  1. Información Bitacoras.com…

    Valora en Bitacoras.com: En esta oportunidad quiero mostrarles como podemos filtrar los registros de un datagridview. Este ejemplo está basado en este anterior, pero la diferencia radica en que en lugar de pasarle como datasource al datagridview una ….

  2. Fluireemi dice:

    Thank you!

  3. pshycodelic dice:

    pero haciendolo de la manera tradiciona uso menos codigo XD

    • Eliseo dice:

      No estoy seguro de cual es la forma tradicional para ti, pero en este ejemplo muestro el uso del DataView. La “Gran Ventaja” de usar un DataView como datasource en lugar de un DataTable es que no tengo que volver a llamar los datos y llenar el DataTable con un nuevo WHERE, simplemente seteo la propiedad RowFilter del DataView y sin hacer nada los datos ya estarán filtrados.

  4. conecticut dice:

    Dịch code ra làm gì vậy trời, đọc cứ mụ mị cả lên.

  5. Pedro dice:

    ¿que diferencia existe con el codigo siguiente?

    Private Sub TextBox1_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TextBox1.TextChanged
    Me.DatosalumnosTableAdapter.FillBynombre(ColegioDataSet1.datosalumnos, “%” & TextBox1.Text & “%”)
    End Sub

    lo he realizado de esta manera y me pregunto si s la correcta.

    gracias

  6. damian dice:

    Hola quise correr tu codigo en vb 2008 y me da el siguiente error

    dv.Tables = ds.Tables(0)
    La propiedad tables es Readyonly

    dv.rowfilter
    Rowfilter no es un miembro de System.Data.Dataset

    Me podrias ayudar a resolverlo

    • Eliseo dice:

      fijate en la definición del objeto dv, creo que pusiste “Dim dv as new dataset” en lugar de “Dim dv as new DataView”

  7. damian dice:

    Como haria esta conexion si utilizo access en lugar de Mysql

  8. damian dice:

    ya lo hice pero me esta fallando la ultima parte donde utilizamos el textbox

    • Eliseo dice:

      Damian:
      SQL y Access son muy parecidos a la hora de usar sentencias SQL, pero no son iguales.
      SQL utiliza como comodín para las búsquedas con Like un signo porcentual (%) mientras que Access usa un asterisco (*).
      Reemplaza la instrucción: dv.RowFilter = String.Format(“ProductName Like ‘%{0}%’”, TextBox1.Text)
      Por esta: dv.RowFilter = String.Format(“ProductName Like ‘*{0}*’”, TextBox1.Text)

  9. damian dice:

    Eliseo le agradesco me ayude, y va a decir que como lo molesto, yo trabaje anteriormente con vb 6.0 y pues esto era muy sencillo ahi, ahora con vb 2008 es otra cosa en fin. tengo otro problema

    dv.Table = ds.Tables(0)
    en esta parte del codigo cuando lo corro me da un error “No se controlo NullreferenceException”

  10. Modderclocker dice:

    Exelente sitio…

    tengo una duda… para que cosa utilizas {0} ??? que valores toma ???

    • Eliseo dice:

      msgbox(String.Format(“el primer argunto es {0}, y el segundo es {1}“, “este”, “este otro”)) dará como resultado “el primer argumento es este y el esgundo este otro”.

      String.Format me permite reemplazar parte de un string con los valores de los argumentos que le paso. y en el stringo solo debo agregar los indicadores (con base cero) entre llave para indicar donde irá insertado cada parametro.

  11. damian dice:

    Hola, ya pude corregir mi error estaba en que habia colocado
    Private dv As DataView

    y lo cambie por como lo tienes tu
    Private dv As New DataView

    Aunque sigo sin poder hacer la consulta al parecer el codigo para que haga el filtrado al final no esta bien, estoy buscando otra manera de hacerlo cuando me corra posteo como lo hice

  12. damian dice:

    Ya consegui que me funcionara cambie en codigo que tu me habias posteado por:

    esto
    dv.RowFilter = String.Format(“Descripcion Like ‘” & txtdescripcion.Text & “%’”)

    y me funciona de maravilla

    Muchas gracias Eliseo

  13. ModderClocker dice:

    Gracias por la aclaración….

    utilice la manera que tiene damian ya que no entendía lo que te pregunte mas arriba, pero ahora me queda MUY claro… (con tu método, queda mas profesional :) )

    saludos…!!!

  14. Dany dice:

    Hola, el problema era que cuando haces consultas en SQL con string’s, tenes que tener la comillar simple, que ese es el simbolo de String para SQL. Hay que tene mucho cuidado con eso

  15. Ervin Rivera dice:

    Hola que tal me parece excelente la web y pues he aprendido en un ratito que he estado aqui. una pregunta con respecto al rowfilter

    supongamos que yo lo que quiero es buscar el articulo pero por medio del id del articulo podria hacerlo asi?

    dv.RowFilter = “productid like’%” & TextBox1.Text & “%’”

    o estaria mal. si me podrian explicar se los agradecere.

    Saludos.

    • Eliseo dice:

      Está bien, pero no se aplicaría al Id dado que el Id siempre es único por lo que tendrias que usar un igual (=) en lugar del operador Like.

      Suerte

  16. rolando dice:

    He aplicado los ejemplos y resultan excelentes pero si tengo en el combobox una lista donde hay 5 productos pero tambien existe otra opcion donde dice “todas” como hago para mostrar todos los productos. Este es el codigo del combobox:
    Private Sub cmb_servicios_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmb_servicios.SelectedIndexChanged
    If Me.cmb_servicios.SelectedIndex = 1 Then
    ‘si selecciona todos trae todos los registros

    ‘???????????????

    Else
    Me.dv.RowFilter = String.Format(“cob_servicio like ‘%{0}%’”, Me.cmb_servicios.Text)
    End If
    End Sub

  17. juan dice:

    No se puede abrir la base de datos “bdcompras” solicitada por el inicio de sesión. Error de inicio de sesión.
    Error de inicio de sesión del usuario ‘HOME-12A1B1A2BD\XP’.

    este error me muestra…que sera?

    Gracias.

  18. Teo dice:

    Hola genios de la sintaxis:
    LdvProducto.RowFilter = String.Format(“colNombreComun Like ‘” & txtNombreComunBuscar.Text & “%’”)

    Tengo el siguiente error No se puede encontrar la columna [colNombreComun]
    no entiendo colNombreComun es el nombre de la columna porque probe con el nombre del campo de la tabla por favor urgente

  19. sistemista dice:

    Amigos quisiera que me den una ayuda.
    Quisiera filtrar un Gridview mientras se escribe en un TextBox….
    en visual.net C#.

  20. ch@rl! dice:

    Thanks…
    me salvaste la vida

  21. Dany dice:

    Hola Amigos

  22. Dany el Grande dice:

    Alguien tiene alguna idea de filtrar dos DataView, o sea,
    Tengo dos DataView
    dv1 y dv2
    filtrar el dv1 usando los datos del dv2, sera posible realizar esta tarea?

    Saludos de cordiales, tengan un buen dia.

    • Lucho dice:

      Dany, quizá ya has solucionado el problema pero puedes hacer una especie de formulario maestro, es decir tu dv1 te pasará un un dato que podras ponerlo en un textbox o label, y luego utilizas en el dv2 como parámetro de filtro el ejemplo sobre filtro aqui.

  23. viktor dice:

    gracias por el codigo execelente aportacion

  24. Mistica dice:

    Muy buena la publicacion

    el manejo del dataview lo habia estado buscando para varias cosas y no podia llenarlo, ademas es un muy buen uso el que has mostrado aca

    espero que sigas publicando cosas como esta

    saludos

  25. Luis dice:

    HOLA, HE PROBADO EL CODIGO Y FUNCIONA A LA PERFECCION, EN ESTE SITIO “http://www.solovb.net/index.php/2009/02/05/conectarse-a-una-base-de-datos-de-sql-server-y-llenar-un-datagridview-sin-escribir-codigo/” PUBLICASTE LA MANERA DE LLENAR AUTOMATICAMENTE EL DataGridView y mostrarlo tanto como en forma de tabla como de formulario, necesito saber como realizar el filtro tanto a el datagridview como al formulario que sale cuando arrastras la tabla, ya que cuanto realizo la busqueda solo me cambia la posicion en el datagridview y no es los cuadros de texto.
    POR FAVOR ESPERO TU RESPUESTA

  26. luis dice:

    oye, amigo deberías dejar que todos pudieran publicar sus programas, yo tengo varios hechos en visual basic 2008, y creo que les ayudaría a muchos.

  27. lily dice:

    hola tengo un problema con el datagridview,lo que necesito hacer es que al seleccionar una fecha inicial y una fecha final por medio de dos datetimepicker y darle click a un boton se filtren los datos, pero esa fecha inicial y fecha final son parte de mis campos es decir, tengo nombre, fehc inicial, fecha final, entre otros datos, espero puedan ayudarme, uso sql y visual 2008

    • Juan dice:

      Hola.. lily. .ya pudistes resolver tu problema? estoy igual q tu.. tengo ya algo de tiempo tratando de encontrar la manera de filtrar por fechas.. si lo logras solucionar por favor me dices como.. Gracias

  28. porch dice:

    hola amigos espero q me puedan ayudar
    tengo el siguiente orror estoy filtando en un datagrid o datagridview es parecido pero el error es el mismo no estiendo la sintaxis de la cosulta es :P rivate Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    Call conectar()
    Call mostrar(“select (t1.itemname+’-'+t1.salunitmsr) as Descripcion,sum(t0.quantity) As Cantidad,t0.batchnum AS Lote ,t0.expdate AS [Fecha de Vencimiento] from oibt t0 inner join oitm t1 on t0.itemcode=t1.itemcode where t1.itemcode >= ’1010001′ and t1.itemcode =’01′ and t0.whscode <='03' and t0.quantity !=0 group by (t1.itemname+'-'+t1.salunitmsr),t0.batchnum,t0.expdate order by 1 ")
    Me.DataGrid1.SetDataBinding(datos, "x")
    vista1.Table = datos.Tables("x")
    Call destruir_cone()
    End Sub
    Private Sub TextBox1_TextChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles TextBox1.TextChanged
    Call conectar()
    vista1.RowFilter = String.Format("t1.itemname like '{0}%'", Me.TextBox1.Text)
    Me.DataGrid1.DataSource = vista1
    Me.DataGrid1.Update()
    Call destruir_cone()
    End Sub
    pero en texbox hago el filtro como lo postearon arriba y el error que sale es no se puede encontar la columna t1.itemname

  29. Andres Vasquez dice:

    Gracias, de Corazon de Digo Muchas Gracias, Pasa por Aqui Por Una Consulta, Pero Encontre Esta que es mejor.

    Desde Guatemala

  30. Mickes dice:

    Hay un detalle que hace que empiece a filtrar hasta que se escribe la segunda letra…

  31. Massey dice:

    Disculpa .. alguna ayuda para..

    Agregar, Modificar y eliminar registros desde el mismo datagridview ????

  32. hada dice:

    hola
    Me.dv.RowFilter = String.Format(“id_ciudad like ‘%{0}%’”, Me.id_ciudad.Text)..
    si digito letras en mi txt me cuelga el programa… como hago para q no suceda, se supone q el id_ciudad son numeros!!!help

  33. juan pablo v dice:

    GRACIAS MEN
    ME HA SERVIDO MUCHO

  34. Luis Glez dice:

    Que tal con la misma duda que le tocayo, la verdad les agradeceria que me pudieran orientar ya busque varios metodos distintos y ninguno me funcion de antemano gracias!

  35. Stephanie dice:

    Muchas graciass.. me sirvio mucho la verdad.. 100%

  36. davidd88 dice:

    Hola e utilizado el codigo en visual basic 2008 y me sale el siguiente error en la fila
    Da.Fill.(ds)
    {“Error relacionado con la red o específico de la instancia mientras se establecía una conexión con el servidor SQL Server. No se encontró el servidor o éste no estaba accesible. Compruebe que el nombre de la instancia es correcto y que SQL Server está configurado para admitir conexiones remotas. (provider: Proveedor de canalizaciones con nombre, error: 40 – No se pudo abrir una conexión con SQL Server)”}

    ¿a que se pude deber?

  37. JOEX dice:

    Se que el post tiene algo de tiempo, mas sin embargo acabo de utilizar el codigo para un filtrado y me arroja un error….” No se controlo FormatException Index (zero based) must be greater than or equal to zero and less than the size of the argument list.”… espero puedas ayudarme de antemano gracias!!!

  38. Sergio dice:

    Mchas Gracias man.!! me sirvio lo andaba buscando.

  39. eduar dice:

    Buenas tardes como estan.

    que hace exactamente este trozo de codigo

    Tables(0)

    y si tengo verias tablas que colocaria para filtrar.

    • Eliseo dice:

      un dataset (ds) puede tener varias tablas cargadas, en el ejemplo solo tiene una. Aunque solo tenga una hay que especificar a que tabla del dataset nos referimos, por eso indicamos que usaremos la primer tabla Tables(0).

      Suerte.

  40. nirgacia dice:

    Gracias =)

  41. EURABU dice:

    hola
    he probado el codigo y genera el siguiente error en el textbox
    No se puede realizar la operación ‘Like’ en System.Int32 y System.String.
    me ayuda por favor

  42. Ivan dice:

    Hola EURABU como estas poniendo esta parte del codigo String.Format(“NombreTela Like ‘%{0}%’”, txtNombreCodigo.Text); puede ser el valor que hayas ingresado. checa

Comentar