条码扫描至ListBox时重复校验异常问题求助
条码扫描重复添加问题的排查与解决
问题分析
你遇到的这个情况确实有点反常:连续扫两次同一条码都会被加到列表框里,直到第三次才弹出重复提示。结合你贴的代码,我来拆解下可能的原因和修复方案。
核心原因猜测
未拦截Enter键的默认行为
你的txtWO_KeyDown事件里没取消Enter键的系统默认操作。扫描器自动发送Enter触发事件后,系统还会继续执行Enter的默认逻辑(比如焦点转移、文本框的原生输入处理),这可能导致你调用txtWO.Clear()之后,文本框内容又被意外恢复,或者扫描器的输入被重复处理,让同一条码能连续添加两次。条码带不可见字符
很多扫描器会在条码末尾附加回车、换行或空格这类肉眼看不到的字符,导致两次扫描的字符串看似相同,实际内容有差异(比如第一次是"ABC123",第二次是"ABC123\r")。前两次因为细微差异被判定为不同内容,直到第三次扫描的字符完全一致,才会触发重复提示。
修复方案
1. 拦截Enter键的默认行为
在处理完条码添加逻辑后,加上两行代码取消默认行为,避免系统后续干扰:
Private Sub txtWO_KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles txtWO.KeyDown If e.KeyCode = Keys.Enter Then ' 先去除条码前后空白,规避不可见字符影响 Dim barcode As String = txtWO.Text.Trim() AddUnique(barcode) txtWO.Clear() txtWO.Focus() ' 关键:取消Enter键的系统默认行为 e.Handled = True e.SuppressKeyPress = True End If End Sub
2. 标准化条码字符串
对获取到的条码做统一处理,比如去空白、转大写,避免扫描器输出的格式差异导致误判:
' 修改KeyDown事件里的条码获取逻辑 Dim barcode As String = txtWO.Text.Trim().ToUpperInvariant()
3. 加调试日志排查细节
如果还是不确定问题,可在AddUnique里加调试输出,查看每次添加的字符串实际内容和长度,确认是否有隐藏字符:
Private Sub AddUnique(StringToAdd As String) ' 输出到调试窗口,查看字符串细节 Debug.WriteLine($"尝试添加的条码:""{StringToAdd}"",长度:{StringToAdd.Length}") If lstScanBom.Items.Contains(StringToAdd) Then MsgBox("Articol duplicat!", vbOKOnly) Else lstScanBom.Items.Add(StringToAdd) Debug.WriteLine("条码添加成功!") End If End Sub
验证效果
按上面的修改测试后,连续扫同一条码:
- 第一次:条码正常添加到列表
- 第二次:立即弹出重复提示
- 第三次:同样触发重复提示
这样就能解决你遇到的问题了。
内容的提问来源于stack exchange,提问作者Catalin Cernat
相关产品推荐
相关产品推荐

