2009-07-07 12 views
1

J'utilise un contrôle ListView dans une application C# WinForms. Les éléments de la liste sont ajoutés à un ListViewGroup (dans ce cas, le regroupement par pays). La seule chose qui ne fonctionne pas comme prévu est que le tri des colonnes semble étrange.ListViewGroup ne pas trier correctement

Je me suis accroché à la propriété ListViewItemSorter de ListView et tout se trie parfaitement sauf lorsque la colonne country est triée par ordre décroissant (c'est-à-dire, Z-A). Indépendamment de la façon dont le tri de la liste se produit, les groupes s'affichent dans l'ordre croissant.

Quelqu'un peut-il me donner un coup de pouce dans la bonne direction?

EDIT: FWIW, .NET 3.5 sur Vista.

Répondre

-2

Découvrez ObjectListView - il est beaucoup plus facile de travailler avec.

+1

Je suis d'accord; mais, cela devrait être un commentaire. –

1

pour cette solution dans votre cas ColumnClick:

// Determine whether the column is the same as the last column clicked. 
    if (e.Column != sortColumn) 
    { 
     // Set the sort column to the new column. 
     sortColumn = e.Column; 
     // Set the sort order to ascending by default. 
     listView1.Sorting = SortOrder.Ascending; 
    } 
    else 
    { 
     // Determine what the last sort order was and change it. 
     if (listView1.Sorting == SortOrder.Ascending) 
      listView1.Sorting = SortOrder.Descending; 
     else 
      listView1.Sorting = SortOrder.Ascending; 
    } 

    // Call the sort method to manually sort. 
    listView1.Sort(); 
    // Set the ListViewItemSorter property to a new ListViewItemComparer 
    // object. 
    this.listView1.ListViewItemSorter = new ListViewItemComparer(e.Column, 
                 listView1.Sorting); 
0

Les groupes doivent être classés séparément

 // save groups 
     ListViewGroup[] oGroups = new ListViewGroup[list.Groups.Count]; 
     list.Groups.CopyTo(oGroups, 0); 
     list.Groups.Clear(); 

     // restore groups 
     switch (groupSortOrder) 
     { 
      case SortOrder.Ascending: 
       list.Groups.AddRange(oGroups.OrderBy(x => x.Name).ToArray()); 
       break; 
      case SortOrder.Descending: 
       list.Groups.AddRange(oGroups.OrderByDescending(x => x.Name).ToArray()); 
       break; 
      default: 
       list.Groups.AddRange(oGroups); 
       break; 
     } 
Questions connexes