C# 可视化 拖拉控件 打印格式设计 模板设计 单据打印 标签打印 使用教程

之前用DEV+VS2019做了一款模板设计软件,  基本实现模板设计,单据/标签打印. 收到大家的回复有两个问题:

1.DEV属于第三方收费控件, 很多朋友说 没有买,用起来不方便.

2.模板设计时,手动输入参数进行调整,比较麻烦.

(旧版打印格式设计文章链接如下: (包含程序以及demo代码下载)C# 可视化 打印格式设计 模板设计 单据打印 标签打印_c#打印模板设计-CSDN博客文章浏览阅读3.3k次,点赞3次,收藏15次。打印模板设计好后,保存到本地一个文件,(后缀.fmt),大家有需要可以自己修改代码,比如保存模板到数据库,打印时按字段读取或者json文本保存读取. 这里我们用模板文件做演示.第一步 先新建一个容器,该容器决定打印的纸张大小,然后点击 工具栏的控件,按需添加控件到容器中.默认放在容器的左上角,叠在一起可能看不到,需要挪开上层控件,下面的才能看到.时常在网络上搜索关于打印格式的设计方面的资料,发现资料比较少,前一段时间因为有一个项目有这样一个需求,需要客户自定义打印格式,自己干脆做了一个,基本能满足要求._c#打印模板设计https://blog.csdn.net/guo9long/article/details/78092449

后面接受大家的意见,在旧版的基础上做了纯.net开发的新版,舍弃了DEV , 同时也做了功能上一些优化。更完善。

支持拖拉控件,类似winform程序开发窗体设计界面。

新版(20240819v1.0)下载地址:下载链接

https://download.csdn.net/download/guo9long/89689575

本章就介绍 新版 使用方法.

一、老规矩,先看下总体效果

标签类预览

二、模板设计

1> 设计模板

新增模板后,会出现一个空白的面板,这就是纸张的大小,可以右边进行选择,或者自定义纸张大小(custom).

点击工具栏位的各种控件,自动添加到模板中. 默认添加到左上角.

 

支持点中控件,然后拖拉改变位置 和 鼠标移动到边框的8个小圆圈再改变尺寸, 跟winform窗体程序 拖拉控件的操作类似。

同时也支持右边属性栏位 手动设值

[x,y ,高, 宽]     大家应该都能理解是啥。

绑定字段 就是 数据源中的列名或者key(后面会有详细介绍)。

2> 特意说明一下表格控件,与普通控件有不同的地方

新增模板,然后点击表格控件

在右侧属性栏位 有一个字段,可以点开,然后添加列字段,以及设置列的绑定信息等。

以及调整文本字体和对齐方式 等。

3、活动文本字段设置

活动文本中的内置文本中的"%InnerText%" (包含%) 属于被数据源中的绑定字段的数值替换的内容,其他内容会保留到打印界面。

4、设计完成后,保存为本地模板文件,后缀.fmtx , 旧版是fmt

 新版和旧版的模板文件 是不兼容的。需要注意下。

三、数据准备

模板准备好了后, 要打印还需要具体的数据,可以自己通过程序开发抓取数据 或者Demo中的程序可以用excel导入数据进行打印.

自己写程序抓数据,需要注意数据的格式,有一定的要求.

目前支持两种数据模式。(代码在下载的demo里面都有。)

1、Dictionary<string, string> -----键值对

            #region 构建打印数据
            Dictionary<string, string> po = new Dictionary<string, string>();
            po.Add("fbillno", "PO20240808001");
            po.Add("fsupplier", "中山市供应商有限公司");
            po.Add("fnote", "测试单头备注");
            po.Add("fdate", DateTime.Now.ToString("yyyy-MM-dd"));

            DataTable ens = new DataTable();
            ens.Columns.Add("fnumber");  //物料Code
            ens.Columns.Add("fname"); //物料名称
            ens.Columns.Add("funit");//单位
            ens.Columns.Add("fqty"); //数量
            ens.Columns.Add("fprice");//单价
            ens.Columns.Add("famount"); //金额
            ens.Columns.Add("fnote");//行备注

            DataRow dr = ens.NewRow();

            decimal qtys = 0;
            decimal Amount = 0;
            for (int r = 1; r < 10; r++)
            {
                dr = ens.Rows.Add();
                dr[0] = "M00" + r;
                dr[1] = "吸顶灯" + r;
                dr[2] = "PCS";
                dr[3] = "200";
                dr[4] = "36.00";
                dr[5] = "7200.00";
                dr[6] = "测试行备注" + r;

                qtys += 200;
                Amount += 7200;
            }

            //数据里面自己添加合计行,后续可以看下模板是否支持
            dr = ens.Rows.Add();
            dr[0] = "总合计:";
            dr[3] = qtys;
            dr[5] = Amount;
            #endregion 构建打印数据

2、List<Model>  -----Model需要自己构建

  public class PO
    {
        public string fbillno { get; set; }  //单号
        public string fsupplier { get; set; }  //供应商
        public string fdate { get; set; } //日期
        public string fnote { get; set; } //备注
        
    }

public class POEntry
    {
        public string fnumber { get; set; }  //物料Code
        public string fname { get; set; }  //物料名称
        public string funit { get; set; }  //单位
        public string fqty { get; set; }  //数量
        public string fprice { get; set; }  //单价
        public string famount { get; set; }  //金额
        public string fnote { get; set; }  //行备注
    }

  #region 构建打印数据
            PO po = new PO()
            {
                fbillno = "PO20240808001",
                fsupplier = "中山市供应商有限公司",
                fdate = DateTime.Now.ToString("yyyy-MM-dd"),
                fnote = "测试单头备注"
            };

            List<POEntry> ens = new List<POEntry>();
            for (int r = 1; r <= 10; r++)
            {
                POEntry en = new POEntry()
                {
                    fnumber = "M00" + r,
                    fname = "吸顶灯" + r,
                    funit = "PCS",
                    fqty = "100.00",
                    fprice = "35.00",
                    famount = "3500.00",
                    fnote = "测试行备注" + r
                };

                ens.Add(en);
            }

            //数据里面自己添加合计行,后续版本可以完善模板参数控制 合计行,包含页小计,最后页总合计.
            POEntry ensum = new POEntry()
            {
                fnumber = "总合计:",
                fname = "",
                funit = "",
                fqty = "1000.00",
                fprice = "",
                famount = "35000.00",
                fnote = ""
            };
            ens.Add(ensum);
            #endregion 构建打印数据

3、读取模板开始打印,内置了读取模板的方法,直接调用就好了.

  #region 读取模板          
            string fmatName = "采购订单.fmtx";
            List<Object> objs = PubStatic.GetFormat(fmatName);
            //#endregion 读取模板

            //#region 调用打印
            PrintService ps = new PrintService();
            ps.InitObj<PO, POEntry>(objs, po, ens);
            //PrintServiceT<PO, POEntry> ps = new PrintServiceT<PO, POEntry>(false, fmat, po, ens, false, 0, 0);
            打印预览
            ps.PrintView();

            //打印需要打印机名称
            //ps.Print("打印机名称");
            #endregion



 #region 读取模板
            string fmatName = "采购订单.fmtx";
            List<Object> objs = PubStatic.GetFormat(fmatName);
            #endregion 读取模板

            #region 调用打印
            PrintService ps = new PrintService(objs, po, ens);
            //打印预览
            ps.PrintView();

            //打印需要打印机名称
            //ps.Print("打印机名称");
            #endregion

demo里面也有生成好的测试程序,

界面上有两个自定义的功能,是可以通过excel构建数据,然后调取模板打印。 方便没有开发工具的朋友,能够做一些简单的标签或者单据的打印了。

以标签打印为例, 直接将demo里面的excel拖到窗体里面,或者点击打开数据菜单浏览文件 ,将准备的数据加载到程序中,注意第一行是数据源的列名,第二行开始才是数据。模板设计时,绑定的字段名要跟这里数据源中的列名相同.

再选择模板之前设计好的模板. 中间有一个下拉选择 打印机,点击打印或者预览就能打印了.

单据类稍微复杂一点, 分为单头和 单身 两个部分

例子中的"fbillno" 作为单据的关联字段。数据源中可以有多个单。默认第一个字段作为关联字段.

excel中用了两个sheet分别装单头和单身数据。sheet1是单头,sheet2是单身。

打印预览如下:

自动根据数据行数以及模板设定的每页行数计算 页数. 暂时合计行需要自己在数据中添加行,后续版本看是否可以打印时自动计算.

四、开发引入

1、引入DLL

文件也包含在demo中。

引入后,将格式设计窗体直接new完 show出来。

using HY.PrintSet;
using HY.PrintSet.Util;


 PrintSetForm ff = new PrintSetForm();
            ff.Show();

然后就是自己设计模板 以及构建打印数据,比如从其他接口 或者 数据库中获取到数据,调用打印类方法进行打印。

  #region 读取模板
            string fmatName = "采购订单.fmtx";
            List<Object> objs = PubStatic.GetFormat(fmatName);
            #endregion 读取模板

            #region 调用打印
            PrintService ps = new PrintService(objs, po, ens);
            //打印预览
            ps.PrintView();

新版下载地址:下载链接

https://download.csdn.net/download/guo9long/89689575

这个版本 纯.net开发,不含任何第三方控件。 速度杠杠的。

感兴趣的朋友可以一起研究进步。有问题可以发邮件82963620@qq.com

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值