Mostrando entradas con la etiqueta DataTable. Mostrar todas las entradas
Mostrando entradas con la etiqueta DataTable. Mostrar todas las entradas

jueves, 29 de enero de 2015

Ordenamiento de columnas en un GridView




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. 

Entrada destacada

Arquitectura de N-Capas con Visual Studio .NET y AngularJS

Este artículo es el primero de una serie de artículos en que quiero explicar mi visión de la programación por capas. La Arquitectura ...