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

这篇具有很好参考价值的文章主要介绍了打印Winform控件实现简陋版的分页打印(C#)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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

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

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

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

打印Winform控件实现简陋版的分页打印(C#),C#编程,c#,winfrom,分页打印,打印控件

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

还有这里的链接:

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

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

打印Winform控件实现简陋版的分页打印(C#),C#编程,c#,winfrom,分页打印,打印控件

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

打印Winform控件实现简陋版的分页打印(C#),C#编程,c#,winfrom,分页打印,打印控件

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

 文章来源地址https://www.toymoban.com/news/detail-620385.html

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

步骤如下:

1  新建Winform程序,名为winfromDemo

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

打印Winform控件实现简陋版的分页打印(C#),C#编程,c#,winfrom,分页打印,打印控件

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  点击打印按钮,运行效果如下:

打印Winform控件实现简陋版的分页打印(C#),C#编程,c#,winfrom,分页打印,打印控件

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

打印Winform控件实现简陋版的分页打印(C#),C#编程,c#,winfrom,分页打印,打印控件

 

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

 

到了这里,关于打印Winform控件实现简陋版的分页打印(C#)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • SpringBoot ElasticSearch 实现订单的分页查询 【SpringBoot系列17】

    SpringCloud 大型系列课程正在制作中,欢迎大家关注与提意见。 程序员每天的CV 与 板砖,也要知其所以然,本系列课程可以帮助初学者学习 SpringBooot 项目开发 与 SpringCloud 微服务系列项目开发 elasticsearch是一款非常强大的开源搜索引擎,具备非常多强大功能,可以帮助我们从海

    2024年02月09日
    浏览(44)
  • 【分页表格】Vue2 + Element UI实现自定义的分页表格组件(自定义Vue组件)

    这篇文章,主要介绍Vue2 + Element UI实现自定义的分页表格组件(自定义Vue组件)。 目录 一、分页表格 1.1、运行效果 1.2、运行环境 1.3、案例代码

    2024年02月11日
    浏览(59)
  • MyBatis的分页原理

    最近看到了一篇MyBatis的分页实现原理,文章里描述到使用ThreadLocal,其实想主要想看看ThreadLocal的巧妙使用,并且看一下分页是如何实现的。 ChaiRongD/Demooo - Gitee.com 其实一个简单的分页如下面代码所示,使用PageHelp对象设置分页的参数,然后把查询到的List对象作为参数传入P

    2024年02月09日
    浏览(37)
  • Mybatis中的分页插件

    目录 一.为什么要使用分页插件? 二.分页常用标签 三.分页插件的使用         1.在mybatis的pom中添加分页插件依赖         2.在mybatis-config.xml中创建分页插件 3.在test文件中进行查询操作的时候,开启分页功能        PageInfo()         PageHelper.startPage(); 总结: 不必

    2023年04月13日
    浏览(38)
  • Elasticsearch - 闲聊ElasticSearch中的分页

    ElasticSearch是一款强大的搜索引擎,它能够帮助我们快速地搜索海量数据。然而,在处理大量数据时,ElasticSearch的性能可能会受到影响。其中一个常见的问题是深度分页,也就是当我们需要获取大量数据时,ElasticSearch需要处理的数据量太大,导致性能下降。 Elasticsearch 深度分

    2024年02月11日
    浏览(37)
  • MyBatisPlus(SpringBoot版)的分页插件

    目录  一、前置工作:         1.整体项目目录结构         2.创建普通javamaven项目。         3.导入依赖,改造成springboot项目         4.配置启动类         5.创建service接口及其实现类        6.创建接口Mapper                  7.配置数据源         8.创建数

    2024年04月27日
    浏览(45)
  • 【定时任务处理中的分页问题】

    最近要做一个定时任务处理的需求,在分页处理上。发现了大家容易遇到的一些\\\"坑\\\",特此分析记录一下。 场景 现在想象一下这个场景,你有一个定时处理任务,需要查询数据库任务表中的所有待处理任务,然后进行处理。 举个例子:生成用户的月度账单,并且要尽可能确

    2024年02月12日
    浏览(46)
  • c# winform实现控件类型、数量的动态更新

    在系统开发的过程中,往往会遇到需要动态的控制控件内部显示的控件数量、控件类型的情况,比如这样的。 1、问题描述:如何自定义的控制控件中数据显示的类型呢? 首先面对这个问题,我们得先了解winform的控制工具中有哪些控件是可以用来承载其他控件工具的,例如以

    2024年02月16日
    浏览(39)
  • vue使用printJs实现前端打印,以及打印分页实现

    在web端可以直接使用原生调用方法调用打印,但是往往需要单独把需要打印的东西拎出来画一个单独的html,而使用printJs则可选中你需要打印的代码块,进行页面局部打印 我的需求为将表格打印出来,并且超过分页数进行分页展示 以下内容参考了其他博主的实现方法,仅供参考 1.可

    2024年02月03日
    浏览(39)
  • C# winform usercontrol控件跟随主窗体实现自动大小

    usercontrol控件跟随主窗体实现自动大小 今天是跟着哗哩哗哩大学学习C的第N天,但是是学习usercontrol的第一天。 第一天遇到的问题就是如何将usercontrol的大小跟随主窗体的一起变大变小。视频中教得很详细,首先是将usercontrol控件实例化,接着就是设置usercontrol的dock属性为fil

    2024年02月12日
    浏览(48)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包