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(); //读取标签中的TIDif (!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 secondsSystem.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属性:标示是马上用打印机打印出实物,还是生成一个打印文件。*/ }

  

 

转载于:https://www.cnblogs.com/wxylog/p/11093361.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/483086.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C++学习——string

文章目录1.int转字符串字符串转int?2.strcat,strcpy,strncpy,memset,memcpy的内部实现&#xff1f;1.int转字符串字符串转int? 例:"123"123#include<iostream> #include<string> using namespace std;string string_head_end(string str) {string s&q…

卷积神经网络(CNN)数学原理解析

来源&#xff1a;图灵人工智能作者&#xff1a;Piotr Skalski编辑&#xff1a;python数据科学原标题&#xff1a;Gentle Dive into Math Behind Convolutional Neural Networks翻 译&#xff1a; 通夜&#xff08;中山大学&#xff09;、had_in&#xff08;电子科技大学&#…

仅模糊背景图像而不是前面的文本

正如标题所说。 如何模糊容器的背景图像而不模糊前面的文本&#xff1f; <div class"card"> <div class"head"> <div class"title"> <span>Card Title</span> </div> </div> <div class"body…

C++学习——模板

文章目录1.C模板2.C模板是什么&#xff0c;底层怎么实现的&#xff1f;1.C模板 模板是泛型编程的基础&#xff0c;泛型编程即以一种独立于任何特定类型的方式编写代码。模板是创建泛型类或函数的蓝图或公式。 库容器&#xff0c;比如迭代器和算法&#xff0c;都是泛型编程的例…

【数据结构基础】-串-顺序结构的基本操作实现

2019.10.12 数据结构中串的基本操作实现&#xff0c;包括串的定义&#xff0c;串的初始化&#xff0c;赋值&#xff0c;获取串的长度&#xff0c;串的比较&#xff0c;连接串&#xff0c;求子串&#xff0c;清空串。 语言&#xff1a;c语言 运行环境&#xff1a;dev #include &…

大脑研究正在挑战超级计算,“人脑计划”或需提前部署百亿亿级超级计算机...

来源&#xff1a;DeepTech深科技人脑的复杂性正推动着超级计算释放更多的潜力。据了解&#xff0c;人脑包含大约 860 亿个神经元&#xff0c;可形成数万亿个接触点。如果以细胞分辨率对整个大脑进行成像&#xff0c;甚至会产生数 PB 范围内的数据&#xff0c;这样的的计算量令人…

02 算术、字符串与变量(1)

本章内容 1、交互式命令shell 2、整数算术 3、浮点算术 4、其他数学函数 5、字符串 6、字符串拼接 7、获取帮助 8、类型转换 9、变量和值 10、赋值语句 11、变量如何引用值 12、多重赋值 -------------------------------------- 在学习Python前&#xff0c;我们需要了解数据类…

C++学习——c语言和C++语言中的struct

C语言struct和Cstruct区别 C语言中&#xff1a;struct是用户自定义数据类型&#xff08;UDT&#xff09;&#xff1b; C中struct是抽象数据类型&#xff08;ADT&#xff09;&#xff0c;支持成员函数的定义&#xff0c;&#xff08;C中的struct能继承&#xff0c;能实现多态&am…

【数据结构基础】-线性表的顺序实现(数组实现)基本操作

2019.10.10 【数据结构-线性表的顺序结构】 基本操作&#xff1a;初始化&#xff0c;判断是否空表&#xff0c;清空表&#xff0c;获取表中的第i个元素&#xff0c;查找元素&#xff0c;插入元素&#xff0c;删除元素&#xff0c;获取表的元素个数。 抽象数据类型&#xff1a…

机器学习驱动技术是生物学进步的下一个突破

