Mostrando las entradas con la etiqueta Ordenar GridView por Columna. Mostrar todas las entradas
Mostrando las entradas con la etiqueta Ordenar GridView por Columna. Mostrar todas las entradas

martes, 10 de noviembre de 2015

Ordenar GridView por Columna

La siguiente solución esta planteada para ordenar los datos de un GridView cuyo DataSource es cualquier lista de objetos o un DataTable, para lo cual utilizaremos un poco de Reflection. xD

Agregar método genérico:
 
Public Sub OrdenarGrilla(Of T)(grid As GridView, lista As List(Of T), campo As String, asc As Boolean)
   If Not String.IsNullOrWhiteSpace(campo) Then
       If asc Then
           lista = lista.OrderBy(Function(l) l.GetType().GetProperty(campo).GetValue(l, Nothing)).ToList()
       Else
           lista = lista.OrderByDescending(Function(l) l.GetType().GetProperty(campo).GetValue(l, Nothing)).ToList()
       End If
   End If
   grid.DataSource = lista
   grid.DataBind()
End Sub

este método puede ser utilizado en caso se tenga un DataTable y no una lista de objetos (por falta de tiempo lo dejo en C#).
 
public void OrdenarGrillaDt( GridView gv, DataTable dt, string campo, bool asc)
        {
            DataView dv = new DataView(dt);
            if (!string.IsNullOrWhiteSpace(campo))
            {
                string sortExp = campo + (asc == true ? " Asc" : " Desc");
                dv.Sort = sortExp;
            }
            dt = dv.ToTable();
            gv.DataSource = dt;
            gv.DataBind();
        }

El cual deberá utilizarse desde el evento Sorting del GridView. Ejemplo:
 
Protected Sub gvDocumentos_Sorting(sender As Object, e As System.Web.UI.WebControls.GridViewSortEventArgs) Handles gvDocumentos.Sorting
    OrdenAsc1 = Not OrdenAsc1
    OrdenarGrilla(DirectCast(sender, GridView), listaDocumentos(), e.SortExpression, OrdenAsc1)
End Sub

Donde:
la variable OrdenAsc1 debe ser un ViewState("_OrdenAsc1_") que almacene el valor orden ascendente (true o false).ejemplo:
     Public Property OrdenAsc1() As Boolean
        Get
            If IsNothing(ViewState("_OrdenAsc1_")) Then
                Return True
            End If
            Return ViewState("_OrdenAsc1_")
        End Get
        Set(ByVal value As Boolean)
            ViewState.Add("_OrdenAsc1_", value)
        End Set
    End Property

Nota
El GridView debe de tener las propiedades AllowSorting="true" y SortExpression="colocar lo mismo que se coloca en la propiedad DataField". Ejemplo:
 

    
         
         
    
 

Saludos.