2009-11-28 4 views
0

En espérant que quelqu'un a utilisé l'excellent PagedList from Troy Goode? Je l'utilise réellement dans une application Winforms, et même si cela fonctionne, j'ai perdu la capacité de le trier.Comment activer le tri sur PagedList <T>

Le renvoi d'une liste paginée, le contrôle de la page et de la taille, et la liaison à un DataGridView ne sont pas un problème, mais ma plus grande préoccupation est le tri. Maintenant, je suis également tombé sur le SortedPageList by Muhammad Mosa, mais je suis vraiment confus avec l'un des paramètres requis. J'utilise une méthode privée pour retourner un SortedPageList, mais mon code ci-dessous ne semble pas fonctionner:

private SortedPagedList<Location, Location> GetInactiveLocationData(int Index, int Size) { 
    sysDataContext ctx = new sysDataContext(); 
    try { 
     var query = ctx.Location.Where(x => x.Active == false).AsQueryable(); 
     return query.ToPagedList(Index, Size, i => i, false);   
     //return new SortedPagedList<Location, Location>(query, Index, Size, i => i , true); 
    } 
    catch (Exception) { 
     throw; 
    } 
} 

Cette renvoie une erreur « Cannot order by type: Location ». J'ai l'habitude de traiter le cas où l'utilisateur clique un en-tête de colonne pour trier sur cette colonne.

Je sais que la solution implique Lambda Expressions au-dessus d'un niveau de connaissance que j'ai (embarrassant comme c'est d'admettre) et je suis complètement désemparé sur ce front! J'apprécierais vraiment votre conseil sur le susdit!

Merci!

Répondre

0

OK, Je me sens comme un idiot ... eh bien, un peu je suis arrivé ce qui suit pour travailler:!.

using (sysContext ctx = new sysDataContext()) { 
    try { 
     var data = ctx.Location.Where(x => x.Active == false).AsQueryable(); 
     var query = data.ToPagedList(PageIndex, PageSize, o => o.DueDate, true); 
     dgv.DataSource = query; 
    } 
    catch (Exception) { 
     throw; 
    } 
} 

maintenant, l'expression de tri est décrite ici comme o => o.DueDate cela tombe bien, et bien que cela fonctionne, Im essayant maintenant trouver un moyen de créer une génération fonction ic qui me permettra:

  1. Detect qui tête de colonne a été cliqué (avec une instruction switch peut-être)
  2. Convertir son type dans la propriété appropriée Linq Entité
  3. passer cette propriété dans une méthode générique

Un mehod qui ressemble à quelque chose comme ce qui suit:

private void RefreshData([type] SortExpression, bool Ascending, int PageIndex, int PageSize) { 
    using (sysDataContext ctx = new sysDataContext()) { 
     try { 
      var data = ctx.Location.AsQueryable(); 
      var query = data.ToPagedList(PageIndex, PageSize, o => o.[SortExpression], Ascending); 
      dgv.DataSource = query; 
     } 
     catch (Exception) { 
      throw; 
     } 
    } 
} 

Est cela est-il possible?

Une chose en plus (si cela vous aidera à me aider) la méthode SortedPageList ressemble à ceci:

public static SortedPagedList<T, TResult> ToPagedList<T, TResult>(this IQueryable<T> source, int index, int pageSize, System.Linq.Expressions.Expression<Func<T, TResult>> keySelector, bool asc) { 
    return new SortedPagedList<T, TResult>(source, index, pageSize, keySelector, asc); 
} 

Comment puis-je exprimer System.Linq.Expressions.Expression<Func<T, TResult>> comme un type qui peut être transmis en tant que paramètre?

0

Eh bien, vous pouvez commencer par apprendre quelques basic LINQ operations (faites défiler jusqu'à la partie "commande" ou ici.. LINQ Part 1 - Filtering & Sorting Object Lists

Une fois que vous découvrez la magie, vous volerez: P

+0

hey okw. Merci, mais ce sont des choses que je connais. Je me rends compte que je n'étais pas très complet en posant ma question, alors j'ai fait beaucoup de retouches. S'il vous plaît jeter un coup d'oeil à nouveau! merci! – Shalan