2010-05-27 3 views
0

J'essaie de mettre en œuvre un système de radiomessagerie qui affiche des numéros de page proches ainsi que des pages à chaque extrême. Par exemple, si l'utilisateur est sur la page 20 de 40, les liens suivants devraient être affichés: 1, 2 ... 18, 19, [20], 21, 22 ... 39, 40. La solution serait similaire à celui qui est décrit ici:Générer des liens de pagination

http://90poe.com/alex-lee-on-bell-curve-pagination

J'ai vu le code pour le faire en PHP, mais pas dans ASP.net (idéalement, je cherche le code C#). Si quelqu'un a déjà fait quelque chose comme ça, il serait très utile de voir votre code.

+0

Sur la page vous avez lié, les images ne se présentent pas. –

+0

Que seraient les pages liées pour la page 5 de 40? – Sijin

+0

Pour 5 sur 40, les liens seraient: 1, 2, 3, 4, [5], 6, 7 ... 39, 40. (Les deux premiers sont toujours affichés, les deux derniers sont toujours affichés, et les deux immédiatement adjacents sont toujours affichés.) – alpheus

Répondre

3

Le code dont vous aurez besoin pour générer les liens de pagination dépend en grande partie de la technologie basée sur ASP.NET que vous utilisez. Vous aurez besoin de code différent lorsque vous utilisez ASP.NET MVC, de code différent pour les formulaires Web et de code différent pour les contrôles tels que Repeater ou Grid.

Dans tous les cas, vous devrez générer les numéros de page à afficher. Le code suivant montre comment faire cela en utilisant LINQ et C# 3.0. Nous générons d'abord toutes les plages (début, autour de la page en cours, à la fin), puis supprimer des pages non valides (par exemple max + 1) et assurez-vous que chaque page est retournée une seule fois:

// Generate all three ranges 
var pages = new[] { 1, 2 }.Concat(
      Enumerable.Range(current-2, 5)).Concat(
      new[] { max-1, max }); 

// Filter invalid pages and make sure we return each page only once 
pages.Where(n => n >= 1 && n <= max).Distinct(); 

Vous pouvez écrire cela en utilisant beaucoup de if s, mais il peut être difficile d'obtenir tous les cas, donc cela peut être une approche plus élégante. La liaison à une technologie spécifique est probablement un sujet pour une autre question, cependant.

+0

Merci. J'ai accès à LINQ donc j'essaie d'utiliser cette solution, mais je reçois l'erreur suivante sur la ligne commençant par "Enumerable.Range": Impossible de convertir implicitement le type 'System.Collections.Generic.IEnumerable ' en 'int [ ] '. – alpheus

+0

@alpheus: Le type 'pages' doit être' IEnumerable 'ou' var' - j'ai initialement écrit 'int []', ce qui était faux (j'ai corrigé la réponse). –

+1

Hmmm, je ne pense pas que cela fonctionne, je, e, il montre des pages sur le haut de gamme qui n'existent pas. – mmcglynn

1

Je seconde la solution de Tomas.

Si vous ne pouvez pas utiliser LINQ, voici tous les cas'S:

private List<int> PaginationPageNumbers(int CurrentPage, int TotalPages) 
    { 
     int i; 
     List<int> lst = new List<int>(); 

     if (TotalPages > 0) lst.Add(1); 

     if (TotalPages > 1) lst.Add(2); 

     i = CurrentPage - 2; 
     if (i > 2) lst.Add(i); 

     i = CurrentPage - 1; 
     if (i > 2) lst.Add(i); 

     if (CurrentPage > 2) lst.Add(CurrentPage); 

     i = CurrentPage + 1; 
     if ((i > 2) && (i <= TotalPages)) lst.Add(i); 

     i = CurrentPage + 2; 
     if (i <= TotalPages) lst.Add(i); 

     i = TotalPages - 1; 
     if (i > (CurrentPage + 2)) lst.Add(i); 

     if (TotalPages > (CurrentPage + 2)) lst.Add(TotalPages); 

     return lst; 
    } 
Questions connexes