weixin_44151228 2023-01-09 09:44 采纳率: 58.3%
浏览 57
已结题

c#中怎样实现多页打印,在预览中看到多页显示

用C#的printdocument写数据,要求每页只写入31排,写满一页后,将多的内容写到第二页,以此类推,该如何写?别人也给了我方法,我试了一下,始终有问题,所有内容都会显示在第一页上,不会将多于31排的内容自动显示到后面的页上。

没有超过31排的,显示没有问题。
超过31排,也就是数据超过一页的,就不能正常显示了
有人说用e.HasMorePages = true来解决,但是自己理解的不是很透彻,如果内容超过了31排,也就是超过了一页,用了e.HasMorePages = true后,内容会重复显示在第一页,没有自动走纸,将多于31排的内容显示到后面的页上,代码如下:

private void printDocument1_PrintPage(object sender, PrintPageEventArgs e)
        {
            string str = "Hello,World!,This,is,a,multi - page,print,example," +
                "Hello,World!,This,is,a,multi - page,print,example," +
                "Hello,World!,This,is,a,multi - page,print,example," +
                "Hello,World!,This,is,a,multi - page,print,example," +
                "Hello,World!,This,is,a,multi - page,print,example," +
                "Hello,World!,This,is,a,multi - page,print,example," +
                "Hello,World!,This,is,a,multi - page,print,example," +
                "Hello,World!,This,is,a,multi - page,print,example," +
                "Hello,World!,This,is,a,multi - page,print,example,";
            string[] arr = str.Split(',');

            // 定义变量表示当前页的编号、每页的行数和当前已经打印的行数
            int page = 1;
            int rowsPerPage = 31;
            int rowsPrinted = 0;
            int totalPages = (arr.Length + 30) / 31;

            // 创建用于绘制文本的字体
            Font font = new Font("Arial", 10);

            // 循环打印每一页
            while (page <= totalPages)
            {
                //循环结束后显示的行数清零
                int row = 0;

                // 绘制当前页的内容
                for (int i = rowsPrinted; i < arr.Length; i++)
                {
                    e.Graphics.DrawString(arr[i], font, Brushes.Black, new PointF(615, 215 + row * 18));
                    rowsPrinted++;
                    row++;

                    // 如果已经绘制的行数达到了每页的行数,跳出循环
                    if (rowsPrinted >= rowsPerPage * page)
                    {
                        break;
                    }
                }
                page++;

                //显示页码
                e.Graphics.DrawString(page.ToString(), font, Brushes.Black, new PointF(615, 215 + 32 * 18));

                // 如果还有更多的页面要打印,设置HasMorePages为true
                if (page <= totalPages)
                {
                    e.HasMorePages = true;

                }
                else
                {
                    e.HasMorePages = false;

                }
            }

        }

private void 打印预览_Click(object sender, EventArgs e)
        {


            PrintPreviewDialog printPreviewDialog = new PrintPreviewDialog();
            printPreviewDialog.Document = printDocument1;
            printPreviewDialog.ShowDialog();


        }
  • 写回答

7条回答 默认 最新

  • 於黾 2023-01-09 09:51
    关注

    e.HasMorePages要设置成true,则表示新建一页,什么时候它变成false,表示最后一页
    你应该先设置e.HasMorePages,后page++,否则page先变成了2,你的e.HasMorePages就会设置成false

    评论 编辑记录

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 1月9日
  • 创建了问题 1月9日

悬赏问题

  • ¥15 openHarmony 利用c++程序在dayu210开发板上实现拉取RTSP视频流并且在屏幕上显示
  • ¥15 GD32H757的can通信配置
  • ¥20 nist随机数测试的问题
  • ¥20 帮我解决这个项目,thank you各位程序员
  • ¥15 哪位能用ea软件做一下,有偿
  • ¥15 按要求编写汇编语言,并设计仿真电路图
  • ¥15 电脑软件运行次数如何统计
  • ¥15 同一个浏览器打开两个窗口怎么区分会话
  • ¥100 如何编写自己的emmc镜像
  • ¥15 starccm线性内聚力模型