读取扫码枪扫出的条码通常需要考虑以下问题:
1、每次使用的码应该都是最新的有效的码。
2、如果遇到跟上次一样的码,则不更新,反之则更新。
3、需要对条码进行校验。
4、如果操作人员忘记扫码,需要有机制能发现并提醒操作人。
一般读码的设计通常有两种思路:
① 条码框接收到条码之后,存储该次条码,并立即清空条码框,便于下一次接收新条码。缺点是条码在条码框中出现的时间过短,不方便观察码有没有扫上、码对不对。
② 条码框接收到条码之后,存储该次条码,并自动选中条码框文本,便于下一次接收新条码冲掉文本框中的旧条码。缺点是偶尔忘记扫条码时,可能会错用上次的条码作为当前的条码。
通常一个好的读码逻辑设计,需要同时结合这两种思路。
例如可以这样做:
1、软件启动后,立即开一个不断接收条码的线程,不断刷新接收到的条码。这里我采用的是不清空条码框,而是选中条码框文本的方式。
接收并刷新条码线程的方法如下:
1 private string code_Current = ""; 2 private string code_Last = ""; 3 4 private void RefreshBarCode() 5 { 6 while (true) 7 { 8 Thread.Sleep(3); 9 10 string code_Text = tbx_productNameCode.Text; 11 12 if (IsBarcodeValid(code_Text)) 13 { 14 code_Current = code_Text; 15 if (code_Current != code_Last) 16 { 17 code_Last = code_Current;//"上次"的条码得到更新 18 if (tbx_productNameCode.InvokeRequired) 19 { 20 BeginInvoke(new Action(() => { tbx_productNameCode.Text = code_Current; })); 21 BeginInvoke(new Action(() => tbx_productNameCode.Focus())); 22 BeginInvoke(new Action(() => tbx_productNameCode.SelectAll())); 23 } 24 else 25 { 26 tbx_productNameCode.Text = code_Current; 27 BeginInvoke(new Action(() => tbx_productNameCode.Focus())); 28 BeginInvoke(new Action(() => tbx_productNameCode.SelectAll())); 29 } 30 } 31 32 } 33 //控制扫码间隔 34 Thread.Sleep(1200); 35 } 36 }
(判断码是否有效的方法IsBarcodeValid()略。)
2、当其他地方需要使用当前条码时,可以通过GetCurrentBarCode()方法去取条码:
private string barCode = ""; barCode = GetCurrentBarCode(); //清空条码框,防止下一次重复扫入同一个码 if (tbx_productNameCode.InvokeRequired) { BeginInvoke(new Action(() => tbx_productNameCode.Text = ""));//这一点非常关键!!! BeginInvoke(new Action(() => tbx_productNameCode.Focus())); } else { tbx_productNameCode.Text = ""; tbx_productNameCode.Focus(); }
private string GetCurrentBarCode() { string code_temp = tbx_productNameCode.Text; if (IsBarcodeValid(code_temp)) { return code_temp; } else { return ""; } }
作者:xh6300
--------------------------------------------
本文系原创,转载请注明出处。
如果文章对您有帮助,可以点击下方的【好文要顶】或【关注我】;如果您想进一步表示感谢,可通过网页右侧的【打赏】功能进行打赏。
感谢您的支持,我会继续写出更多的相关文章!文章有不理解的地方欢迎跟帖交流,博主经常在线!^_^