Filtrar datos en DataGridView

Vamos a filtrar datos en un DataGrigView, pero antes de eso se ha debido cargar los registros al DGV, previa búsqueda de por ejemplo, Clientes que su nombre o apellido comience con M, una vez cargada la data, se procede a filtrar los datos, hacer la búsqueda en el DGV, más no en la DB.

Sería una mala practica tener los datos cargados en el DGV y hacer el filtro en la DB, lo que se pretende con esta técnica es liberar recursos en el servidor de datos y pretender una mejor performance de la aplicación.

Vamos a crear un método con DataTable en el cual le vamos asignar los datos que recuperamos de la DB.

public class ClienteRepository
    {
        public static DataTable GetCliente()
        {
            using (SqlCeConnection cn = Conexion.Conectar("NorthwindConnectionString"))
            {
                cn.Open();
                using (SqlCeCommand cmd = cn.CreateCommand())
                {
                    cmd.CommandText = "SELECT [Customer ID], [Company Name] FROM Customers";

                    using (SqlCeDataAdapter da = new SqlCeDataAdapter(cmd))
                    {
                       DataTable dt = new DataTable();
                        da.Fill(dt);
                        return dt;
                    }
                }
            } 
        }

Ahora vamos a llamar el método GetCliente desde el evento Load del formulario para cargar el DataGridView.

public partial class frmCliente : Form
    {
        private DataTable dt = new DataTable();
        private DataSet ds = new DataSet();
        public frmCliente()
        {
            InitializeComponent();
        }

        private void frmCliente_Load(object sender, EventArgs e)
        {
            dt = ClienteRepository.GetCliente();
            ds.Tables.Add(dt);
            dgvCliente.DataSource = dt;
            FormatoGrilla();
        }

Ya esta cargado el objeto DGV con los datos ahora pasamos a hacer la búsqueda en los datos que tiene cargado el DGV, mas no en la DB. Como decía líneas arriba hemos utilizado un objeto DataTable, para poder usar el DataView.

El DataView representa una vista personalizada que puede enlazar datos de un DataTable para ordenación, filtrado, búsqueda, edición y navegación. El DataView no almacena datos, si no que representa una vista conectada de su correspondiente DataTable.

private void txtDescripcion_TextChanged(object sender, EventArgs e)
        {
            string fieldName = string.Concat("[", dt.Columns[1].ColumnName,"]");
            dt.DefaultView.Sort = fieldName;
            DataView view = dt.DefaultView;
            view.RowFilter = string.Empty;
            if (txtDescripcion.Text != string.Empty)
                view.RowFilter = fieldName + " LIKE '%" + txtDescripcion.Text + "%'";
            dgvCliente.DataSource = view;
        }

El filtro lo realizamos en el evento txtDescripcion_TextChanged de la caja de texto que vamos usar para ingresar los datos que queremos filtrar o buscar. Quedaría de esta manera.

DGV

Descargar Proyecto C#

 

Anuncios

18 pensamientos en “Filtrar datos en DataGridView

      1. nayadanthy

        hola! podrian ayudarme por favor? :p
        pues bueno les cuento XD necesito filtrar en un DataGridView una columna que tiene campos vacios de una base de datos en sql como podria hacerlos?
        soy nueva en esto, espero puedan ayudarme

  1. Samuel Amador

    Hola amigo, antes que nada muchas gracias por compartir. Una pregunta como podría hacerle si yo quisiera filtrar de mas de un filtro a la vez? por ejemplo 3 textbox,si primero capturara datos en uno, y en base al resultado pudiera filtrar otro? Gracias una vez mas

    Responder
    1. Pedro Avila

      @Samuel
      Lo que puedes hacer es que cuando quieras hacer una búsqueda llames a un formulario tipo inputbox en el cual le pasas la palabra a búscar y ese resultado te trae una grilla con datos y en esa grilla buscas dentro de la grilla NO EN LA BASE DE DATOS, eso te dará una mejor performace en tus búsquedas

      Responder
  2. Samuel Amador

    Amm creo que no te entendí, disculpame, pero mira estoy haciendo un proyecto que pueda utilizar 10 filtros, en el load de formulario cargo la base de datos pero después si el usuario va realizando búsquedas pueda encontrar exactamente su resultado.

    Responder
    1. Pedro Avila

      @Samuel tu aplicación es web, escritoriio, que es lo que buscas? clientes, pedidos, proveedores, etc. Cargas la base de datos? cargas alguno registros dirás de una tabla, se mas especifico, para poder entender mejor lo que buscas en realidad.

      Responder
  3. Samuel Amador

    Si gracias,mira es una aplicación de escritorio en la cual seguí lo que nos hiciste favor de compartir, y me funciono perfecto, sin embargo busco que el datagridview que ya esta lleno de una tabla de la base de datos yo pueda filtrar los datos que quiera sin importar si llena un textbox o mas. puesto que el datagrid contiene muchas columnas, Pero que se valla actualizando el datagrid con el evento TextChanged como cuando haces una búsqueda pero con muchos filtros, se que le doy muchas vueltas pero no se si me pudieras ayudar. En pocas palabras hacer lo mismo que hiciste arriba pero con 10 textbox.

    Responder
    1. Pedro Ávila Núñez Autor de la entrada

      @Samuel
      Disculpa la demora, podrías hacer algo como esto:
      public static DataTable SelectDT(PersonalCriteria filter)
      {
      using (SqlConnection cn = Conexion.Conectar("default"))
      {
      using (SqlCommand cmd = cn.CreateCommand())
      {
      cmd.CommandText = @"SELECT Codigo AS Código, Nombre, Telefono AS Descripción FROM Personal
      WHERE((@Codigo IS NULL) OR (Codigo LIKE '%' + @Codigo + '%'))
      AND ((@Nombre IS NULL) OR (Nombre LIKE '%' + @Nombre + '%'))
      AND((@Telefono IS NULL) OR(Nombre LIKE '%' + @Telefono + '%'))";

      cmd.Parameters.AddWithValue("@Codigo", string.IsNullOrEmpty(filter.Codigo)
      ? (object)DBNull.Value
      : filter.Codigo);
      cmd.Parameters.AddWithValue("@Nombre", string.IsNullOrEmpty(filter.Nombre)
      ? (object)DBNull.Value
      : filter.Nombre);
      cmd.Parameters.AddWithValue("@Telefono", string.IsNullOrEmpty(filter.Telefono)
      ? (object)DBNull.Value
      : filter.Telefono);
      using (SqlDataAdapter da = new SqlDataAdapter(cmd))
      {
      DataTable dt = new DataTable();
      da.Fill(dt);
      return dt;
      }
      }
      }
      }

      Vas aumentando AND cada vez que necesites mas filtros.

      Responder
  4. Yan

    gracias por el aporte, me fue de mucha utilidad, solo me queda una duda, como podria adaptarlo para que busque en todas los columnas del datagrid y no solo en una.

    es decir en esta parte
    string fieldName = string.Concat(“[“, dt.Columns[1].ColumnName,”]”);

    Responder

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s