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

C# WinForm中如何用printDocument实现多页不同内容打印?

解决C# WinForm打印多页独立内容的问题

你的核心问题是没搞懂PrintPage事件的触发逻辑:这个事件每打印一页就会被调用一次,不需要在单次事件里同时绘制多页内容。你当前的代码在第一次触发时既画了第一页又画了第二页的内容,导致第一页叠加了两部分内容,而第二次触发事件时又重复绘制第一页的内容,最终两页内容重复。

正确的做法是根据currentpage的值,在每次事件触发时只绘制当前页的专属内容,再通过e.HasMorePages控制是否继续打印下一页。修正后的代码如下:

int currentpage = 0;
int numofpages = 2;

private void printDocument1_PrintPage(object sender, System.Drawing.Printing.PrintPageEventArgs e)
{
    // 根据当前页码绘制对应内容
    switch(currentpage)
    {
        case 0:
            // 第一页内容
            Bitmap bmp1 = Properties.Resources.someImage;
            e.Graphics.DrawImage(bmp1, 20, 20);
            e.Graphics.DrawString("More content", new Font("Verdana", 10, FontStyle.Bold), Brushes.Black, 600, 350);
            break;
        case 1:
            // 第二页内容
            Bitmap bmp2 = Properties.Resources.someOtherImage;
            e.Graphics.DrawImage(bmp2, 20, 20);
            e.Graphics.DrawString("Other content", new Font("Verdana", 10, FontStyle.Bold), Brushes.Black, 600, 350);
            break;
    }

    currentpage++;
    // 判断是否还有下一页
    e.HasMorePages = currentpage < numofpages;
}

关键说明:

  • 每次PrintPage事件触发时,currentpage代表当前要打印的页码(从0开始),根据它来区分要绘制的内容。
  • 绘制完当前页内容后,递增currentpage,再通过currentpage < numofpages来设置e.HasMorePages——如果为true,打印系统会再次触发PrintPage事件打印下一页;如果为false,打印结束。
  • 注意:打印开始前最好重置currentpage为0,比如在调用printDocument1.Print()之前加上currentpage = 0;,避免多次打印时页码混乱。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 10:05:22