la propriété SortDirection du GridView vaut toujours Ascending
On m’a récemment posé une question concernant la propriété SortDirection du GridView. Lorsque l’on binde un gridview en utilisant la propriété DataSource et non en utilisant un DataSourceControl, alors la propriété SortDirection retourne toujours Ascending. Il en va de même pour l’eventArgs que l’on récupere lors de l’événement Sorting du Gridview.
Après un petit tour dans Reflector, j’ai trouvé le code suivant :
1 // code provenant de Reflector
2 private void HandleSort(string sortExpression, SortDirection sortDirection)
3 {
4 bool isBoundUsingDataSourceID = base.IsBoundUsingDataSourceID;
5 GridViewSortEventArgs e =
6 new GridViewSortEventArgs(sortExpression, sortDirection);
7 this.OnSorting(e);
8 if (!e.Cancel)
9 {
10 // ???
11 if (isBoundUsingDataSourceID)
12 {
13 this.ClearDataKeys();
14 if (this.GetData() == null)
15 {
16 throw new HttpException(...);
17 }
18 this.EditIndex = -1;
19 this.SortExpressionInternal = e.SortExpression;
20 this.SortDirectionInternal = e.SortDirection;
21 this._pageIndex = 0;
22 }
23 this.OnSorted(EventArgs.Empty);
24 base.RequiresDataBinding = true;
25 }
26 }
A la ligne 11, on voit que la propriété SortDirection est modifié seulement lorsque l’on utilise un DataSourceControl. Cela confirme donc mes constatations. Je ne comprends pas pourquoi l’équipe ASP.net à fait ce choix.
Afin de pouvoir changer l’odre du tri, il faut manuellement persister le SortDirection dans le ViewState. Pour cela, on peut utiliser le code suivant :
protected SortDirection CurrentDirection
{
get
{
if (this.ViewState["CurrentDirection"] != null)
{
return (SortDirection)this.ViewState["CurrentDirection"];
}
return SortDirection.Ascending;
}
set { this.ViewState["CurrentDirection"] = value; }
}
protected void gvPouet_Sorting(object sender, GridViewSortEventArgs e)
{
this.CurrentDirection =
CurrentDirection == SortDirection.Ascending ?
SortDirection.Descending : SortDirection.Ascending;
this.BindData();
}
Au niveau de la méthode BindData, il faudra alors récuperer les données en fonction de la propriété CurrentDirection.
Attention, ce bout de code ne fait que gérer le tri sur une seule colonne, si vous souhaitez gérer le tri sur plus d’une colonne, il faudra alors persister une collection contenant la colonne et la direction du tri.
Vous pouvez télécharger l’intégralité des sources ici : Utilisation de la méthode Sort et SortDirection avec un GridView et ajout des flèches haut/bas sur le nom des colonnes