本文的代码可以从这里获取: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,代码如下:
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 打印逻辑代码如下:
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