2009-09-15 11 views
1

Y at-il un moyen simple ".Net" pour faire le tri hiérarchiqueTri hiérarchique (multi-colonnes) pour le .net GridView?

Tableau ...

A|B|C 
----- 
1|2|5 
2|8|4 
2|4|3 
3|7|2 
4|4|1 

cliquant sur A, B voulez-vous obtenir ..

A|B|C 
----- 
1|2|5 
2|4|3 
2|8|4 
3|7|2 
4|4|1 

Le changement étant que je suis en train de trier (B) dans le contexte de (A) et ainsi de suite.

Évidemment, cela pourrait être géré dans la source de données, mais se demandait si quelqu'un a une solution élégante et évolutive .. merci.

Répondre

2

Si vous demandez à le faire en conjonction avec la pagination, il n'y a pas de solution simple et évolutive. En fait, c'est un peu le Saint-Graal du développement d'applications Web. Voir, par exemple, la question StackOverflow Dynamic Sorting within SQL Stored Procedures, qui concerne la même chose. Après tout, si nous avions un tri dynamique sur nos serveurs de base de données, nous n'aurions qu'à coder le mécanisme de gestion des choix de tri de l'utilisateur.

Vous avez vraiment trois options pour le tri multi-colonnes:

  • Créer dans le client, en laissant votre conteneur de données faire le levage de charges lourdes (lorsque vous utilisez un conteneur de données qui a cette fonctionnalité intégré, comme System.Data.DataView). Ecrivez votre propre algorithme et triez les données vous-même avant de vous lier.

  • Do it sur le serveur de base de données via l'une des solutions discutées dans le lien ci-dessus.

Aucune des solutions côté client n'est vraiment évolutive car elles impliquent l'extraction et la distribution de toutes vos données alors que vous n'avez besoin que d'un sous-ensemble.

0

page ASPX

<asp:GridView id="MyGridView" runat="server" AllowSorting="true" OnSorting="MyGridView_OnSorting"> 
    <asp:BoundField DataField="ColumnA" SortExpression="A" /> 
    <asp:BoundField DataField="ColumnB" SortExpression="B" /> 
    <asp:BoundField DataField="ColumnC" SortExpression="C" /> 
</asp:GridView> 

code Derrière

protected void MyGridView_OnSorting(object sender, GridViewSortEventArgs e) 
{ 
    List<MyEntity> data = MyBLL.GetDataSource(); 

    data.Sort(delegate(MyEntity x, MyEntity y) { 
     switch(e.SortExpression) 
     { 
      case "ColumnA": 
       return String.Compare(x.ColumnA, y.ColumnA); 
       break; 
      case "ColumnB": 
       return String.Compare(x.ColumnB, y.ColumnB); 
       break; 
      case "ColumnC": 
       return String.Compare(x.ColumnC, y.ColumnC); 
       break; 
     } 
    } 
    ); 

    MyGridView.DataSource = data; 
    MyGridView.DataBind(); 
} 
+0

À moins que je vais fou, cela ne fera que trier sur une colonne, non? –

+0

oui ... au moins 15 caractères –

+0

Ah .. oui .. ne fonctionne pas alors .. doit trier sur plusieurs colonnes .. – madcolor

2

Afin d'obtenir une ASP.NET GridView à trier correctement lorsque plusieurs colonnes sont répertoriées dans une spécification de tri de BoundField, vous devez lier l'événement OnSorting de la grille pour cette fonction:

protected void gridViewSorting(object sender, GridViewSortEventArgs e) 
{ 
    // 
    // This odd function permits GridView objects to sort on multiple columns 
    // Without this function, a GridView object does not sort correctly when multiple 
    // columns are named in its sort specification. 
    // 

    if (!(sender is GridView)) 
    { 
     return; 
    } 
    if (!e.SortExpression.Contains(',')) 
    { 
     return; 
    } 

    GridView gv = sender as GridView; 

    // 
    // Find the column that is to become the basis of the sort 
    // 
    foreach (DataControlField dc in gv.Columns) 
    { 
     String fieldSortExprClean = dc.SortExpression.Replace(" DESC", ""); 
     fieldSortExprClean = fieldSortExprClean.Replace(" ASC", ""); 

     String eventSortExprClean = e.SortExpression.Replace(" DESC", ""); 
     eventSortExprClean = eventSortExprClean.Replace(" ASC", ""); 

     if (fieldSortExprClean == eventSortExprClean) 
     { 
      if (e.SortDirection == SortDirection.Ascending) 
      { 
       dc.SortExpression = fieldSortExprClean.Replace(",", " ASC,"); 
       e.SortExpression = fieldSortExprClean.Replace(",", " ASC,"); 
      } 
      else 
      { 
       dc.SortExpression = fieldSortExprClean.Replace(",", " DESC,"); 
       e.SortExpression = fieldSortExprClean.Replace(",", " DESC,"); 
      } 
     } 
    } 
} 
+0

Merci ... cela fonctionne pour moi :) –