C#打印预览中数据库记录分页计数异常问题排查
C#打印预览分页异常问题排查
我帮你看了下代码,问题出在分页页码的计算逻辑上!
你原本的需求是每页15条,46条数据应该分成:第1页15条、第2页15条、第3页15条、第4页1条。但现在第1页少了1条,根源就在这段循环代码里:
int cPage = 0; for (int i = 1; i <= dt.Rows.Count; i++) { if (i % 15 == 0) cPage++; dt.Rows[i - 1]["PageNo"] = cPage; }
问题分析
我们一步步走一遍这个逻辑:
- 当
i从1到14时,i%15都不等于0,所以cPage一直是0,这14条数据的PageNo都被设为0; - 当
i=15时,i%15==0,cPage才加1变成1,然后第15条数据(对应Rows[14])的PageNo设为1; - 后续的
i=16到30,只有i=30时cPage才加1,以此类推。
结果就是:PageNo=0的只有14条(对应第1页),PageNo=1和PageNo=2各15条,完全不符合你每页15条的预期。
修正方案
把循环改成按数据索引(从0开始)来计算页码,这样每15条自动切换页码:
private void printDocument1_BeginPrint(object sender, System.Drawing.Printing.PrintEventArgs e) { try { dt.Columns.Add("PageNo"); dt.AcceptChanges(); int cPage = 0; // 按数据行索引(从0开始)遍历 for (int i = 0; i < dt.Rows.Count; i++) { // 当索引是15的倍数且不是第1条时,切换页码 if (i != 0 && i % 15 == 0) { cPage++; } dt.Rows[i]["PageNo"] = cPage; } dt.AcceptChanges(); CURRENT_PAGE = 0; if (dt.Rows.Count <= 0) { MessageBox.Show("No records found!"); // 补全你原来的剩余代码逻辑 } } catch (Exception ex) { // 建议加上异常处理,方便排查问题 MessageBox.Show($"Error: {ex.Message}"); } }
或者更简洁的写法,直接用整数除法计算页码(推荐):
for (int i = 0; i < dt.Rows.Count; i++) { // 整数除法自动向下取整,0-14→0,15-29→1,以此类推 dt.Rows[i]["PageNo"] = i / 15; }
这样修改后,前15条数据的PageNo都是0(对应第1页),接下来15条是1(第2页),再15条是2(第3页),最后1条是3(第4页),完美符合你的分页需求。
内容的提问来源于stack exchange,提问作者Waqas Qureshi
相关产品推荐
相关产品推荐

