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打印问题总结
在仓储系统的是使用过程中避免不了的是打印单据,仓库系统中包含很多单据:入库单,出库单,盘点单,调拨单,签收单等等,而且还附带着很多的条码标签的打印.本文在此记录一下一个简单的打印问题处理方式.处理问题 ...
随机推荐
- 201521123036 《Java程序设计》第6周学习总结
本周学习总结 1.1 面向对象学习暂告一段落,请使用思维导图,以封装.继承.多态为核心概念画一张思维导图,对面向对象思想进行一个总结. 1.2 可选:使用常规方法总结其他上课内容. 对象克隆:Clon ...
- 201521123059 《Java程序设计》第九周学习总结
1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结异常相关内容. 2. 书面作业 本次PTA作业题集异常 Q1:常用异常 题目5-1 1.1 截图你的提交结果(出现学号) 1.2 自 ...
- java课程设计(团队)-五子棋
单机五子棋小游戏 一:团队介绍 组长:网络1511,毛卓 组员:网络1511,朱潞潞 组员:网络1511,范阳斌 二:项目git提交记录截图 三:项目使用主要技术 netBeans,GUI 四:项目特 ...
- lintcode.66 二叉树前序遍历
二叉树的前序遍历 描述 笔记 数据 评测 给出一棵二叉树,返回其节点值的前序遍历. 您在真实的面试中是否遇到过这个题? Yes 样例 给出一棵二叉树 {1,#,2,3}, 1 \ 2 / 3 返 ...
- Oracle与Mysql区别简述
在Mysql中,一个用户下可以创建多个库: 而在Oracle中,Oracle服务器是由两部分组成 数据库实例[理解为对象,看不见的] 数据库[理解为类,看得见的] 一个数据库实例可拥有多个用户,一个用 ...
- temp-重庆农商行二次出差
1, 住宿(远舰商务酒店) 与胡仕川一起住 1722房间, 178-27=151(返现后). 7月30日 7月31日 8月1日 8月2日 8月3日 2, 住宿(郎菲酒店)一个人住, 158 ...
- Linux 虚拟机安装后的配置和一些命令符笔记
一.安装后的配置 1.设在终端的字体为等宽字体 比如:DejaVu Sans Mono 2.将当前的普通用户加入到sudo用户组adduser en sudochmod +w /etc/sudoers ...
- day14<常见对象+>
常见对象(正则表达式的概述和简单使用) 常见对象(字符类演示) 常见对象(预定义字符类演示) 常见对象(数量词) 常见对象(正则表达式的分割功能) 常见对象(把给定字符串中的数字排序) 常见对象(正则 ...
- 这是一名Java学者关于学习方向的建议
无可厚非,编程是一门艺术.但是辉煌的背后必须是一段辛苦的奋斗过程,而过程的引导方向就是最重要的一环.Java语言可谓是引领了编程的潮流,你会是怎样去学的呢? 这是一名Java学者的学习方向的建议 注: ...
- C#单例测试(懒汉式双锁保证线程安全)
单例模式的概念 单例模式的意思就是只有一个实例.单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例.这个类称为单例类. 关键点: 这个类只有一个实例,这是最基本的 它必须自行创建 ...