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

C#多页打印异常:打印0-99时出现无限页数循环问题

问题分析与解决

你的代码陷入无限循环的核心原因是:每次触发PrintPage事件时,都会重新执行整个for (int i = 0; i < 100; i++)循环——也就是说每次打印新页面都会从i=0开始,永远无法完成100条数据的打印,只会不断重复打印前几行并触发新页面。

另外代码里还有一行语法错误的冗余代码:Convert.ToInt32(l_Position_Y), 100, 20);,需要删除。

修正后的代码

首先在类的级别定义成员变量记录当前打印进度:

private int _currentPrintIndex = 0; // 记录当前打印到第几个数字

然后修改打印相关方法:

public void printDemo()
{
  _currentPrintIndex = 0; // 打印前重置起始索引
  this.m_Print_Document.PrintPage += pd_Print_Page;
  this.m_Print_Document.Print();
}

private void pd_Print_Page(object sender, PrintPageEventArgs pEvent)
{
  float l_Position_Y = 1;    
  float l_Page_Height = pEvent.MarginBounds.Height;
  Graphics g = pEvent.Graphics;
  
  // 使用using自动释放字体和画刷资源,避免内存泄漏
  using (Font font1 = new Font("Arial", 9))
  using (SolidBrush brush = new SolidBrush(Color.Black))
  {
    // 从当前索引开始,直到填满一页或完成所有数据
    while (_currentPrintIndex < 100)
    {
      if (l_Position_Y + 20 < l_Page_Height)
      {
        g.DrawString("Text" + _currentPrintIndex, font1, brush, 50, l_Position_Y);
        l_Position_Y += 20;
        _currentPrintIndex++;
      }
      else
      {
        pEvent.HasMorePages = true;
        // 退出循环,等待下一次PrintPage事件触发
        return;
      }
    }
    // 所有数据打印完成,终止打印流程
    pEvent.HasMorePages = false;
  }
}

关键修改说明

  • 用类成员变量_currentPrintIndex替代局部循环变量,确保跨页面打印时能延续进度
  • 改用while循环更灵活控制打印终止条件
  • 增加using语句管理字体和画刷的资源释放
  • 打印完成后显式设置HasMorePages = false,结束打印流程

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 08:40:11