Virgo标签打印
去年刚换新的公司,熟悉新的业务和代码,在修改公司打印标签的时候,感觉到无比烦躁与头痛。只因为不好维护,所有的标签打印,全部是GDI+绘制,每次修改微调,都只能全部运行才能看到效果。程序过大,编译过慢,这个修改过程真的是痛不欲生。
经过半年的调查,和整理,准备做个标签打印的配置工具,现在已经完成了大半,基本可用,准备将新版本程序嵌入这个标签工具,以方便日后标签的维护。
下面介绍下这个工具:
1 工具采用GDI+绘制,利用xml保存配置文件。这里我们叫它《标签配置文件》
主要包括String,Image,Table Line,四个标签样式,通过图形化处理,拖拽方式设置位置。
每个标签都有自己一系列的属性,通过属性面板可以设置对应的属性,例如String的Font。
2 工具配置数据绑定
考虑到直连数据库的问题,我没有直接绑定到数据库,而是采取读取另外一个配置文件 (这里我们叫它《数据配置文件》)。将对应的数据的ID绑定到标签配置配置文件中去。第三方调用的时候通过工具自带方法先《数据配置文件》
生成配置文件的对象。第三方更具他本身的条件对这个对象进行赋值,
3 生成标签并且打印
第三方生成数据对象后,读取需要打印的标签配置文件,传入工具自带方法,并且开始打印。
下面提供些工具截图和代码。
标签配置文件 <DrawReport Color="White" Size="800,700" NowBindFileDescription="" ID="">
<DrawLine StartPoint="81,44" EndPontY="231,44" PenW="1" LineColor="Black" />
<DrawImage Point="54,62" Size="200,87" Image="" NowBindFileDescription="" ID="" />
<DrawString Font="宋体, 12pt" Point="100,13" Width="0" Margin="4" IsRectangleF="False" Formart="名称:{0}" NowBindFileDescription="" ID="" />
<DrawImage Point="98,134" Size="114,164" Image="" NowBindFileDescription="" ID="" />
</DrawReport>
数据配置文件
<?xml version="1.0" encoding="utf-8"?>
<Report Note="Name为其他系统识别标识,SysName为本系统绑定数据显示标识。此文件应该不断完善,后期改动比较小
在配置的时候需要读取某个节点。绑定到ID,
第三方调用时 这里填入对应的数据,
打印的时候将这里数据对应的到界面上去。
"> <Type Name="用户标签" ID="Type004">
<String ID="S00001" SysName="名称" Name="用户名称" Note=" " Value="" />
<String ID="S00002" SysName="条码" Name="用户条码" Note=" " Value="" />
<Image ID="I00001" SysName="条码" Name="用户条码" Value="这里应该填入二进制" />
</Type> <Type Name="科室标签" ID="Type005">
<String ID="S00001" SysName="名称" Name="科室名称" Note=" " Value="" />
<String ID="S00002" SysName="条码" Name="科室条码" Note=" " Value="" />
<Image ID="I00001" SysName="条码" Name="科室条码" Value="这里应该填入二进制" />
</Type> <Type Name="测试" ID="Type008">
<String ID="S00001" SysName="产品类型" Name="产品类型" Note="打印包名称" Value="" />
<String ID="S00002" SysName="产品名称" Name="产品名称" Note=" " Value="" />
<String ID="S00003" SysName="包条码" Name="包条码" Note=" " Value="" />
<String ID="S00004" SysName="回收数量" Name="回收数量" Note=" " Value="" />
<String ID="S00005" SysName="配包人" Name="配包人" Note=" " Value="" />
<String ID="S00006" SysName="审核人" Name="审核人" Note=" " Value="" />
<String ID="S00007" SysName="失效日期" Name="失效日期" Note=" " Value="" />
<String ID="S00008" SysName="灭菌日期" Name="灭菌日期" Note=" " Value=""/>
<Table Name="器械明细" ID="Table001" >
<Columns>
<Column ID="T001" SysName="器械名称" Name="器械名称" />
<Column ID="T002" SysName="器械数量" Name="器械数量" />
<Column ID="T003" SysName="器械类型" Name="器械类型" />
<Column ID="T004" SysName="器械条码" Name="器械条码" />
</Columns>
</Table>
<Image ID="I00001" SysName="医院Logo" Name="医院Logo" Value="这里应该填入二进制" /> <Image ID="I00003" SysName="包条码" Name="包条码" Value="这里应该填入二进制" /> </Type> </Report>
第三代调用 using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using Virgo.ReportPrint;
using Virgo.ReportPrint.Common; namespace Virgo.Demo40
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
} private void buttonPrint_Click(object sender, EventArgs e)
{
System.Xml.XmlDocument xml = GetXml(); if (xml != null)
{
ReportData rd = ReportData.InitReportData();
//开始给rd赋值
LoadReportData(rd); Virgo.ReportPrint.Print print = new Print(); print.PrintReport(rd, xml);
}
else
{
MessageBox.Show(this, "请选择对应的配置文件!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Warning);
}
}
private void btnPrintShow_Click(object sender, EventArgs e)
{
System.Xml.XmlDocument xml = GetXml();
if (xml != null)
{
ReportData rd = ReportData.InitReportData();
//开始给rd赋值
LoadReportData(rd);
Virgo.ReportPrint.Print print = new Print();
print.PreviewReport(rd, xml);
}
else
{ MessageBox.Show(this, "请选择对应的配置文件!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Warning);
} } private System.Xml.XmlDocument GetXml()
{
OpenFileDialog fileDialog = new OpenFileDialog();
fileDialog.Multiselect = true;
fileDialog.Title = "请选择文件";
fileDialog.Filter = "配置文件(*.xml)|*.xml";
if (fileDialog.ShowDialog() == DialogResult.OK)
{
string file = fileDialog.FileName;
System.Xml.XmlDocument xml = new System.Xml.XmlDocument(); xml.Load(file);
return xml;
} return null;
}
private void btnDesgin_Click(object sender, EventArgs e)
{ Virgo.ReportPrint.frmDesign fd = new Virgo.ReportPrint.frmDesign();
fd.ShowDialog(this); } private void LoadReportData(ReportData rd)
{
foreach (ReportType rt in rd.ListReportType)
{
switch (rt.Name)
{
case "包标签":
LoadReportTypePackage(rt);
break;
case "灭菌标签":
break;
default:
break;
}
}
} /// <summary>
/// </summary>
/// <param name="rt"></param>
private void LoadReportTypePackage(ReportType rt)
{
foreach (KeyValuePair<string, ReportString> key in rt.DicReportString)
{ switch (key.Value.Name)
{
case "包名称":
key.Value.Value = "测试的包名称";
break;
case "产品名称":
key.Value.Value = "测试的产品名称";
break;
case "包条码":
key.Value.Value = "600201709130524";
break;
case "包类型":
key.Value.Value = "测试的类型";
break;
case "配包人":
key.Value.Value = "言护士";
break;
case "灭菌人":
key.Value.Value = "张护士";
break;
case "生产日期":
key.Value.Value = "2017-09-26 09:56";
break;
case "灭菌日期":
key.Value.Value = "2017-09-25 09:56";
break;
default:
break;
} } foreach (KeyValuePair<string, ReportImage> key in rt.DicReportImage)
{
switch (key.Value.Name)
{
case "医院Logo":
key.Value.Value = Image.FromFile(@"F:\测试图片\1.jpg").ConvertToString();
break; case "包条码": key.Value.Value = Image.FromFile(@"F:\测试图片\A.png").ConvertToString();
break;
default:
break;
}
} ReportTableRow rtr = null;
foreach (KeyValuePair<string, ReportTable> key in rt.DicReportTable)
{
switch (key.Value.Name)
{
case "器械明细": //器械明细表 if (key.Value.ListReportTableRow == null)
key.Value.ListReportTableRow = new List<ReportTableRow>(); for (int i = 0; i < 5; i++)
{
rtr = new ReportTableRow("0", key.Value.DicReportTableColumn); foreach (KeyValuePair<string, ReportTableColumn> key1 in rtr.DicReportTableColumn)
{
switch (key1.Value.Name)
{
case "器械名称":
key1.Value.Value = "测试名称" + i.ToString();
break;
case "器械数量":
key1.Value.Value = ReportCommon.GetRandKey(1, 999).ToString();
break;
case "器械类型":
key1.Value.Value = "类型" + i.ToString();
break;
case "器械条码":
key1.Value.Value = "600000000" + i.ToString();
break;
default:
break; }
} key.Value.ListReportTableRow.Add(rtr);
} break;
default:
break;
}
} } }
}
第一次写,不要喷!,不足之处共同学习。
谢谢!
Virgo标签打印的更多相关文章
- 生鲜配送管理系统_升鲜宝V2.0 小标签打印功能【代配送商品打印小标签功能】说明_15382353715
小标签打印说明 小标签打印可以打印本系统的订单商品数量,也可以把外部的订单商品导入本系统进行打印. 打印本系统中的订单商品操作说明[上篇文章已经讲解相关的操作说明] 打印本系统之外的订单商品明细清单 ...
- 生鲜配送管理系统_升鲜宝V2.0 小标签打印功能说明_15382353715
小标签打印说明 小标签打印可以打印本系统的订单商品数量,也可以把外部的订单商品导入本系统进行打印. 打印本系统中的订单商品操作说明 1.1 界面说明 1.2 查询条件 1.2.1 ...
- 使用FastReport报表工具生成标签打印文档
在我们实际开发报表的时候,我们需要按一定的业务规则组织好报表的模板设计,让报表尽可能的贴近实际的需求,在之前的随笔中<使用FastReport报表工具生成报表PDF文档>介绍了FastRe ...
- XtrasReport 标签打印
var lblList = new List<product_LblPrt_tmp>(); using (JL_MFGEntities ctx = new JL_MFGEntities() ...
- 基于Win服务的标签打印(模板套打)
最近做了几个项目,都有在产品贴标的需求 基本就是有个证卡类打印机,然后把产品的信息打印在标签上. 然后通过机器人把标签贴到产品上面 标签信息包括文本,二维码,条形码之类的,要根据对应的数据生成二维码, ...
- 移动手机端通过PC转接实现标签打印的解决方案
废话不多讲,由于种种原因项目上出现了移动手持录入标签信息通过pc端转接实现打印的需求,所以简单研究了一下,本来考虑使用webapi方式实现,但是发现这种方式调用打印机实现自动打印比较困难,所以转而求其 ...
- C# 标签打印示例 1
初次写博客,有哪些不足的地方,还请多多指点,给予建议,谢谢! 如若想要源码,请留言. 本实例是在Webservice 中通过excel做模板来打印标签.具体需求是:一个订单一页纸打印4行 ...
- PDA手持扫描资产标签,盘点完成后将数据上传到PC端,固定资产系统查看盘点结果
固定资产管理系统介绍: 致力于研发条码技术.集成条码系统的专业性公司,针对客户的不同需求,提供一站式的企业条码系统解决方案:包括功能强大的软件系统.安全可靠的无线网络.坚固耐用的硬件系统.灵活易用的管 ...
- 吉特仓库管理系统-.NET打印问题总结
在仓储系统的是使用过程中避免不了的是打印单据,仓库系统中包含很多单据:入库单,出库单,盘点单,调拨单,签收单等等,而且还附带着很多的条码标签的打印.本文在此记录一下一个简单的打印问题处理方式.处理问题 ...
随机推荐
- Java的构造器
初始化和清理是涉及安全的两个问题.C++和Java都引入了构造器(constructor)的概念,这是一个在创建对象时被自动调用的特殊方法. 可以假想为编写的每个类都定义一个initialize()方 ...
- tomcat学习笔记
1.安装和运行[必须] * 解压apache-tomcat-6.0.35.zip * 位置:不能包含中文和空格 * 运行: %tomcat%/bin/startup.bat * 测试 * http:/ ...
- JAVA中String = null 与 String = "" 的区别
JAVA中String = null 与 String = ""的区别 笔者今天在Debug的时候发现的NPE(NullPointerException),辛辛苦苦地调试了半天,终 ...
- 201521123065 《Java程序设计》第3周学习总结
1. 本周学习总结 2. 书面作业 Q1:代码阅读 public class Test1 { private int i = 1;//这行不能修改 private static int j = 2; ...
- 201521123097《Java程序设计》第三周学习总结
1. 本周学习总结 2. 书面作业 1.代码阅读 public class Test1 { private int i = 1;//这行不能修改 private static int j = 2; p ...
- JAVA课程设计-----加减法测试博客
1.团队成员介绍(一个人做的) 谢季努:网络1513 201521123079 2.项目git地址 3.项目git提交截图 4.项目运行截图 输入答案后点击确认就会出现本次的得分 如果觉得成绩不理想点 ...
- 201521123032 《Java程序设计》第3周学习总结(编辑器修改后)
本周学习总结 初学面向对象,会学习到很多碎片化的概念与知识.尝试学会使用思维导图将这些碎片化的概念.知识组织起来.请使用纸笔或者下面的工具画出本周学习到的知识点.截图或者拍照上传. 书面作业 代码阅读 ...
- Spring详解(六)------AOP 注解
上一篇博客我们讲解了 AspectJ 框架如何实现 AOP,然后具体的实现方式我们是通过 xml 来进行配置的.xml 方式思路清晰,便于理解,但是书写过于麻烦.这篇博客我们将用 注解 的方式来进行 ...
- Java多线程高并发学习笔记(三)——深入理解线程池
线程池最核心的一个类:ThreadPoolExecutor. 看一下该类的构造器: public ThreadPoolExecutor(int paramInt1, int paramInt2, lo ...
- java使用POI操作XWPFDocument 生成Word实战(一)
注:我使用的word 2016功能简介:(1)使用jsoup解析html得到我用来生成word的文本(这个你们可以忽略)(2)生成word.设置页边距.设置页脚(页码),设置页码(文本) 一.解析ht ...