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

AutoComplete ComBoxBox usando Listas Genericas

 

Esta es la continuación del articulo

AutoComplete TextBox usando Listas Genericas

Por lo que tendrán que leer el articulo anterior, descargar el ejemplo y hacer las modificaciones correspondientes.

  1. Agregar un control combobox
  2. Y modificar el fragmento de codigo que se proporciona abajo.

En este articulo ya no habrá explicación tan a detalle, el único cambio que haremos con respecto al TextBox es la asignación del AutoCompleteCustomSource al ComboBox:

Código C#:

   1:  
   2: /// <summary>
   3: /// Se encarga de cargar el control TextBox con los datos de la lista
   4: /// </summary>
   5: /// <autor> Jose Luis Garcia Bautista </autor>
   6: /// <param name="sender"></param>
   7: /// <param name="e"></param>
   8: private void Form1_Load(System.Object sender, System.EventArgs e)
   9: {
  10:     try {
  11:         //
  12:         //Establecemos las propiedades del control TextBox
  13:         //
  14:         //textBox1.AutoCompleteCustomSource = LoadAutocomplete()
  15:         //
  16:         //Para esta propiedad tenemos diferentes opciones (None, Suggest, Append, SuggestAppend)
  17:         //para mayor documentacion 
  18:         //http://msdn.microsoft.com/query/dev10.query?appId=Dev10IDEF1&l=ES-ES&k=k(SYSTEM.WINDOWS.FORMS.AUTOCOMPLETEMODE.SUGGEST);k(SUGGEST);k(TargetFrameworkMoniker-%22.NETFRAMEWORK%2cVERSION%3dV4.0%22);k(DevLang-CSHARP)&rd=true
  19:         //
  20:         //textBox1.AutoCompleteMode = AutoCompleteMode.Suggest
  21:  
  22:         //textBox1.AutoCompleteSource = AutoCompleteSource.CustomSource
  23:  
  24:         ComboBox1.AutoCompleteCustomSource = LoadAutocomplete();
  25:         ComboBox1.AutoCompleteMode = AutoCompleteMode.SuggestAppend;
  26:         ComboBox1.AutoCompleteSource = AutoCompleteSource.CustomSource;
  27:     } catch (Exception er) {
  28:         //En caso de ocurrir alguna Excepcion atrapamos el mensaje y mostramos al usuario
  29:         MessageBox.Show(string.Format("Error : {0}", er.Message), "Error inesperado", MessageBoxButtons.OK, MessageBoxIcon.Error);
  30:     }
  31: }

Código Vb.Net



   1: ''' <summary>
   2: ''' Se encarga de cargar el control TextBox con los datos de la lista
   3: ''' </summary>
   4: ''' <autor> Jose Luis Garcia Bautista </autor>
   5: ''' <param name="sender"></param>
   6: ''' <param name="e"></param>
   7: Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
   8:     Try
   9:         '
  10:         'Establecemos las propiedades del control TextBox
  11:         '
  12:         'textBox1.AutoCompleteCustomSource = LoadAutocomplete()
  13:         '
  14:         'Para esta propiedad tenemos diferentes opciones (None, Suggest, Append, SuggestAppend)
  15:         'para mayor documentacion 
  16:         'http://msdn.microsoft.com/query/dev10.query?appId=Dev10IDEF1&l=ES-ES&k=k(SYSTEM.WINDOWS.FORMS.AUTOCOMPLETEMODE.SUGGEST);k(SUGGEST);k(TargetFrameworkMoniker-%22.NETFRAMEWORK%2cVERSION%3dV4.0%22);k(DevLang-CSHARP)&rd=true
  17:         '
  18:         'textBox1.AutoCompleteMode = AutoCompleteMode.Suggest
  19:  
  20:         'textBox1.AutoCompleteSource = AutoCompleteSource.CustomSource
  21:  
  22:         ComboBox1.AutoCompleteCustomSource = LoadAutocomplete()
  23:         ComboBox1.AutoCompleteMode = AutoCompleteMode.SuggestAppend
  24:         ComboBox1.AutoCompleteSource = AutoCompleteSource.CustomSource
  25:     Catch er As Exception
  26:         'En caso de ocurrir alguna Excepcion atrapamos el mensaje y mostramos al usuario
  27:         MessageBox.Show(String.Format("Error : {0}", er.Message), "Error inesperado", MessageBoxButtons.OK, MessageBoxIcon.[Error])
  28:     End Try
  29: End Sub


Después de esto nuestra aplicación deberá de estar trabajando de la siguiente manera:


5


Como no hay mucho que modificar en el proyecto de ejemplo proporcionado en el articulo anterior lo dejaremos hasta aquí.


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