Как я должен кодировать этот пейджинг? - PullRequest
1 голос
/ 18 декабря 2009

Я боролся с каким-то кодом для подкачки страниц в течение нескольких дней (ДА! Дней), но не могу заставить его работать должным образом, вероятно, потому что у меня пока нет опыта решения подобных проблем. .

пейджинг, который я пытаюсь сделать, должен выглядеть примерно так:

1 2 3 4 5 6 ... 101

Когда я нажимаю на цифру 5, мне бы хотелось, чтобы она отображала цифры следующим образом:

1 ... 3 4 5 6 7 ... 101

когда я нахожусь на последней паре страниц, я хочу, чтобы она выглядела аналогично первой:

1 ... 96 97 98 99 100 101

Жирным шрифтом является страница, которую вы сейчас просматриваете.

Я хочу, чтобы точки появлялись только тогда, когда доступно более 7 страниц, в противном случае это должно выглядеть так, как если бы обычный пейджинг выглядел так:

1 2 3 4 5 6 7

Сейчас я хочу отобразить 10 элементов на странице.

Язык, который я хочу использовать, - это C # (ASP.NET), и он хотел бы, чтобы позже он стал пользовательским контролем (где я должен установить свойства TotalNumberOfItems, ItemsPerPage и т. Д.).

Вопрос: Как мне написать код, чтобы зациклить числа на правильных местах? :)

Ответы [ 3 ]

1 голос
/ 18 декабря 2009

Как насчет (Make it Bold - несколько псевдо-код, потому что я не знаю, в каком интерфейсе вы находитесь ...)

   private static string BuildPaging(int pageNo, int pageCount)
   {
      StringBuilder sb = new StringBuilder();

      for(int i = 1; i < pageCount; i++)
      {
         if (i == pageNo) 
             sb.Append([Make it Bold] + i.ToString("0") + [Make it not Bold]);
         else if (1 > pageNo - 3 && i < pageNo + 3)
             sb.Append(i.ToString("0"));
         else if ((i == 2 && pageNo > 4) ||        
                  (i == PageCount - 1 && pageNo < PageCount - 2))
             sb.Append("...");
      }
      return sb.ToString();
   }

Единственное, как сделать это жирным шрифтом (зависит от того, используете ли вы WinForms или ASP.Net ... ... И добавьте материал, чтобы сделать его кликабельной ссылкой ...

0 голосов
/ 22 октября 2013

Я сделал что-то подобное. Есть несколько, которые отличаются от того, что вы хотите именно, но должны быть полезны. Это было быстрое и грязное решение проблемы, в котором были проблемы с эффективностью, но это хорошее начало.

public class PagingHelper
{
    public IEnumerable<int> GetListOfPages(int currentPage, int pagesAroundCurrent, int totalPages)
    {
        var pages = new Dictionary<int, int>();
        double powerOfTenTotalPages = Math.Floor(Math.Log10(totalPages));
        if ((int)powerOfTenTotalPages == 0)
        {
            powerOfTenTotalPages = 1;
        }
        pages.Add(1, 1);
        if (!pages.ContainsKey(totalPages))
        {
            pages.Add(totalPages, totalPages);
        }

        for (int loop = 1; loop <= powerOfTenTotalPages + 1; loop++)
        {
            GetPages(pages, currentPage, pagesAroundCurrent, totalPages, (int)Math.Pow(10, loop - 1));
        }
        return pages.OrderBy(k=>k.Key).Select(p=>p.Key).AsEnumerable();
    }

    private void GetPages(Dictionary<int, int> pages, int currentPage, int pagesAroundCurrent, int totalPages, int jump)
    {
        int startPage = ((currentPage / jump) * jump) - (pagesAroundCurrent * jump);

        if (startPage < 0)
        {
            startPage = 0;
            pagesAroundCurrent = 10;
        }

        int endPage = currentPage + (pagesAroundCurrent * jump);
        if (endPage > totalPages)
        {
            endPage = totalPages;
        }
        AddPagesToDict(pages, startPage, endPage, jump);
    }

    private void AddPagesToDict(Dictionary<int, int> pages, int start, int end, int jump)
    {
        for (int loop = start; loop <= end; loop += jump)
        {
            if (!pages.ContainsKey(loop))
            {
                if (loop > 0)
                {
                    pages.Add(loop, loop);
                }
            }
        }
    }
}

Пример вывода -

Текущая страница: 1 Всего страниц: 40 Отображение страниц вокруг текущей страницы: 5

1 2 3 4 5 6 7 8 9 10 11 20 30 40

Текущая страница: 90 Всего страниц: 600 Страницы для отображения вокруг текущей страницы: 5

1 40 50 60 70 80 85 86 87 88 89 90 91 92 93 94 95 100 110 120 130 140 200 300 400 500 600

Текущая страница: 147 Всего страниц: 6825 Количество страниц, отображаемых вокруг текущей страницы: 5

Для получения полной информации см. Сообщение здесь .

0 голосов
/ 18 декабря 2009

Вам нужен максимальный размер внутреннего списка пейджера (между точками), размер страницы, счетчик документов и индекс текущей страницы. Тогда вы можете использовать алгоритм так:

_pagesTotal = DocumentsTotal / DocumentsPerPage;
if ( DocumentsTotal % DocumentsPerPage > 0 )
{
    _pagesTotal++;
}
// we want current page in the middle
// PageBlockMaxSize is the size of those dotted out pages
int halfBlock = PageBlockMaxSize / 2;
if ( CurrentPageIndex > PageBlockMaxSize )
{
    // add some code here to show first page link and following dots
    // ...    
    _firstPageInBlockIndex = CurrentPageIndex - halfBlock;
}
else
{
    // we don't need any dots here
_firstPageInBlockIndex = 1;
}

if ( _pagesTotal - CurrentPageIndex > PageBlockMaxSize )
{
    // here show last page link and preceeding dots. you can use _pagesTotal as it's text
    // ...    
    _lastPageInBlockIndex = CurrentPageIndex + halfBlock;
}
else
{
    // we don't need any dots here
    _lastPageInBlockIndex = _pagesTotal;
}

// hide next-previous buttons if they are not needed
if ( CurrentPageIndex == 1 )
{
    spanPrev.Visible = false;
}
else if ( CurrentPageIndex == _pagesTotal )
{
    spanNext.Visible = false;
}

// and when we are ready we build list of page counters
var pages = new List<int>();
for ( int page = _firstPageInBlockIndex;
      page <= _lastPageInBlockIndex;
      page++ )
{
    pages.Add( page );
}

и затем мы можем привязать этот список к некоторому повторителю или использовать его другим способом для отображения общих связей между этими точками (или без них).

...