weixin_44151228 2023-01-08 16:29 采纳率: 58.3%
浏览 67
已结题

c#中怎样实现多页打印及预览

用C#的printdocument画了一个表格,表格有31排,里面需要填入数据,数据的长短不定,有的没有超过31排,有的超过31排。
没有超过31排的,显示没有问题。
超过31排,也就是数据超过一页的,就不能正常显示了
也看到有人说用e.HasMorePages = true来解决,但是自己理解的不是很透彻,如果内容超过了31排,也就是超过了一页,用了e.HasMorePages = true后,显示的内容不仅填入到第一页的表格外面,而且也没有第二页的内容显示出来,代码如下:

  if (totalpages == 1)
            {
                for (int i = 0; i < r; i++)
                {
                    g.DrawString(arr[i], myfont1, mybrush, x + 615, y + 215 + i * 18);
                }
            }
            if (totalpages == 2)
            {
                for (int i = 0; i < 31; i++)
                {
                    g.DrawString(arr[i], myfont1, mybrush, x + 615, y + 215 + i * 18);
                }
                e.HasMorePages = true;
                for (int i = 31; i < r; i++)
                {
                    g.DrawString(arr[i], myfont1, mybrush, x + 615, y + 215 + i * 18);
                }
                e.HasMorePages = false;
            }

  • 写回答

4条回答 默认 最新

  • m0_54204465 2023-01-08 17:27
    关注

    你需要在打印文档的PrintPage事件处理函数中进行分页处理。具体来说,需要使用PrintPageEventArgs.HasMorePages属性来指示是否还有更多的页面要打印。

    每当需要打印新的一页时,应该将HasMorePages设置为true,并绘制该页的内容。接下来,在下一次调用PrintPage事件处理函数时,可以继续绘制下一页的内容。当不需要再打印更多页面时,将HasMorePages设置为false。

    例如,可以这样实现分页处理:

    private void printDocument1_PrintPage(object sender, PrintPageEventArgs e)
    {
        // 定义变量表示当前页的编号、每页的行数和当前已经打印的行数
        int page = 1;
        int rowsPerPage = 31;
        int rowsPrinted = 0;
    
        // 创建用于绘制文本的字体
        Font font = new Font("Arial", 10);
    
        // 计算总页数
        int totalPages = (int)Math.Ceiling((double)arr.Length / rowsPerPage);
    
        // 绘制当前页的内容
        while (rowsPrinted < rowsPerPage && page <= totalPages)
        {
            for (int i = rowsPrinted; i < arr.Length; i++)
            {
                e.Graphics.DrawString(arr[i], font, Brushes.Black, new PointF(615, 215 + i * 18));
                rowsPrinted++;
            }
            page++;
    
            // 如果还有更多的页面要打印,设置HasMorePages为true
            if (page <= totalPages)
            {
                e.HasMorePages = true;
            }
            else
            {
                e.HasMorePages = false;
            }
        }
    }
    
    

    以下是在你的代码的基础上进行修改的代码:

    private void printDocument1_PrintPage(object sender, PrintPageEventArgs e)
    {
        // 定义变量表示当前页的编号、每页的行数和当前已经打印的行数
        int page = 1;
        int rowsPerPage = 31;
        int rowsPrinted = 0;
    
        // 创建用于绘制文本的字体
        Font font = new Font("Arial", 10);
    
        // 计算总页数
        int totalPages = (int)Math.Ceiling((double)arr.Length / rowsPerPage);
    
        // 循环打印每一页
        while (page <= totalPages)
        {
            // 绘制当前页的内容
            for (int i = rowsPrinted; i < arr.Length; i++)
            {
                e.Graphics.DrawString(arr[i], font, Brushes.Black, new PointF(615, 215 + i * 18));
                rowsPrinted++;
    
                // 如果已经绘制的行数达到了每页的行数,跳出循环
                if (rowsPrinted >= rowsPerPage)
                {
                    break;
                }
            }
            page++;
    
            // 如果还有更多的页面要打印,设置HasMorePages为true
            if (page <= totalPages)
            {
                e.HasMorePages = true;
            }
            else
            {
                e.HasMorePages = false;
            }
        }
    }
    
    

    在这个代码中,我们使用了一个循环来打印所有的页面,并在每一页中绘制行的内容。每当绘制完每一页的内容后,我们将页码加1,并检查是否还有更多的页面要打印。如果有,我们将HasMorePages设置为true,否则设置为false。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(3条)

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 1月9日
  • 已采纳回答 1月9日
  • 赞助了问题酬金15元 1月8日
  • 赞助了问题酬金15元 1月8日
  • 展开全部

悬赏问题

  • ¥20 西门子S7-Graph,S7-300,梯形图
  • ¥50 用易语言http 访问不了网页
  • ¥50 safari浏览器fetch提交数据后数据丢失问题
  • ¥15 matlab不知道怎么改,求解答!!
  • ¥15 永磁直线电机的电流环pi调不出来
  • ¥15 用stata实现聚类的代码
  • ¥15 请问paddlehub能支持移动端开发吗?在Android studio上该如何部署?
  • ¥20 docker里部署springboot项目,访问不到扬声器
  • ¥15 netty整合springboot之后自动重连失效
  • ¥15 悬赏!微信开发者工具报错,求帮改