20190626_二次开发BarTender打印机_C#代码_一边读取TID_一边打印_打印机POSTEK
阅读原文时间:2023年07月11日阅读:2

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属性:标示是马上用打印机打印出实物,还是生成一个打印文件。  
        \*/  
    }

手机扫一扫

移动阅读更方便

阿里云服务器
腾讯云服务器
七牛云服务器