来源&#xff1a;ScienceAI作者&#xff1a;Immunai 联合创始人兼 CEO&#xff0c;Luis Voloch编译&#xff1a;绿萝数字生物学与 90 年代的互联网处于同一发展阶段&#xff08;早期、激动人心和变革性&#xff09;。当时&#xff0c;IP 地址的概念还很新&#xff0c;「精通技术…

makefile编译erlang

https://www.cnblogs.com/witton/p/6868963.html转载于:https://www.cnblogs.com/hshy/p/11096625.html

C++学习——内联函数

文章目录1.内联函数1.1 什么是内联函数1.2 内联函数的声明1.3 内联函数的条件2.成员函数与内联函数2.1 内联成员函数2.2 判断成员函数时候为内联函数3. 虚函数可以声明为inline吗1.内联函数 1.1 什么是内联函数 C提供一种提高函数效率的方法&#xff0c;即在编译时将被调函数…

实现调用API接口

API是一组封装好的函数&#xff0c;通过API&#xff0c;你可以为应用快速扩展功能&#xff0c;而无需理解它们是如何实现的&#xff0c;从而提升开发效率。通常&#xff0c;API服务商会提供API文档&#xff0c;那么如何根据文档来使用API呢&#xff1f; PS:该文章内容来自于阿里…

量子力学与机器学习相结合,预测高温下的化学反应

来源&#xff1a;ScienceAI编辑&#xff1a;凯霞在高温下从氧化物中提取金属不仅对于钢铁等金属的生产至关重要&#xff0c;而且对回收利用也必不可少。但当前的提取过程是碳密集型的&#xff0c;会排放大量温室气体。研究人员一直在探索开发「更绿色」的工艺方法。第一性原理理…

js实现右键单击打开自定义的菜单

今天分享一个&#xff0c;单击鼠标右键弹出自定义菜单&#xff0c;选中不同菜单选项&#xff0c;实现其对应功能 首先先自已定义一个菜单 <div id"menu"><ul><li>添加</li><li>删除</li><li>修改</li></ul>&l…

个人觉得好的文章链接推荐【转载,侵权立删】

声明&#xff1a;本篇博客为博主学习后端中觉得好的文章&#xff0c;不定期更新。上方是链接&#xff0c;下方是作者简介以及内容简介。均为转载&#xff0c;来源不限&#xff0c;若有侵权&#xff0c;请联系博主&#xff0c;或者是在评论区留言&#xff0c;侵权立删&#xff0…

DeepMind提出强化学习新方法,可实现人机合作

来源&#xff1a;AI前线作者&#xff1a;Ben Dickson译者&#xff1a;盖策划&#xff1a;凌敏本文来自 BDTechTalks 网站的“AI 研究论文评论”专栏。该专栏提供人工智能最新发现的系列解读文章。尽管人工智能研究人员正力图建立能在围棋、星际争霸到 Dota 等复杂游戏中击败人类…

C++学习——类的初始化

文章目录1.类通过构造函数进行数据成员初始化2.类成员初始化方式&#xff1f;3.什么情况下必须使用列表初始化&#xff1f;4.为什么用列表初始化成员变量会快一些&#xff1f;5.派生类构造函数的执行顺序1.类通过构造函数进行数据成员初始化 一般来说&#xff0c;类中的数据成…

队列模块(Queue)

#!/usr/bin/env python # codingutf-8import Queue import time https://docs.python.org/2/library/queue.htmlQueue模块在Python 3中改名为queue了。 Queue模块实现了多个生产者消费者列队&#xff0c;可以在多线程中进行安全的信息交换。 Queue模块定义了三个类&#xff1a;…

C++学习——构造函数,析构函数与虚函数关系

文章目录1.构造函数&#xff0c;析构函数可以为虚函数吗&#xff1f;2.析构函数和构造函数的作用&#xff1f;3.构造函数和析构函数调用顺序&#xff1f;4.类什么时候会调用析构函数&#xff1f;1.构造函数&#xff0c;析构函数可以为虚函数吗&#xff1f; 构造函数不可以&…