domingo, 18 de agosto de 2013

Filtrar DataGridView usando Listas Genericas

 

Hola; esta vez les comparto la manera de como filtrar los valores mostrados en un control DataGridView que tiene como DataSource una lista genérica de propiedades.

Para el ejemplo cargaremos una lista de datos en el control DataGridView y usaremos un control TextBox para ir aplicando el Filtro conforme vayamos tecleando caracteres.

6

Veamos el código utilizado en el ejemplo:

Usamos una clase de acceso a datos en donde crearemos una función encargada de hacer la conexión, enviar la consulta SQL y devolver una lista de datos:

   1: using System;
   2: using System.Collections.Generic;
   3: using System.Configuration;
   4: using System.Data.SqlServerCe;
   5:  
   6: namespace FiltrarDataGridViewListofT
   7: {
   8:     public class Data
   9:     {
  10:  
  11:         /// <summary>
  12:         ///  Obtiene informacion de la tabla especificada y devuelve una lista generica de propiedades
  13:         /// con los datos recuperados
  14:         /// </summary>
  15:         /// <autor> Jose Luis Garcia Bautista </autor>
  16:         /// <returns>Lista Generica del tipo DataProperties</returns>
  17:         public static List<DataProperties> CargarDatos()
  18:         {
  19:             //
  20:             // Declaramos una variable del tipo List<Of DataProperties> para cargar los datos recuperados de la BD
  21:             List<DataProperties> lista = new List<DataProperties>();
  22:             //
  23:             //Abrimos la conexión a nuestra Bd usando el archivo de configuracion App.Config
  24:             using (SqlCeConnection cnx = new SqlCeConnection(ConfigurationManager.ConnectionStrings["GeografiaConnectionString"].ToString()))
  25:             {
  26:                 //
  27:                 //Abrimos la conexión a la Bb
  28:                 cnx.Open();
  29:                 //
  30:                 //Creamos una variable constante para establecer la instruccion SQL
  31:                 const string sql = "SELECT * FROM Municipio ORDER BY Nombre ASC";
  32:                 //
  33:                 //Creamos el objeto Command propio del motor de BD que estemos usando en este caso SqlCeCommand
  34:                 SqlCeCommand cmd = new SqlCeCommand(sql, cnx);
  35:                 //
  36:                 //Creamos el objeto DataReader que se encargara de proporcionarnos las filas de datos obtenidas
  37:                 SqlCeDataReader dr = cmd.ExecuteReader();
  38:                 //
  39:                 // Preguntamos si el objeto DataReader correspondiente contiene datos
  40:                 while (dr.Read())
  41:                 {
  42:                     //
  43:                     //Instanciamos la clase contenedora de las propiedades para mepear los datos recuperados
  44:                     //de la BD
  45:                     DataProperties item = new DataProperties
  46:                     {
  47:                         //
  48:                         //Convertimos al tipo de dato correcto
  49:                         Numero = Convert.ToInt32(dr["Numero"]),
  50:                         Nombre = Convert.ToString(dr["Nombre"]),
  51:                     };
  52:                     //
  53:                     //Agregamos el nuevo item a la lista
  54:                     lista.Add(item);
  55:                 }
  56:  
  57:             }
  58:             //
  59:             //retornamos la lista 
  60:             return lista;
  61:         }
  62:     }
  63: }

 

Clase de propiedades utilizada para cargar la lista genérica:


   1: namespace FiltrarDataGridViewListofT
   2: {
   3:     public class DataProperties
   4:     {
   5:         public int Numero { get; set; }
   6:         public string Nombre { get; set; }
   7:     }
   8: }


Ahora vayamos a ver el código implementado en el Formulario en el cual se aplicara el Filtro:


