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.
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: }
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:
Saludos desde Monterrey, Nuevo León México!
Nota: El proyecto fue desarrollado en Vs2010 usando una Bd SqlCompact V3.5 y Framework 4.0
Gracias amigo, me dio una idea para una aplicacion, muchas gracias en verdad :D
ResponderEliminarSaludos Jose luis podriaas actualizar los vinvulos si te es posible
ResponderEliminarbuenos 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
ResponderEliminardataGridView1.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
Hola:
EliminarDescarga el ejemplo desde este link:
https://1drv.ms/f/s!AiQ176xmckvhgTZ0tEwMclta_-3u
Saludos
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.
Eliminarhola 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.
ResponderEliminarHola:
EliminarTendrí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.
Que viene siendo _comprobantes
ResponderEliminarViejo, ayudame con lo del mismo problema de
ResponderEliminardataGridView1.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.
Casino Site - LuckyClub
ResponderEliminarA 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