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.