打印Winform控件实现简陋版的分页打印(C#)

本文的代码可以从这里获取:winformDemo.rar · 张祥裕/分享的资源名称 - Gitee.com

作者的水平有限,如有错误,望指正。

为了简单起见,纸张大小,打印机等信息按照默认的来,本文的实现方案是:打印Panel中的控件信息,循环进行打印,打印完一张,把信息重新填充到对应的控件上再继续打印。

这个地址winforms - Print the entire area of the control with C# - Stack Overflow链接提到了这么一句:

说是要把控件里的内容重新赋值给另外一个控件myControlToDisplay,大概看了一下提供的代码,感觉代码不全,就没有照着来试了

还有这里的链接:

Printing Multiple Pages of a Text File in Windows Forms | DotNetCurry

读取txt记事本里面的内容,并分页打印,提供的代码

提到了一个HasMorePages属性,设置它应该可以实现连续打印,结合这两个链接提供的方案,这让我想到了另外一种方案:把要打印的内容全部渲染到一个容器控件上,根据纸张的大小,计算并截取要打印的内容,类似效果如下:

从上往下,就像叠罗汉一样,直到截取并打印完毕,这只是个人的想法,还没验证。

好了,本文的内容正式开始

步骤如下:

1 新建Winform程序,名为winfromDemo

UI布局及控件的名称如下:

2 新增类,名为:Student,代码如下:

cs 复制代码
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace winformDemo
{
    public class Student
    {
        /// <summary>
        /// 姓名
        /// </summary>
        public string Name { set; get; }
        /// <summary>
        /// 年龄
        /// </summary>
        public string Age { set; get; }
    }
}

3 打印逻辑代码如下:

cs 复制代码
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Drawing.Printing;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace winformDemo
{
    public partial class Form1 : Form
    {
        PrintPreviewDialog printDialog = new PrintPreviewDialog();
        PrintDocument printDocument = new PrintDocument();
        public Form1()
        {
            InitializeComponent();
            InitPrintInfo();
            this.btnPrint.Click += new System.EventHandler(this.btnPrint_Click);
        }
        /// <summary>
        /// 初始化打印信息
        /// </summary>
        private void InitPrintInfo()
        {
            printDialog.Document = printDocument;
            printDocument.PrintPage += PrintDocument_PrintPage;
        }
        

        /// <summary>
        /// 打印逻辑
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnPrint_Click(object sender, EventArgs e)
        {
            List<Student> studentPrintList = new List<Student>();
            studentPrintList.Add(new Student() {  Name="张三", Age="29"});
            studentPrintList.Add(new Student() { Name = "李四", Age = "28" });
            int currentPageNumber = 0;
            //遍历循环打印
            foreach (var item in studentPrintList)
            {
                currentPageNumber++;
                //设置页码信息
                SetPageInfo(currentPageNumber, studentPrintList.Count);
                this.txtName.Text = item.Name;
                this.txtSex.Text = item.Age;
                printDialog.ShowDialog();
            }
        }
        /// <summary>
        /// 调用printDialog.ShowDialog()方法就会自动调该方法进行打印
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void PrintDocument_PrintPage(object sender, PrintPageEventArgs e)
        {
            PrintStudentInfo(e.Graphics, this.printArea);
        }
        /// <summary>
        /// 打印控件
        /// </summary>
        /// <param name="graphics"></param>
        /// <param name="printControl"></param>
        public void PrintStudentInfo(Graphics graphics,Control printControl)
        {
            Bitmap bitmap = new Bitmap(printControl.Width, printControl.Height);
            printControl.DrawToBitmap(bitmap, new Rectangle(0,0, bitmap.Width, bitmap.Height));
            Rectangle target = new Rectangle(0, 0, bitmap.Width, bitmap.Height);
            graphics.PageUnit = GraphicsUnit.Display;
            graphics.DrawImage(bitmap, target);
        }
        /// <summary>
        /// 设置页码信息
        /// </summary>
        /// <param name="currentPageNumber"></param>
        /// <param name="totalPageNumber"></param>
        private void SetPageInfo(int currentPageNumber,int totalPageNumber)
        {
            this.lblPageInfo.Text =string.Format("第{0}页/总{1}页",currentPageNumber,totalPageNumber);
        }
    }
}

代码太简单了,就不解释了

4 点击打印按钮,运行效果如下:

关掉预览框后,会接着弹出打印第二页的预览框,如下图:

好了,本水文到此结束。如有疑问,可以通过邮箱联系:2847225301@qq.com

相关推荐
步、步、为营3 小时前
C# 探秘:PDFiumCore 开启PDF读取魔法之旅
开发语言·pdf·c#·.net
weixin_495774204 小时前
c# S7通信测试
开发语言·c#
朴拙数科7 小时前
pyautogui操控Acrobat DC pro万能PDF转Word,不丢任何PDF格式样式
pdf·c#·word
KpLn_HJL7 小时前
leetcode - 127. Word Ladder
leetcode·c#·word
__water10 小时前
22_解析XML配置文件_List列表
c#·list·列表·unity6000·解析xml配置文件
深度混淆13 小时前
C#,入门教程(05)——Visual Studio 2022源程序(源代码)自动排版的功能动画图示
开发语言·c#·自动排版
步、步、为营13 小时前
Avalonia+ReactiveUI跨平台路由:打造丝滑UI交互的奇幻冒险
ui·c#·.net·交互
望天hous16 小时前
C# 中使用Hash用于密码加密
开发语言·c#·哈希算法
pchmi18 小时前
C# OpenCV机器视觉:利用CNN实现快速模板匹配
人工智能·opencv·cnn·c#·机器视觉·opencvsharp
SunkingYang19 小时前
如何将xps文件转换为txt文件?xps转为pdf,pdf转为txt,提取pdf表格并转为txt
pdf·c#·解析·csv·转换·txt·xps