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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 03:14:07