2009-03-05 12 views
12

tengo un GridView establecido de la siguiente manera:Ordenar una gridview cuando enlace de datos una colección o lista de objetos

  • unido a un List<T> de código subyacente (estoy usando mi propia costumbre BOL)
  • ningún objeto DataSource en la página HTML
  • ordenable en cada columna que elija (los SortExpression s estén configurados correctamente)

sin embargo, yo estoy recibiendo el mensaje de error:

The GridView 'myGridView' fired event Sorting which wasn't handled.

¿Cuál es la mejor manera para obtener mi List<T> para permitir la clasificación?

Estoy sospechando que tendrá que ver con la especificación de una función para el atributo OnSorting, es decir .:

OnSorting = "MySortingMethod" 

Respuesta

19

Gracias por sus respuestas sobre la clasificación. Me volví a LINQ para ayudar a ordenar de forma dinámica. Como la cuadrícula sabe si ordenar ASC o DESC, y en qué campo, utilicé una expresión LINQ. The Expression realizó la clasificación, y luego limité esos resultados a mi vista de grilla.

Sospecho que el método jQuery sería más rápido y no requeriría una devolución de datos completa.

using System.Linq.Expressions; 

public SortDirection GridViewSortDirection 
{ 
    get 
    { 
     if (ViewState["sortDirection"] == null) 
      ViewState["sortDirection"] = SortDirection.Ascending; 

     return (SortDirection)ViewState["sortDirection"]; 
    } 
    set { ViewState["sortDirection"] = value; } 
} 

protected void gridView_Sorting(object sender, GridViewSortEventArgs e) 
{ 
    //re-run the query, use linq to sort the objects based on the arg. 
    //perform a search using the constraints given 
    //you could have this saved in Session, rather than requerying your datastore 
    List<T> myGridResults = PerfomSearch(); 


    if (myGridResults != null) 
    { 
     var param = Expression.Parameter(typeof(T), e.SortExpression); 
     var sortExpression = Expression.Lambda<Func<T, object>>(Expression.Convert(Expression.Property(param, e.SortExpression), typeof(object)), param); 


     if (GridViewSortDirection == SortDirection.Ascending) 
     { 
      myGridView.DataSource = myGridResults.AsQueryable<T>().OrderBy(sortExpression); 
      GridViewSortDirection = SortDirection.Descending; 
     } 
     else 
     { 
      myGridView.DataSource = myGridResults.AsQueryable<T>().OrderByDescending(sortExpression); 
      GridViewSortDirection = SortDirection.Ascending; 
     }; 


     myGridView.DataBind(); 
    } 
} 
+0

útiles, gracias .. Es curioso ver cómo funciona el método con jQuery! Merci beaucoup .. – bAN

+4

@ p.campell: modificó ligeramente el método ya que GridView 'e.SortDirection' siempre devuelve' SortDirection.Ascending'. espero que no te importe – naveen

2

correcta - que tendrá que manejar la onsorting, ordenar su lista y volver a enlazar.

De forma alternativa, podría considerar el manejo del lado del cliente de clasificación utilizando un marco javascript como jQuery.

1

Se podría escribir una Compare para sus objetos:

private int CompareObject(YourObject object1, YourObject object2) 
{ 
    int iReturnValue = 0; 
    if ((object1 != null) && (object2 != null) && 
     (object1.SomeField != object2.SomeField)) 
    { 
     iReturnValue = (object1.SomeField > object2.SomeField) ? 1 : -1; 
    } 
    return iReturnValue; 
} 

Luego, cuando en su evento de clasificación sólo tiene que pasar en la función de comparación en los objetos de tipo de rutina (suponiendo que tiene algo así como la lista).

// Your list of data from the session or viewstate or whereever you have it stored. 
lstObjects.Sort(CompareObject); 

Ahora tiene una lista ordenada así que simplemente vuelva a enlazarla.

1

Correcto, debe controlar el evento OnSorting y establecer la propiedad AllowSorting en verdadero.

2

Si obtiene este error:

the datasource does not support server side paging

Trate de añadir .ToList<T>() a su consulta:

if (e.SortDirection == SortDirection.Ascending) 
{ 
    GridViewTrackerLoans.DataSource = myGridResults.AsQueryable<T>().OrderBy(sortExpression).ToList<T>(); 
} 
else 
{ 
    GridViewTrackerLoans.DataSource = myGridResults.AsQueryable<T>().OrderByDescending(sortExpression).ToList<T>(); 
}; 
Cuestiones relacionadas