C# 使用Zebra DS3608扫描枪实现条码录入textbox的问题咨询
问题根源
该问题是代码逻辑问题,和扫描枪配置无关,两个核心错误导致异常:
- 你在构造函数中将
BarcodeScanner声明为局部变量,构造函数执行完成后该实例会被垃圾回收,扫描事件绑定直接失效。 - 窗体初始化阶段调用
textBox1.Focus()无效,此时窗体还未完成渲染,焦点会被后续加载的ComboBox控件抢走,而Zebra DS3608默认是模拟键盘输入,内容自然会输入到当前持有焦点的ComboBox中。
修复步骤
1. 将扫描器实例改为类全局成员
在PrintLabel类中声明全局的扫描器变量,避免实例被回收:
public partial class PrintLabel : Form { MySqlConnection connection; MySqlCommand command; MySqlDataReader dr; // 新增全局扫描器实例 private BarcodeScanner _barcodeScanner;
2. 调整构造函数逻辑,删除无效焦点设置
public PrintLabel() { InitializeComponent(); // 移除这里的Focus,此时窗体未渲染,设置无效 _barcodeScanner = new BarcodeScanner(textBox1, true); // 第二个参数传true,拦截扫描输入不发送到焦点控件 _barcodeScanner.BarcodeScanned += BarcodeScanner_BarcodeScanned; Fillcombox(); }
这里构造函数的第二个参数suppressKeyPress = true是USB_Barcode_Scanner库内置参数,开启后会拦截扫描枪的键盘输入事件,不会把内容输入到当前焦点控件,只会通过事件返回扫描结果。
3. 新增窗体Shown事件设置焦点
在窗体设计器中给PrintLabel绑定Shown事件,在窗体完全渲染完成后再设置文本框焦点:
private void PrintLabel_Shown(object sender, EventArgs e) { textBox1.Focus(); }
验证方法
可以先在扫描回调事件中加弹窗测试,确认事件是否正常触发:
private void BarcodeScanner_BarcodeScanned(object sender, BarcodeScannerEventArgs e) { // 测试用,扫描时会弹出结果说明事件绑定正常 // MessageBox.Show(e.Barcode); textBox1.Text = e.Barcode; }
如果弹窗正常弹出,说明修复完成,删除测试弹窗即可。
内容的提问来源于stack exchange,提问作者Prochu1991
相关产品推荐
相关产品推荐

