2010-05-27 2 views
0

Я пытаюсь реализовать систему подкачки, которая отображает соседние номера страниц, а также страницы с каждой стороны. Например, если пользователь находится на странице 20 из 40, должны отображаться следующие ссылки: 1, 2 ... 18, 19, [20], 21, 22 ... 39, 40. Решение будет аналогично описан здесь:Создание ссылок на страницы

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

Я видел код, чтобы сделать это в PHP, но не в ASP.net (в идеале я ищу C# код). Если кто-то сделал что-то подобное ранее, было бы очень полезно увидеть ваш код.

+0

На странице вы связаны, снимки не отображаются. –

+0

0 Что будет со связанными страницами для страницы 5 из 40? – Sijin

+0

Для 5 из 40 ссылки будут следующими: 1, 2, 3, 4, [5], 6, 7 ... 39, 40. (Первые два всегда отображаются, последние два всегда отображаются, и сразу отображаются два соседних друг друга.) – alpheus

ответ

3

Код, который вам нужно использовать для создания ссылок на страницы, во многом зависит от того, какую технологию вы используете на основе ASP.NET. Вам понадобится другой код при использовании ASP.NET MVC, другого кода для веб-форм и другого кода для таких элементов управления, как Repeater или Grid.

В любом случае вам необходимо сгенерировать номера страниц для показа. Следующий код показывает, как это сделать, используя LINQ и C# 3.0. Мы сначала создать все диапазоны (начало, вокруг текущей страницы, конец), а затем удалить недопустимые страницы (например, не более + 1) и убедитесь, что каждая страница возвращается только один раз:

// 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(); 

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

+0

Спасибо. У меня есть доступ к LINQ, поэтому я пытаюсь использовать это решение, но я получаю следующую ошибку в строке, начинающуюся с «Enumerable.Range»: Невозможно неявно преобразовать тип «System.Collections.Generic.IEnumerable 'to' int [ ]». – alpheus

+0

@alpheus: тип 'pages' должен быть' IEnumerable 'или' var' - я изначально написал 'int []', что было неправильно (я исправил ответ). –

+1

Хммм, я не думаю, что это работает, я, е, показывает страницы на высоком диапазоне, которых не существует. – mmcglynn

1

I второе решение Томаса.

В случае, если вы не можете использовать LINQ, здесь все те, если это:

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; 
    } 
Смежные вопросы