2010-05-27 90 views
0

我想实现一个分页系统,显示附近的页码以及页面在每个极端。例如,如果用户在40页的第20页上,应该显示以下链接:1,2,...,18,19,[20],21,22 ... 39,40.该解决方案将类似于这里所描述的:生成分页链接

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

我见过的代码来做到这一点在PHP中,而不是在ASP.net(理想情况下我找的C#代码)。如果以前有人做过这样的事情,那么看到你的代码会非常有帮助。

+0

在您链接到网页,图片显示不出来。 – 2010-05-27 18:44:27

+0

第5页共40页的链接页面是什么? – Sijin 2010-05-27 18:57:28

+0

对于40中的5个,链接将是:1,2,3,4,[5],6,7 ... 39,40.(前两个总是显示,最后两个始终显示,并且两个直接相邻的总是显示。) – alpheus 2010-05-27 19:04:52

回答

3

您需要用来生成分页链接的代码很大程度上取决于您使用的是基于ASP.NET的技术。使用ASP.NET MVC时需要不同的代码,Web窗体的不同代码以及不同的控制代码,如RepeaterGrid

无论如何,您需要生成要显示的页码。以下代码显示了如何使用LINQ和C#3.0来完成此操作。我们首先产生的所有范围(年初,围绕当前页面,结束),然后删除无效的页面(如MAX + 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 s,但可能很难得到所有的案件,所以这可能是更优雅的方法。虽然将它绑定到特定技术可能是另一个问题的主题。

+0

谢谢。我有权访问LINQ,所以我试图使用这种解决方案,但是我在开始“Enumerable.Range”的行上遇到以下错误:无法将类型'System.Collections.Generic.IEnumerable '隐式转换为'int [ ]”。 – alpheus 2010-05-27 20:55:57

+0

@alpheus:'pages'的类型需要是'IEnumerable '或'var' - 我最初编写了'int []',这是错误的(我改正了答案)。 – 2010-05-27 23:24:58

+1

嗯,我不认为这是有效的,我说,它显示了不存在的高范围页面。 – mmcglynn 2013-10-22 12:43:55

1

我第二个托马斯的解决方案。

如果你不能使用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; 
    }