VB.NET中TextChanged事件如何获取完整21位条码后再执行代码?
VB.NET 21位条码扫描完整获取解决方案
问题根源
你用TextChanged事件的问题在于每输入一个字符就会触发一次事件,如果后续逻辑里有修改文本框内容(比如清空)的操作,就会打断后续字符的输入;即便没有,也会在输入过程中多次触发判断,无法等到完整21位输入完成再执行代码。
下面给两种可行的解决办法:
方案1:利用扫描器的回车结束符(推荐)
绝大多数条码扫描器默认会在扫描完成后自动发送一个回车符,我们可以监听这个结束信号,再验证条码长度:
- 替换原
TextChanged事件,改用KeyDown事件监听回车:
Private Sub number_KeyDown(sender As Object, e As KeyEventArgs) Handles number.KeyDown If e.KeyCode = Keys.Enter Then ' 去掉回车/换行符,避免长度统计包含控制字符 Dim barcode As String = number.Text.TrimEnd(ControlChars.Cr, ControlChars.Lf) If barcode.Length = 21 Then Dim Value As String = barcode ' 这里写你展示相关数据的逻辑 ' 示例:ShowRelatedData(Value) ' 清空文本框,准备下一次扫描 number.Clear() End If ' 阻止回车符在文本框显示 e.SuppressKeyPress = True End If End Sub
- 如果扫描器没发送回车:
打开扫描器的设置手册,找到“后缀字符”选项,开启“添加回车”即可,这是最稳定的方式。
方案2:用定时器判断输入间隔(无扫描器设置权限时用)
扫描器输入字符的间隔极短(通常小于100ms),手动输入间隔则长得多。我们可以用定时器监控,当输入停止超过设定时间(比如200ms),再检查条码长度:
- 在窗体上添加一个
Timer控件(命名为tmrBarcode),设置Interval为200,Enabled为False。 - 编写以下代码:
Private Sub number_TextChanged(sender As Object, e As EventArgs) Handles number.TextChanged ' 每次输入字符时重启定时器 tmrBarcode.Stop() tmrBarcode.Start() End Sub Private Sub tmrBarcode_Tick(sender As Object, e As EventArgs) Handles tmrBarcode.Tick tmrBarcode.Stop() Dim barcode As String = number.Text.Trim() If barcode.Length = 21 Then Dim Value As String = barcode ' 执行展示数据的逻辑 ' ShowRelatedData(Value) number.Clear() End If End Sub
提示:可以根据实际扫描速度调整
Interval的值,确保能覆盖扫描器输入所有字符的时间。
内容的提问来源于stack exchange,提问作者Rishi Lakshman
相关产品推荐
相关产品推荐

