2009-03-05 5 views
12

J'ai un GridView mis en place de la manière suivante:Tri un gridview lorsque databinding une collection ou d'une liste d'objets

  • lié à un List<T> dans le code-behind (je me sers de mon propre BOL personnalisé)
  • aucun objet DataSource sur la page HTML
  • sortable sur chaque colonne que je choisis (les SortExpression s sont tous réglés correctement)

Cependant, je reçois le message d'erreur suivant:

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

Quelle est la meilleure façon pour moi d'obtenir mon List<T> pour permettre le tri?

Je soupçonnant qu'il devra faire avec la spécification d'une fonction pour l'attribut OnSorting, i.e. .:

OnSorting = "MySortingMethod" 

Répondre

19

Merci de vos réponses sur le tri. Je me suis tourné vers LINQ pour aider à trier dynamiquement. Depuis la grille sait si trier ASC ou DESC, et quel champ, j'ai utilisé une expression LINQ. L'Expression a effectué le tri, puis j'ai simplement lié ces résultats à ma grille.

Je soupçonne que la méthode jQuery serait plus rapide, et ne nécessiterait pas une publication complète.

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

Usefull, merci .. curieux de voir comment fonctionne la méthode avec Jquery! Merci beaucoup .. – bAN

+4

@ p.campell: légèrement modifié la méthode comme GridView 'e.SortDirection' renvoie toujours' SortDirection.Ascending'. j'espère que cela ne vous dérange pas – naveen

2

Correct - vous devez gérer le onsorting, trier votre liste et re-lier.

Vous pouvez également envisager de gérer le côté client de tri en utilisant un framework javascript comme jQuery.

1

Vous pouvez écrire un Comparer pour vos objets:

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; 
} 

Puis, quand dans votre événement de tri juste passer la sorte une fonction de comparaison dans vos objets de routine (supposant que vous avez quelque chose comme List).

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

Vous avez maintenant une liste triée donc il suffit de la relier.

1

Correct, vous devez gérer l'événement OnSorting et définir la propriété AllowSorting sur true.

2

Si vous obtenez cette erreur:

the datasource does not support server side paging

Essayez d'ajouter .ToList<T>() à votre requête:

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