去年刚换新的公司,熟悉新的业务和代码,在修改公司打印标签的时候,感觉到无比烦躁与头痛。只因为不好维护,所有的标签打印,全部是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标签打印的更多相关文章

  1. 生鲜配送管理系统_升鲜宝V2.0 小标签打印功能【代配送商品打印小标签功能】说明_15382353715

    小标签打印说明 小标签打印可以打印本系统的订单商品数量,也可以把外部的订单商品导入本系统进行打印. 打印本系统中的订单商品操作说明[上篇文章已经讲解相关的操作说明] 打印本系统之外的订单商品明细清单 ...

  2. 生鲜配送管理系统_升鲜宝V2.0 小标签打印功能说明_15382353715

    小标签打印说明 小标签打印可以打印本系统的订单商品数量,也可以把外部的订单商品导入本系统进行打印. 打印本系统中的订单商品操作说明 1.1    界面说明 1.2     查询条件 1.2.1     ...

  3. 使用FastReport报表工具生成标签打印文档

    在我们实际开发报表的时候,我们需要按一定的业务规则组织好报表的模板设计,让报表尽可能的贴近实际的需求,在之前的随笔中<使用FastReport报表工具生成报表PDF文档>介绍了FastRe ...

  4. XtrasReport 标签打印

    var lblList = new List<product_LblPrt_tmp>(); using (JL_MFGEntities ctx = new JL_MFGEntities() ...

  5. 基于Win服务的标签打印(模板套打)

    最近做了几个项目,都有在产品贴标的需求 基本就是有个证卡类打印机,然后把产品的信息打印在标签上. 然后通过机器人把标签贴到产品上面 标签信息包括文本,二维码,条形码之类的,要根据对应的数据生成二维码, ...

  6. 移动手机端通过PC转接实现标签打印的解决方案

    废话不多讲,由于种种原因项目上出现了移动手持录入标签信息通过pc端转接实现打印的需求,所以简单研究了一下,本来考虑使用webapi方式实现,但是发现这种方式调用打印机实现自动打印比较困难,所以转而求其 ...

  7. C# 标签打印示例 1

    初次写博客,有哪些不足的地方,还请多多指点,给予建议,谢谢! 如若想要源码,请留言.        本实例是在Webservice 中通过excel做模板来打印标签.具体需求是:一个订单一页纸打印4行 ...

  8. PDA手持扫描资产标签,盘点完成后将数据上传到PC端,固定资产系统查看盘点结果

    固定资产管理系统介绍: 致力于研发条码技术.集成条码系统的专业性公司,针对客户的不同需求,提供一站式的企业条码系统解决方案:包括功能强大的软件系统.安全可靠的无线网络.坚固耐用的硬件系统.灵活易用的管 ...

  9. 吉特仓库管理系统-.NET打印问题总结

    在仓储系统的是使用过程中避免不了的是打印单据,仓库系统中包含很多单据:入库单,出库单,盘点单,调拨单,签收单等等,而且还附带着很多的条码标签的打印.本文在此记录一下一个简单的打印问题处理方式.处理问题 ...

随机推荐

  1. 201521123048 《Java程序设计》第8周学习总结

    1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结集合与泛型相关内容. 2. 书面作业 本次作业题集集合 1.List中指定元素的删除(题目4-1) 1.1 实验总结 for (in ...

  2. 201521123018 《Java程序设计》第6周学习总结

    1. 本章学习总结 2. 书面作业 一.clone方法 1.1 Object对象中的clone方法是被protected修饰,在自定义的类中覆盖clone方法时需要注意什么? 用protected修饰 ...

  3. 控制结构(8) 线性化(linearization)

    // 上一篇:管道(pipeline) // 下一篇:程序计数器(PC) "编程语言不过是一个工具,什么语言都一样","编程语言能改变人的思维,不同的语言会带给你不同的思 ...

  4. 201521145048《java程序设计》第10周学习总结

    1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结异常与多线程相关内容. 2. 书面作业 本次PTA作业题集异常.多线程 Q1.finally 题目4-2 1.1 截图你的提交结果( ...

  5. JavaSE(十)之Collection总结

    前面几篇把集合中的知识大概都详细的说了一遍,但是我觉得还是要总结一下,这样的话,可以更好的理解集合. 一.Collection接口 首先我们要一张图来说明: Collection接口,它是集合的顶层接 ...

  6. .Net45下HttpClient的几个缺陷

    前言 最近在写WebClientApi这个组件,底层使用HttpClient,发现HttpClient有许多低级的错误,使用者一不小心就可能会正常的去调用它的这些错误,得不到预期的结果.本文我把我认为 ...

  7. [06] Session实现机制以及和Cookie的区别

    1.为什么有Session和Cookie 根据早期的HTTP协议,每次request-reponse时,都要重新建立TCP连接.TCP连接每次都重新建立,所以服务器无法知道上次请求和本次请求是否来自于 ...

  8. 从content-type设置看Spring MVC处理header的一个坑

    我们经常需要在HttpResponse中设置一些headers,我们使用Spring MVC框架的时候我们如何给Response设置Header呢? Sooooooooooooo easy, 看下面的 ...

  9. MyBatis学习(五)resultMap测试

    resultMap是MyBatis最强大的元素,它的作用是告诉MyBatis将从结果集中取出的数据转换成开发者所需要得对象. 接下来我们对resultMap进行一个简单测试.(当所需要返回的对象是一个 ...

  10. CSS3 animation-timing-function steps()

    animation-timging-function 主要是控制css动画从开始到结束的速度. linear:线性过渡.等同于贝塞尔曲线(0.0, 0.0, 1.0, 1.0) ease:平滑过渡.等 ...