Declaramos una lista con nivel de acceso privado:



   1: using System;
   2: using System.Collections.Generic;
   3: using System.Linq;
   4: using System.Windows.Forms;
   5:  
   6: namespace FiltrarDataGridViewListofT
   7: {
   8:     public partial class Form1 : Form
   9:     {
  10:         private static List<DataProperties> _lista = new List<DataProperties>();
  11:         public Form1()
  12:         {
  13:             InitializeComponent();
  14:         }


En el evento Load del form usamos la funcion CargarDatos() del objeto Data para llenar el control DataGridView.



   1: private void Form1_Load(object sender, EventArgs e)
   2: {
   3:     //
   4:     // Establecemos la propiedad AutoGenerateColumns en false para evitar que se nos creen nuevas columnas
   5:     //al establecer el DataSource de control DataGridView
   6:     //
   7:     dataGridView1.AutoGenerateColumns = false;
   8:     //
   9:     // llenamos la lista con los datos recuperados de la funcion Llenar lista de la clase Data
  10:     //
  11:     //
  12:     _lista = Data.CargarDatos();
  13:     //
  14:     // Establecemos el DataSource de control DataGridView
  15:     //
  16:     dataGridView1.DataSource = _lista;
  17:     //
  18:     //Mapeamos las propiedades a las columnas del DGV para eso usamos el nombre de la columna
  19:     //
  20:     dataGridView1.Columns["columnNumero"].DataPropertyName = "Numero";
  21:     dataGridView1.Columns["columnNombre"].DataPropertyName = "Nombre";
  22: }


Creamos una función llamada Filtrar con un parámetro de entrada del tipo String:



   1: /// <summary>
   2: ///  Función encargada de filtrar la lista recuperada y establecer el resultado como DataSource
   3: /// del control DataGridView
   4: /// <Autor> José Luis García Bautista</Autor>
   5: /// </summary>
   6: /// <param name="val"> Valor ingresado en el control TextBox</param>
   7: private void Filtrar(string val)
   8: {
   9:     //
  10:     // Usamos una consulta Linq para filtrar los valores de la lista usando la
  11:     // función StartWith enviandole el valor ingresado en el control TextBox.
  12:     // 
  13:     // where l.Nombre.ToLower() ToLower() se encarga de convertir los valores de la propiedad Nombre a minusculas
  14:     //.StartsWith(val.ToLower()) el valor contenido en el parametro val lo convertimos a minuscula para
  15:     // estandarizar la busqueda
  16:     //
  17:     var query = from l in _lista where l.Nombre.ToLower().StartsWith(val.ToLower()) select l;
  18:     //
  19:     //
  20:     // Establecemos la propiedad DataSource del DGV usando el resultado de la consulta Linq
  21:     //
  22:     dataGridView1.DataSource = query.ToList();
  23:     //
  24:     dataGridView1.Columns["columnNumero"].DataPropertyName = "Numero";
  25:     //
  26:     dataGridView1.Columns["columnNombre"].DataPropertyName = "Nombre";
  27: }

Usamos la función Filtrar() en el evento TextChanged del control TextBox, usamos este evento para hacer el filtro dinámico, ya que cada vez que cambie el valor del TextBox se usara la función tomando como valor del parámetro el valor del Text.



   1: private void textBox1_TextChanged(object sender, EventArgs e)
   2: {
   3:     Filtrar(textBox1.Text.Trim());
   4: }

Aplicando el filtro tendremos un resultado como el siguiente:


7


Saludos desde Monterrey, Nuevo León México!


Ejemplo C#


Ejemplo Vb.Net


Nota: El proyecto fue desarrollado en Vs2010 usando una Bd SqlCompact V3.5 y Framework 4.0

10 comentarios:

  1. Gracias amigo, me dio una idea para una aplicacion, muchas gracias en verdad :D

    ResponderEliminar
  2. Saludos Jose luis podriaas actualizar los vinvulos si te es posible

    ResponderEliminar
  3. buenos dias quisiera saber si me podrias enviar el proyecto para ver que error tiene o si puedes volver a subirlo le agradesco ya que al ejecutarlo me crea un error en
    dataGridView1.Columns["columnNumero"].DataPropertyName = "Numero";
    Excepción no controlada del tipo 'System.NullReferenceException' en WindowsFormsApplication1.exe

    Información adicional: Referencia a objeto no establecida como instancia de un objeto.
    y no se que hacer muchas gracias y feliz navidad

    ResponderEliminar
    Respuestas
    1. Hola:

      Descarga el ejemplo desde este link:
      https://1drv.ms/f/s!AiQ176xmckvhgTZ0tEwMclta_-3u

      Saludos

      Eliminar
    2. muchas gracias hermano me salvaste de estar haciendo llamados a la bd mil gracias, fue el unico quien respondio este tema casi no lo encuentro.

      Eliminar
  4. hola que pena molestar tando, por casualidad no tienes como hacer un filtrado con 2 o 3 variables mas ? quedo atento muchas gracias por la ayuda hasta ahora.

    ResponderEliminar
    Respuestas
    1. Hola:

      Tendrías que aplicar un filtro condicional, te dejo este ejemplo:

      private void mtxtFilter_TextChanged(object sender, EventArgs e)
      {
      try
      {
      var filtered = (from x in _comprobantes
      where (((x.FolioFiscal != null) && (x.FolioFiscal.ToUpper().StartsWith(mtxtFilter.Text)))
      || ((x.RfcEmisor != null) && (x.RfcEmisor.ToUpper().StartsWith(mtxtFilter.Text)))
      || ((x.NombreEmisor != null) && (x.NombreEmisor.ToUpper().StartsWith(mtxtFilter.Text)))
      || ((x.RfcReceptor != null) && (x.RfcReceptor.ToUpper().StartsWith(mtxtFilter.Text)))
      || ((x.NombreReceptor != null) && (x.NombreReceptor.ToUpper().StartsWith(mtxtFilter.Text)))
      || ((x.FechaEmision != null) && (x.FechaEmision.StartsWith(mtxtFilter.Text)))
      || ((x.EfectoComprobante != null) && (x.EfectoComprobante.StartsWith(mtxtFilter.Text)))
      || ((x.EstadoComprobante != null) && (x.EstadoComprobante.StartsWith(mtxtFilter.Text)))
      )
      select x).ToList();

      mGridComprobantes.DataSource = filtered;
      }
      catch (Exception ex)
      {
      MetroMessageBox.Show(_owner, string.Format("Error: {0}", ex.Message), "Error inesperado", MessageBoxButtons.OK,
      MessageBoxIcon.Error);
      }
      }

      Observa que estoy filtrando por 8 campos mas, pero usando un solo campo de entrada...

      Espero te sea de utilidad.

      Eliminar
  5. Viejo, ayudame con lo del mismo problema de

    dataGridView1.Columns["columnNumero"].DataPropertyName = "Numero";
    Excepción no controlada del tipo 'System.NullReferenceException' en WindowsFormsApplication1.exe

    Información adicional: Referencia a objeto no establecida como instancia de un objeto.

    estoy trabajando con una bd en heidiSQL y mi codigo es muy dierente al tuyo, supe interpretarlo y todo pero sigue dandome ese error, te agradeceria mucho la ayuda.

    ResponderEliminar
  6. Casino Site - LuckyClub
    A lucky club is one of luckyclub the largest betting portals of online gambling. It offers a wide range of betting options from free bet and real money wagering. This casino is

    ResponderEliminar

Deja un comentario si el articulo fue de utilidad.