如何限制Enumerable.Range不超GridView.PageCount,实现分页页码控制?
解决GridView分页页码显示超出索引的问题
这个问题我之前也碰到过,直接用GridView1.PageIndex + 1作为起始值生成10个页码,在接近最后几页时肯定会超出总页数范围。咱们可以通过计算合理的起始和结束页码,确保每次只显示10个有效页码,同时让当前页码尽量处于显示范围的中间位置,提升用户体验。
核心思路
- 先明确几个关键变量:总页数、当前页码(从1开始计数)、要显示的页码数量(固定10个)
- 计算起始页码:让当前页码尽量在显示范围的中间,同时保证起始页码不小于1
- 计算结束页码:基于起始页码加9(因为要显示10个),如果超过总页数就直接设为总页数,再反向调整起始页码,确保起始页码不小于1
- 用调整后的起始和结束页码生成有效页码范围
完整代码实现
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
相关产品推荐
相关产品推荐

