2011-09-30 3 views
2

J'utilise RADGridView pour WPF pour afficher certaines données. Il est tiré dynamiquement à partir de DB, donc je ne connais pas les noms des colonnes ou le type de données contenues dans chaque cellule. Je veux laisser l'utilisateur trier les données sur chaque colonne lorsqu'il double-clique sur un en-tête de colonne.Telerik RADGrid et le tri

Pour une raison quelconque, la grille n'est pas triée. C'est ce que j'ai jusqu'ici.

private void SetEventHandlers() 
     { 
      if (_grid != null) 
      { 
       _grid.AddHandler(GridViewCellBase.CellDoubleClickEvent, new EventHandler<RadRoutedEventArgs>(OnCellDoubleClick), true); 

      } 
     } 


private void OnCellDoubleClick(object sender, RoutedEventArgs e) 
     { 
      GridViewCellBase cell = e.OriginalSource as GridViewCellBase; 
      if (cell != null && cell is GridViewHeaderCell) 
      { 
       SetSorting(cell); 
      } 
     } 



private void SetSorting(GridViewCellBase cell) 
     { 
      GridViewColumn column = cell.Column; 
      SortingState nextState = GetNextSortingState(column.SortingState); 
      _grid.SortDescriptors.Clear(); 
      if (nextState == SortingState.None) 
      { 
       column.SortingState = SortingState.None; 
      } 
      else 
      { 
       _grid.SortDescriptors.Add(CreateColumnDescriptor(column, nextState)); 
       column.SortingState = nextState; 
      } 

     } 

EDIT:

private ColumnSortDescriptor CreateColumnDescriptor(GridViewColumn column, SortingState sortingState) 
     { 
      ColumnSortDescriptor descriptor = new ColumnSortDescriptor(); 
      descriptor.Column = column; 
      if (sortingState == SortingState.Ascending) 
      { 
       descriptor.SortDirection = ListSortDirection.Ascending; 
      } 
      else 
      { 
       descriptor.SortDirection = ListSortDirection.Descending; 
      } 


      return descriptor; 
     } 
+1

Désactivez-vous explicitement la fonction de tri intégrée? Par défaut, je crois que le fait de cliquer sur l'en-tête de la colonne effectuera un tri (essayer de faire du tri sur des sons de double clic est dangereux). En outre, y a-t-il une raison pour laquelle vous ne pouvez pas utiliser le tri intégré? Mais le faire comme vous l'avez devrait fonctionner. J'ai réussi à faire passer un test simple. Je pense que vous voudrez commenter les lignes qui définissent column.SortingState. Cela ne devrait pas être nécessaire. Pouvez-vous poster votre méthode 'CreateColumnDescriptor'? –

+0

J'ai publié le code 'CreateColumnDescriptor'. La raison pour laquelle nous avons désactivé le tri par défaut est que nous partageons des "Vues" qui ont des états de tri et les stockent dans la base de données. Semble bizarre je sais – Omar

+1

Le code que vous avez posté semble fonctionner correctement quand je l'essaie. Quel comportement obtenez-vous? Avez-vous essayé de mettre des points d'arrêt dans les différents endroits pour vous assurer que les choses se passent comme vous vous y attendez? Je suppose que vous appelez 'SetEventHandlers' au bon moment (il semble bizarre que vous vérifiez null - si la grille est nulle, rien ne se passera parce que vous ne pourrez pas attacher les événements)? –

Répondre

1

Il est avéré que mes données RadGrid a été binded à un ObservableCollection. La fonctionnalité de tri de la grille elle-même n'a pas fonctionné. Le tri de ObservableCollection était la solution. J'ai fini par trier ObservableCollection en utilisant linq.