Bonjour à tous,

je suis actuellement confronté à un petit problème...

J'essaye de trier en cascade une Liste d'objets dynamiquement.

Pour donner une représentation de ce que je souhaites faire, j'ai créé une fenêtre de tri comme dans Excel où on choisit de trier le résultat sur plusieurs colonnes en même temps.

Il est possible avec linq de combiner des tri, cependant je n'ai vu comment le faire dynamiquement.

On peut par exemple faire comme suit :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
 
trier = resu.OrderBy(pr => pr.NumTiers).ThenBy(pr => pr.NumPrestataire);
Cependant,
- Ce n'est pas dynamique , on ne peut pas choisir les propriétés de tri, on ne contrôle pas le nombre de niveaux de tri...

Voici ce que j'ai essayé pour l'instant :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
 
AdvancedList<DisplayClass.GridDisplayPrestation> resu = (AdvancedList<CAC.DisplayClass.GridDisplayPrestation>)dataGridViewPrestations.DataSource;
IOrderedEnumerable<DisplayClass.GridDisplayPrestation> trier = null;
foreach (Classes.Trier_OrdreColonne tri in TriageColonnes)
{
 
             if (tri.Ordre == SortOrder.Ascending)
             {
                            trier = from pr in resu
                                    orderby orderBy(tri.Colonne.NomColonne, pr) ascending
                                    select pr;
 
             }
             else
             {
                            trier = from pr in resu
                                    orderby orderBy(tri.Colonne.NomColonne, pr) descending
                                    select pr;
             }
}
object orderBy(string sortKey, DisplayClass.GridDisplayPrestation prest)
{
            if (sortKey == "NumClient")
                return prest.NumTiers;
            else if (sortKey == "NomClient")
                return prest.NomTiers;
            else if (sortKey == "NumPrestataire")
                return prest.NumPrestataire;
            else if (sortKey == "NomPrestataire")
                return prest.NomPrestataire;
            else if (sortKey == "NumActivite")
                return prest.NumActivite;
            else if (sortKey == "NomActivite")
                return prest.NomActivite;
            else return "";
}
Evidemment ici ça ne trie que par mon dernier élément de ma liste TriageColonnes.
Cependant, je me disais qu'il serait possible de faire un orderBy sur le premier élément de tri et de faire ensuite des ThenBy pour tout les autres, cependant, impossible d'utiliser directement l'expression ThenBy.

Pour acceder à ThenBy, je peux faire comme suit :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
 
trier = trier.ThenBy(pr => pr.NumTiers);
Cependant ce n'est plus dynamique et ça serait partir sur une multitude de switch en fonction de la colonne à trier ...

Quelqu'un d'entre vous aurait une idée ?

Merci d'avance !