You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何限制Enumerable.Range不超GridView.PageCount,实现分页页码控制?

解决GridView分页页码显示超出索引的问题

这个问题我之前也碰到过,直接用GridView1.PageIndex + 1作为起始值生成10个页码,在接近最后几页时肯定会超出总页数范围。咱们可以通过计算合理的起始和结束页码,确保每次只显示10个有效页码,同时让当前页码尽量处于显示范围的中间位置,提升用户体验。

核心思路

  1. 先明确几个关键变量:总页数、当前页码(从1开始计数)、要显示的页码数量(固定10个)
  2. 计算起始页码:让当前页码尽量在显示范围的中间,同时保证起始页码不小于1
  3. 计算结束页码:基于起始页码加9(因为要显示10个),如果超过总页数就直接设为总页数,再反向调整起始页码,确保起始页码不小于1
  4. 用调整后的起始和结束页码生成有效页码范围

完整代码实现

protected void Repeater_Load(object sender, EventArgs e)
{
    Repeater repeater = (Repeater)sender;
    int totalPages = GridView1.PageCount;
    
    // 如果总页数为0,直接返回不绑定
    if (totalPages <= 0)
    {
        repeater.Visible = false;
        return;
    }
    
    const int PageNumbersToShow = 10;
    int currentPage = GridView1.PageIndex + 1; // 转换为从1开始的页码
    
    // 计算起始页码:让当前页码尽量在中间位置
    int startPage = Math.Max(1, currentPage - (PageNumbersToShow / 2));
    // 计算结束页码
    int endPage = startPage + PageNumbersToShow - 1;
    
    // 如果结束页码超过总页数,调整结束和起始页码
    if (endPage > totalPages)
    {
        endPage = totalPages;
        startPage = Math.Max(1, endPage - PageNumbersToShow + 1);
    }
    
    // 生成有效页码范围并绑定到Repeater
    repeater.DataSource = Enumerable.Range(startPage, endPage - startPage + 1);
    repeater.DataBind();
}

代码说明

  • totalPages = GridView1.PageCount:获取GridView的总页数,这是限制页码范围的核心依据
  • currentPage = GridView1.PageIndex + 1:把GridView从0开始的索引转换为用户习惯的从1开始的页码
  • 计算startPage时用Math.Max(1, ...):确保起始页码不会小于第一页
  • 当endPage超过总页数时,先把endPage设为总页数,再重新计算startPage,保证显示的页码数量尽量接近10个(如果总页数不足10个,就显示所有页码)
  • Enumerable.Range(startPage, endPage - startPage + 1):这里的第二个参数是要生成的元素数量,所以用结束减起始加1,确保生成的页码数量正确

比如总页数是15,当前页码是13,那么起始页码会被调整为6(15-10+1),结束页码是15,显示6到15的10个页码;如果总页数是8,不管当前页码是多少,都会显示1到8的所有页码。

内容的提问来源于stack exchange,提问作者Raniel Quirante

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 08:36:36