Ordenamiento de columnas en un GridView en Visual Studio .NET
Cuando usamos listas de entidades
para ser mostradas en un GridView, éstas no permiten utilizar la opción de
ordenamiento automático de columnas AllowSorting=true del GridView porque
generan el siguiente error: “El origen de
datos 'odsPersonaList' no admite la ordenación con datos IEnumerable. Sólo se
admite la ordenación automática con DataView, DataTable y DataSet”.
Durante algún tiempo, intenté
utilizar los métodos de ordenamiento de listas en la capa de presentación usando
métodos del GridView, sin resultados.
Evitando ampliar la funcionalidad
de las listas, opté por usar otro componente que integrara la ordenación; para lo cual fue suficiente buscar en internet
un método que convirtiera la lista en un DataTable. En el ejemplo publicado a
continuación podrán encontrar el código
que permita hacer esto. No sé de quién es originalmente, lo encontré en
muchos sitios web, por ello espero que la persona que lo creó, me disculpe al
no poder darle el crédito que se merece.
using
System;
using
System.Collections.Generic;
using
System.ComponentModel;
using
System.Data;
/// <summary>
/// Utilidades para aplicar a la capa
de entidades de negocio del proyecto
///
</summary>
public
class UtilidadesLN
{
public UtilidadesLN(){}
public DataTable
ConvertToDataTable<T>(IList<T> data)
{
PropertyDescriptorCollection properties
=
TypeDescriptor.GetProperties(typeof(T));
DataTable table = new DataTable();
foreach (PropertyDescriptor prop in properties)
table.Columns.Add(prop.Name,
Nullable.GetUnderlyingType(prop.PropertyType) ?? prop.PropertyType);
foreach (T item in data)
{
DataRow row = table.NewRow();
foreach (PropertyDescriptor prop in
properties)
row[prop.Name] =
prop.GetValue(item) ?? DBNull.Value;
table.Rows.Add(row);
}
return table;
}
}
Mediante la funcionalidad anterior convierto una lista en un
DataTable para ser expuesta como un objeto de datos en la capa de entidades de
negocio.
public
class PersonaLN:UtilidadesLN
{
PersonaAD AD = new PersonaAD();
public PersonaLN() {}
//Consulta Normal usando una lista generica
[System.ComponentModel.DataObjectMethodAttribute(System.ComponentModel.DataObjectMethodType.Select,
true)]
public List<PersonaEN>
ConsultarPersona(String Buscar)
{
return AD.ConsultarPersonas(Buscar);
}
[System.ComponentModel.DataObjectMethodAttribute(System.ComponentModel.DataObjectMethodType.Select,
false)]
public DataTable ConsultarPersonaDT(String Buscar)
{
return ConvertToDataTable(AD.ConsultarPersonas(Buscar));
}
}
Ilustración 1 |
De esta manera puedo utilizar ObjectDataSource en la capa de
presentación, para acceder a los datos y poder utilizarlos desde un GridView.
En la ilustración 1, podrán ver dos GridView enlazados, el primero con una
lista y el segundo a un DataTable.
El primer GridView enlazado a una Lista, en el momento de
pulsar clic sobre el nombre de la columna va a generar el error 'odsPersonaList' no admite la ordenación con datos IEnumerable. Sólo se admite la ordenación automática con DataView, DataTable y DataSet” (Ver ilustración 2):
Ilustración 2 |
Mientras que al usar un objeto conectado al método que
devuelve un DataTable, el sistema ordenará las columnas de manera automática. A
continuación se ve en la ilustración 3, el GridView al consultar los datos:
Ilustración 3 |
Después de pulsar
clic sobre la columna del nombre, el GridView ordena los datos sin generar error. a continuación en la ilustración 4, se pueden apreciar los datos ordenados descendentemente :
Ilustración 4 |
Este ejemplo lo realicé con Visual Studio Community 2013,
lenguaje C# y clases en la
carpeta App_code que emulan las capas del proyecto. Lo pueden descargar aquí. El código se entrega tal como está, o sea bajo su propia responsabilidad de uso.
Por favor, no olvides darle un “me gusta” al articulo si
este ejemplo te es de utilidad.