nyk0r

Pager-PagingDisplayInfo

Mar 19th, 2011
256
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 3.90 KB | None | 0 0
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Web;
  5. using System.Web.Mvc;
  6. using System.Web.Mvc.Html;
  7.  
  8. namespace MuranoTestAssignment.Common
  9. {
  10.     public class PagingDisplayInfo
  11.     {
  12.         public List<int> pages { get; private set; }
  13.         public int current { get; private set; }
  14.         public bool hasPrev { get; private set; }
  15.         public bool hasNext { get; private set; }
  16.  
  17.         private int NormalizePageNumber(int pageNumber, int pageCount)
  18.         {
  19.             if (pageNumber < 1)
  20.             {
  21.                 pageNumber = 1;
  22.             }
  23.  
  24.             if (pageCount > 0 && pageNumber > pageCount)
  25.             {
  26.                 pageNumber = pageCount;
  27.             }
  28.  
  29.             return pageNumber;
  30.         }
  31.  
  32.         private List<int> GetPagesInRange(int lowerBound, int upperBound, int pageCount)
  33.         {
  34.             lowerBound = NormalizePageNumber(lowerBound, pageCount);
  35.             upperBound = NormalizePageNumber(upperBound, pageCount);
  36.  
  37.             List<int> pages = new List<int>();
  38.             for (int pageNumber = lowerBound; pageNumber <= upperBound; pageNumber++)
  39.             {
  40.                 pages.Add(pageNumber);
  41.             }
  42.             return pages;
  43.         }
  44.  
  45.         /// <summary>
  46.         /// Возвращвет массив с номерами страниц.
  47.         /// </summary>
  48.         /// <param name="pageRange">Количество ссылок на стринице</param>
  49.         /// <param name="pageNumber">Номер страницы</param>
  50.         /// <param name="pageCount">Общее количество страниц</param>
  51.         /// <returns>Список номеров страниц для отображения.</returns>
  52.         private List<int> GetPages(int pageRange, int pageNumber, int pageCount)
  53.         {
  54.             // берем приблизительно по половине страниц в обе стороны
  55.             int delta = (int)Math.Ceiling((double)pageRange / 2);
  56.  
  57.             // Если pageNumber - delta > pageCount - pageRange.
  58.             // Т.е. если мы пытаемся взять больше страниц чем есть.
  59.             int lowerBound = pageCount - pageRange + 1;
  60.             int upperBound = pageCount;
  61.             // Ели страниц хватает.
  62.             if (pageNumber - delta <= pageCount - pageRange)
  63.             {
  64.                 if (pageNumber - delta < 0)
  65.                 {
  66.                     delta = pageNumber;
  67.                 }
  68.                 int offset = pageNumber - delta;
  69.                 lowerBound = offset + 1;
  70.                 upperBound = offset + pageRange;
  71.             }
  72.  
  73.             return GetPagesInRange(lowerBound, upperBound, pageCount);
  74.         }
  75.  
  76.         /// <summary>
  77.         /// Конструктор создает так называемы Sliding Paging.
  78.         /// </summary>
  79.         /// <param name="totalCount">Общее количество элементов для отображения.</param>
  80.         /// <param name="pageRange">Количестово ссылок на странице.</param>
  81.         /// <param name="itemsCount">Количество элментов на странице.</param>
  82.         /// <param name="pageNumber">Номер текущей страницы.</param>
  83.         public PagingDisplayInfo(int totalCount, int pageRange,
  84.                  int itemsCount, int pageNumber)
  85.         {
  86.             // сколько всего страниц
  87.             int pageCount = (int)Math.Ceiling((double)totalCount / itemsCount);
  88.             // выводим по LINKS_ON_PAGE страниц
  89.  
  90.             this.current = NormalizePageNumber(pageNumber, pageCount);
  91.             this.hasPrev = current - 1 > 0;
  92.             this.hasNext = current + 1 <= pageCount;
  93.             this.pages = GetPages(pageRange, this.current, pageCount);
  94.         }
  95.     }
  96. }
Advertisement
Add Comment
Please, Sign In to add comment