Filtrar elementos de una colección (List) por un campo especificado

En este pequeño ejemplo veremos como filtrar elementos de una colección por un campo especificado y mostrarlos en el DataGridview.

Antes de todo, en este ejemplo utilizamos la clase List<> para crear nuestra colección, así que necesitamos familiarizarnos con:

Ya con esta información empezamos a trabajar.

En este ejemplo implementaremos una clase llamada Alumno, que tiene las propiedades: Matricula, Nombre, Apellidos y Grupo, contiene también 2 constructores, un constructor simple y otro que toma 4 argumentos para llenar todos los campos del objeto.

Diseñamos nuestro formulario que contiene: 1 Label, 1 ComboBox y 1 DataGridView con sus respectivos nombres.

En el código de nuestro formulario declaramos nuestra colección de objetos Alumno:


List listadealumnos = new List();

En el evento Load del formulario, agregamos algunos elementos a la lista:


private void ColeccionFrm_Load(object sender, EventArgs e)
{
//Agregar algunos objetos a la colección utilizando el constructor que toma 4 argumentos
listadealumnos.Add(new Alumno(1, "Nombre1", "Apellidos1", "A"));
listadealumnos.Add(new Alumno(2, "Nombre2", "Apellidos2", "B"));
listadealumnos.Add(new Alumno(3, "Nombre3", "Apellidos3", "C"));
listadealumnos.Add(new Alumno(4, "Nombre4", "Apellidos4", "A"));
listadealumnos.Add(new Alumno(5, "Nombre5", "Apellidos5", "C"));

//Agregar algunos objetos a la colección utilizando el constructor que toma 0 argumentos
//y establecemos los valores por medio de las propiedades
Alumno otroalumno = new Alumno();
otroalumno.Matricula = 6;
otroalumno.Nombre = "Nombre6";
otroalumno.Apellidos = "Apellidos6";
otroalumno.Grupo = "A";

//agregar el nuevo alumno a la lista
listadealumnos.Add(otroalumno);

//Cargar la lista de alumnos al DataGrid
this.ListaAlumnosDtg.DataSource = listadealumnos;
}

Y ahora implementaremos el objetivo de este tutorial que es filtrar los elementos por un valor específico.

Utilizaremos el ComboBox para seleccionar el grupo (A, B, C o Todos) y cargar los elementos correspondientes.

Antes de continuar, en esta parte utilizaremos consultas LINQ y expresiones Lambda, para ello es recomendable que estudiemos algunos ejemplos sobre como manipular colecciones con estas herramientas, algunos ejemplo muy útiles los encontramos en http://msdn.microsoft.com/en-us/vcsharp/aa336746 (es recomendable practicarlos para comprender su funcionamiento).

Entonces en el evento SelectedIndexChanged del ComboBox, agregaremos el código que realice la labor de filtrar los elementos:


private void FiltrarPorGrupoCmb_SelectedIndexChanged(object sender, EventArgs e)
{
//Mostrar los elementos por Grupo
switch (this.FiltrarPorGrupoCmb.Text)
{
case "Todos": //si selecciona Todos, Cargar la lista completa al DataGridView
this.ListaAlumnosDtg.DataSource = listadealumnos;
break;

/*
* En los ejemplos siguientes utilizamos el metodo Where para filtrar objetos con expresiones lamda
* y tambien podemos utilizar una consulta LINQ para obtener el mismo resultado
* Descomenta la linea que usa LINQ y comenta la que usa Where().
*/
case "A": //Si selecciona el grupo A
var alumnosA = listadealumnos.Where(a => a.Grupo == "A");
//var alumnosA = from a in listadealumnos where a.Grupo == "A" select a;
this.ListaAlumnosDtg.DataSource = alumnosA.ToList();
break;

case "B":
var alumnosB = listadealumnos.Where(a => a.Grupo == "B");
//var alumnosB = from a in listadealumnos where a.Grupo == "B" select a;
this.ListaAlumnosDtg.DataSource = alumnosB.ToList();
break;

case "C":
var alumnosC = listadealumnos.Where(a => a.Grupo == "C");
//var alumnosC = from a in listadealumnos where a.Grupo == "C" select a;
this.ListaAlumnosDtg.DataSource = alumnosC.ToList();
break;
}
}

Entonces para lograr nuestro objetivo podemos utilizar consultas LINQ o invocar al método Where() de la clase List y filtrar los elementos utilizando una expresión Lambda. Donde posteriormente la lista de elementos filtrados se carga al DataGridView convirtiéndola antes en una lista con el método .ToList()

Ya por último, si queremos evitar que el usuario introduzca un texto en el ComboBox, tenemos 2 opciones, la primera seria cambiar el valor de la propiedad DropDownStyle de DropDown a DropDownList, pero si queremos mantener la apariencia normal de nuestro ComboBox, entonces solo evitaremos que el usuario introduzca texto en el control desde el evento KeyPress del Combo donde indicaremos que el evento KeyPress ya fue controlado:


private void FiltrarPorGrupoCmb_KeyPress(object sender, KeyPressEventArgs e)
{
e.Handled = true;
}

Y ya para comprobar que funciona.

Este mini tutorial está dirigido a los alumnos del 3er cuatrimestre del P.E. de TICSI de la UTIM.

Puedes descargar aquí el código fuente (archivo .ZIP subido como .DOC, descarga el archivo, cambia la extensión de .doc a .zip, desempaqueta y listo, ya lo tienes :D)

Saludos…

Anuncios

Un comentario en “Filtrar elementos de una colección (List) por un campo especificado

Escribe tu comentario:

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