20190626_二次开发BarTender打印机_C#代码_一边读取TID_一边打印_打印机POSTEK
demo代码如下:
private void btnPrint_Click(object sender, EventArgs e)
{
if (this.btnPrint.Text == "停止打印")
{
SetBtnPrintUIEnable();
return;
}
//禁用界面上的相关按钮
SetBtnPrintUIDisable();
var dt = new DataTable();
new Task(
() =>
{
///开始的打印
//1. 获取选中的dgv源
dt = GetDgvDataSourceChecked(); if (dt.Rows.Count <= 0)
{
SetTxtMessageInfo(this.txtMessageError, "没有选中任何数据, 不能打印");
Common.Contactor.ShowErrorMessage($"没有选中任何数据, 不能打印");
SetBtnPrintUIEnable();
return;
}
Thread.Sleep(500);
SetTxtMessageInfo(this.txtMessageInfo, "数据校验中. . ."); //开始打印
string tempPath = ConfigHelper.GetConfigString("templateName"); //模板名称
Thread.Sleep(500);
SetTxtMessageInfo(this.txtMessageInfo, $"当前使用的模板名称{tempPath}"); if (string.IsNullOrEmpty(tempPath.Trim()))
{
SetTxtMessageInfo(this.txtMessageError ,$"模板文件{tempPath}可能不存在, 请调整");
Common.Contactor.ShowErrorMessage($"模板文件{tempPath}可能不存在, 请调整");
SetBtnPrintUIEnable();
return;
}
if (Path.GetExtension(tempPath).Equals("btw"))
{
SetTxtMessageInfo(this.txtMessageError, $"不支持的文件格式{tempPath}");
Common.Contactor.ShowErrorMessage($"不支持的文件格式{tempPath}");
SetBtnPrintUIEnable();
return;
} string FileName = Path.GetFileName(tempPath);
string primKey = ConfigHelper.GetConfigString("primKey");
Thread.Sleep(500);
SetTxtMessageInfo(this.txtMessageInfo, "数据校验完毕, 准备开始打印. . .");
using (Engine engine = new Engine(true))
{
engine.Start();
if (format != null)
{
format.Close(SaveOptions.DoNotSaveChanges);
}
format = engine.Documents.Open(tempPath);// 打开路径上的btw模板文件
//设置默认打印机
format.PrintSetup.PrinterName = new System.Drawing.Printing.PrintDocument().PrinterSettings.PrinterName;
format.PrintSetup.IdenticalCopiesOfLabel = printCount;// Convert.ToInt32(GetControlText(this.cboPrintCount)); //
format.PrintSetup.NumberOfSerializedLabels = 1;
var dcs = dt.Columns.Cast<DataColumn>().Select((dc) => { return dc.Caption; }).Skip(1); //将第一个跳出去; 其实第一个跳不跳都行
var templateStrs = format.SubStrings.Select((s) => { return s.Name; }).ToArray(); string diffStr = string.Join(",", templateStrs.Except(dcs)); if (diffStr.Trim().Length > 0)
{
SetTxtMessageInfo(this.txtMessageError, $"在您的模板文件 {FileName} 中, 有这些\r\n {diffStr} \r\n字段不被即将打印的内容识别, \r\n您必须调整模板或者修改数据获取语句后才能继续");
Common.Contactor.ShowErrorRestart($"在您的模板文件 {FileName} 中, 有这些\r\n {diffStr} \r\n字段不被即将打印的内容识别, \r\n您必须调整模板或者修改数据获取语句后才能继续");
SetBtnPrintUIEnable();
format = null;
return;
}
//"templateStr" value="捆号,花型,长度,重量,机台,验布工,货架号,连幅标记,纪录时间,捆号状态,电子标签日期,电子标签编号"
lock (engine) //一定要锁定打印引擎
{
for (int i = 0; i < dt.Rows.Count; i++)
{
object oPrimKey = dt.Rows[i][primKey]; //获取主键列对应的值
if (oPrimKey == DBNull.Value || oPrimKey.ToString().Length <= 0)
{
SetTxtMessageInfo(this.txtMessageError, $"主键{primKey}数据错误, 它的值不能为NULL或者空字符");
Common.Contactor.ShowErrorMessage($"主键{primKey}数据错误, 它的值不能为NULL或者空字符");
SetBtnPrintUIEnable();
format = null;
return;
}
string currentPrimkey = oPrimKey.ToString();
string tid = operatorRFIDLabel.GetRFID_TID(); //读取标签中的TID if (!RegValidate.WordOrNumber(tid))
{
SetTxtMessageInfo(this.txtMessageError, $"标签内容TID获取错误{tid}, 打印将停止");
Common.Contactor.ShowErrorMessage($"标签内容获取错误{tid}, 打印将停止");
SetBtnPrintUIEnable();
format = null;
return;
} for (int j = 0; j < templateStrs.Length; j++)
{
format.SubStrings[templateStrs[j]].Value = dt.Rows[i][templateStrs[j]].ToString(); //给打印模板中对应的参数SN赋值
}
Messages messages;
int waitForCompletionTimeout = 10000; // 10 seconds
System.Diagnostics.Trace.WriteLine("→→→→→→→→→TID是" + tid);
Result r = format.Print("", waitForCompletionTimeout, out messages);
// string messageString = "\n\nMessages:";
// Thread.Sleep(500);
SetTxtMessageInfo(this.txtMessageInfo, $"正在打印第{i + 1}份, 它的主键编号是 {oPrimKey} ");
Thread.Sleep(2000); //根据博思得打印机实测,需要停2s, 否则TID将重复
////写数据库, 不能阻塞来写库, 会影响打印机读取TID超时
queuePrint.Enqueue(string.Format(ConfigHelper.GetConfigString("updateTid"), tid, currentPrimkey.Trim())); string com = ConfigHelper.GetConfigString("insertMysql");
string HN_NO = dt.Rows[i]["花型"] == DBNull.Value ? string.Empty : dt.Rows[i]["花型"].ToString();
string GH_NO = dt.Rows[i]["捆号"] == DBNull.Value ? string.Empty : dt.Rows[i]["捆号"].ToString();
string QTY_XD = dt.Rows[i]["长度"] == DBNull.Value ? string.Empty : dt.Rows[i]["长度"].ToString();
string QTY_GJ = dt.Rows[i]["重量"] == DBNull.Value ? string.Empty : dt.Rows[i]["重量"].ToString();
string JT_NO = dt.Rows[i]["机台"] == DBNull.Value ? string.Empty : dt.Rows[i]["机台"].ToString();
string YB_NO = dt.Rows[i]["验布工"] == DBNull.Value ? string.Empty : dt.Rows[i]["验布工"].ToString();
string FJ_NO = dt.Rows[i]["货架号"] == DBNull.Value ? string.Empty : dt.Rows[i]["货架号"].ToString();
string LF_ID = dt.Rows[i]["连幅标记"] == DBNull.Value ? string.Empty : dt.Rows[i]["连幅标记"].ToString();
DateTime USR_DD = dt.Rows[i]["纪录时间"] == DBNull.Value ? DateTime.Now : Convert.ToDateTime(dt.Rows[i]["纪录时间"]);
string GH_STA = dt.Rows[i]["捆号状态"] == DBNull.Value ? string.Empty : dt.Rows[i]["捆号状态"].ToString(); string strsql = string.Format(ConfigHelper.GetConfigString("insertMysql"), tid, HN_NO, GH_NO, QTY_XD, QTY_GJ, JT_NO, YB_NO, FJ_NO, LF_ID, USR_DD, GH_STA);
queuePrint.Enqueue(strsql);
}
}
format.Close(SaveOptions.DoNotSaveChanges);
format = null;
engine.Stop(); //启动那些按钮
SetBtnPrintUIEnable();
}
}
).Start(); /*1) Print方法:这个就是最常用的打印方法,里面可设置打印的任务名,是否等待打印完成,等待超时时间,打印过程输出的信息。
2) PrintOut方法:如果你需要在打印时出现打印设置对话框和状态框,你可以选择这个方法来实现。
3) Save方法:保存对Format的更改。
4) SetNamedSubStringValue方法:设置某个特定的SubString的值,这里就可以作为一个动态改变打印内容的方法。
5) SetPromt方法:跟SetNamedSubStringValue方法类似,不过他设置的是打印提示的值,某些标签通过设置可以在打印的时候弹出对话框,输入某些变量的值来改变打印内容,这个方法就是动态设置这些变量的。不过在集成中比较少用。
6) IdenticalCopiesOfLabel属性:这个是设置打印时要打印多少份相同的标签的,默认为标签设置。
7) NumberSerializedLabels属性:这个是序列化打印时使用的,当你的标签启动了序列化后,这个属性代表的就是打印的份数,譬如你的序列化初始数据是1,增量为1,NumberSerializedLabels设置为5,那么就会打印出1、2、3、4、5,五个标签出来。
8) Printer属性:指定要使用的打印机,默认为系统指定的默认打印机
9) PrintToFile属性:标示是马上用打印机打印出实物,还是生成一个打印文件。
*/
}
20190626_二次开发BarTender打印机_C#代码_一边读取TID_一边打印_打印机POSTEK的更多相关文章
- NX二次开发-NX+VS写代码设断点调试技巧
在做NX二次开发的时候写完代码,编译可以通过,但是执行的时候却没有反应,或者得到的结果不对,说明肯定有地方传值出错了.我在查找代码错误的时候有几种方法:1.uc1601打印函数输入和输出的值看对不对. ...
- 20190620_二次开发BarTender打印机时,未能解析主引用“Seagull.BarTender.Print, Version=1.0.0.0, Culture=neutral, processorArchitecture=x86”
错误提示: 严重性 代码 说明 项目 文件 行 禁止显示状态警告 未能解析主引用"Seagull.BarTender.Print, Version=1.0.0.0, Culture=neut ...
- Civil 3D .NET二次开发第11章代码升级至2018版注意事项
原来涉及2017的,均需要改为2018 原来的21改为22 代码中AeccXUiLand.AeccApplication.11.0"改为AeccXUiLand.AeccApplication ...
- 3.NetDh框架之缓存操作类和二次开发模式简单设计(附源码和示例代码)
前言 NetDh框架适用于C/S.B/S的服务端框架,可用于项目开发和学习.目前包含以下四个模块 1.数据库操作层封装Dapper,支持多种数据库类型.多库实例,简单强大: 此部分具体说明可参考博客: ...
- 【wireshark】Wireshark原理分析与二次开发系列
1.版权声明 本系列文章是本人花了很多心血写成,wireshark本是开源软件,本人也乐于技术知识和经验的分享,更是欣赏和推崇开源精神,因此任何看到本文的人都可以随意转载,但只有一个要求: 在大段甚至 ...
- kettle工具二次开发-代码启动JOB
kettle工具是一款优秀的数据同步.数据处理的BI工具,收到了很多人的青睐.kettle软件通过可视化的图标可以让我们很轻易的能完成数据同步.处理的开发工作.但是使用kettle可视化界面在跑JOB ...
- Linux内核启动代码分析二之开发板相关驱动程序加载分析
Linux内核启动代码分析二之开发板相关驱动程序加载分析 1 从linux开始启动的函数start_kernel开始分析,该函数位于linux-2.6.22/init/main.c start_ke ...
- 美客分销商城-接力购源码系统,全开源代码可进行二次开发,微信小程序分销商城
1. 准备服务器.域名(SSL证书).认证的微信小程序.微信支付商户号 2. 系统功能简介 三.演示案例,微信扫码查看 四.后台管理系统 五. 全套开源源码,进行二次开发 六.本系统完美运营,全套代码 ...
- SkylineDemoForWeb JavaScript二次开发示例代码
SkylineDemoForWeb JavaScript二次开发示例代码 http://files.cnblogs.com/files/yitianhe/SkylineDemoForWeb.zip
随机推荐
- ElasticSearch7.3破解
破解ES7.3.0到白金版(学习交流使用) 正常安装ELK7.3版本到服务器上 正常部署ELK7到服务器上,先不要启动.然后开始进行破解操作 进行破解操作 需要破解的文件:modules/x-pack ...
- FullCalendar v5.3.2版本制作一个航班日历Demo
今天一个新需求是制作一个航班日历来订舱.然后我就各种找,最后找到FullCalendar,过程非常煎熬,网上例子大部分没用,大部分没有完整版.官网教程又不是很详细.搞了几天才彻底搞好这个航班日历,有需 ...
- linux + MongoDB 安装 + 部署 + 讲解 (满满干货看完记得收藏噢)
话不多说开始了! 安装 安装就依据菜鸟教程的进行安装 传送门 => https://www.runoob.com/mongodb/mongodb-linux-install.html 好啦!现在 ...
- 利用sklearn实现k-means
基于上面的一篇博客k-means利用sklearn实现k-means #!/usr/bin/env python # coding: utf-8 # In[1]: import numpy as np ...
- iframe框架下的某一页面跳转到另外一个页面
//iframe只在当前页跳转 window.location = "/Admin/Blog/Index"; 只在当前页跳转 而不是整个页面都跳转
- 为什么大多数IOC容器使用ApplicationContext,而不用BeanFactory
1. 引言 Spring框架附带了两个IOC容器– BeanFactory 和 ApplicationContext. BeanFactory是IOC容器的最基本版本,ApplicationConte ...
- 鸿蒙系统应用开发之JS实现一个简单的List
在之前的文章鸿蒙应用开发之怎么更好的远程连接手表模拟器做调试里我运行了一个穿戴设备的应用,利用JS UI实现了一个最简单的HelloWorld. 今天我打算在智慧屏设备上利用豆瓣音乐的接口数据实现一个 ...
- Markdown文档示例
目录 我是大标题,和一级标题长得一样 我是次级标题,和二级标题长得一样 这是一级标题 这是二级标题 一直到六级标题 列表 表格 分割线 字体 超链接 插入图片 引用 代码块 注意下面每一个标记如果和内 ...
- Scrum转型(一) 为什么敏捷和Scrum
1.1 为什么敏捷 由于传统的瀑布模型管理方法无法满足现代某些软件产品开发过程的特点,我们需要使用敏捷的方法(例如,Scrum是一个让我们关注于在短时间里交付高质量商业价值的敏捷框架). 需求频繁变动 ...
- 关于backfill参数建议
前言 在做一个比较满的集群的扩容的时候,遇到了一些问题,在这里做下总结,一般来说很难遇到,扩容要趁早,不然出的问题都是稀奇古怪的一些问题 建议 环境一般来说在70%左右就需要考虑扩容了,这个时候的扩容 ...