去年刚换新的公司,熟悉新的业务和代码,在修改公司打印标签的时候,感觉到无比烦躁与头痛。只因为不好维护,所有的标签打印,全部是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. 波涛1202wm8833 lihomme/历织造 2013秋装全新男装夹克 整身年龄外套潮流立领男士休闲外套薄_9才号

    波涛1202wm8833 lihomme/历织造 2013秋装全新男装夹克 整身年龄外套潮流立领男士休闲外套薄_9才号 波涛1202wm8833lihomme/历织造2013秋装全新男装夹克整身年龄外 ...

  2. 第02周-Java作业评价

    1. 本周作业简评与建议 作业存在的问题 格式上还是存在问题,但是比较第一次有很大的进步. 答题上,有的同学还是很敷衍,题目要求有分析过程,但是只写一个false,true,没有分析.也比较缺少自己的 ...

  3. 201521123060 《Java程序设计》第8周学习总结

    1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结集合与泛型相关内容. 1.2 选做:收集你认为有用的代码片段 2. 书面作业 本次作业题集集合 List中指定元素的删除(题目4-1 ...

  4. **********MySql查询方法重要**********

    分析问题要分步,查询每一步的结果,最后连起来 例如下面有四张表让你查询 查询选修“3-105”课程的成绩高于“109”号同学成绩的所有同学的记录. 第一部,找到课程编号为3-105的记录中学号为109 ...

  5. 第二部分----CSS的基础语法

    PART-1 CSS的基础常识 一.什么是CSS? W3C标准中,倡导有3:其一为内容与表现分离,其二为内容与行为分离,其三为内容结构的语义化.其倡导中第一条的"表现"指的便可以说 ...

  6. 如何选择适合的前端UI框架

    根据近几年前端框架的热门,在前端开发框架不断更新与交换的时代,每一年都有黑马出现,是否适合自己开发的项目就不得而知了,只有认真的了解之后才能知道,这里主要给大家说一下如何选择适合旅游的前端UI框架?相 ...

  7. CSS3微信启动页天王星版

    今天被微信启动页刷屏了. 一直还以为启动页背景显示的月球的.今天才了解到这么有含义. 我也蹭一下微信的热度,做一个HTML+CSS版本的. 用CSS画地球太困难了,来个简单点的,天王星版. 主要使用到 ...

  8. Excel的实用函数

    在介绍Excel函数前先说明两个概念:公式和函数. 公式:由用户自行设计对工作表进行计算和处理的计算式,以等号"="开始,其内部可以包括函数.引用.运算符和常量. 函数:即是预先定 ...

  9. /MD、/MT、/LD( 使用 多线程版本 运行时库的C runtime library)

    /MD./MT./LD(使用运行时库)(微软官网解释) Visual C++ 编译器选项 /MD./ML./MT./LD 区别 指定与你项目连接的运行期库 /MT多线程应用程序 /Mtd多线程应用程序 ...

  10. kbhit()

    kbhit() 非阻塞的响应键盘输入时间   C++函数 功能和返回值:检查是否有键盘输入 ,有返回非0 ,无返回0 int khbit(void) 头文件: #include<conio.h& ...