zoukankan      html  css  js  c++  java
  • 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}  中, 有这些
      {diffStr}  
    字段不被即将打印的内容识别, 
    您必须调整模板或者修改数据获取语句后才能继续");
                                Common.Contactor.ShowErrorRestart($"在您的模板文件  {FileName}  中, 有这些
      {diffStr}  
    字段不被即将打印的内容识别, 
    您必须调整模板或者修改数据获取语句后才能继续");
                                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 = "
    
    Messages:";
                                    // 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属性:标示是马上用打印机打印出实物,还是生成一个打印文件。
                */ 
            }
    

      

  • 相关阅读:
    根据经纬度获取距离
    获取本浏览器经纬度坐标
    仿造mongodb的存储方式存一些假数据
    ty修饰符 public private static
    ty 枚举类型
    限制字符串的选择
    typeScript类型别名
    ty 函数的讲解
    ty数组的讲解
    接口的讲解
  • 原文地址:https://www.cnblogs.com/wxylog/p/11093361.html
Copyright © 2011-2022 走看看