C# POS系统Enter键触发查询方法重复调用问题及需求
解决POS系统中手动输入条码时
read_scanner重复调用的问题 我一眼就看出问题所在了——当你在txtbarcode中手动输入条码并按下Enter时,两个事件都捕获到了Enter键:ProcessCmdKey(全局键盘处理方法)和txtbarcode_KeyDown(TextBox的按键事件),所以read_scanner被调用了两次。
核心原因
当TextBox获得焦点时,按下Enter键会先被ProcessCmdKey捕获并执行一次查询,随后txtbarcode_KeyDown事件也会触发并再次调用read_scanner,最终导致重复执行。
解决方案
我们需要区分两种输入场景,让逻辑互不干扰:
- 焦点不在
txtbarcode时:由ProcessCmdKey处理扫描枪的条码输入 - 焦点在
txtbarcode时:跳过ProcessCmdKey的条码处理逻辑,交给TextBox的KeyDown事件处理手动输入
修改你的ProcessCmdKey方法,添加焦点判断:
private string _barcode = ""; protected override bool ProcessCmdKey(ref Message msg, Keys keyData)//read when no focus { // 如果当前焦点在txtbarcode上,跳过条码处理逻辑,让TextBox自己处理输入 if (ActiveControl == txtbarcode) { return base.ProcessCmdKey(ref msg, keyData); } char c = (char)keyData; if (char.IsNumber(c)) _barcode += c; if (c == (char)Keys.Return) { read_scanner(_barcode); _barcode = ""; } return base.ProcessCmdKey(ref msg, keyData); }
另外,我还注意到你把Product product定义成了类级变量,这可能导致后续查询出现逻辑错误(比如第一次查询到产品,第二次查询无效条码时,product还是之前的实例)。建议把它移到read_scanner方法内部:
public void read_scanner(string barcode)//this method is getting invoked twice when i search product manually { // 把product变量移到方法内部,避免残留旧数据 Product product = HibernateDao.getRecord("from Product u where u.barcode='"+barcode+"'"); if (product != null) { pos_datagrid.Rows.Add(barcode, product.product_name, product.product_desc, null, "1", null, product.product_Cost); } else { AppUtil.showErrorBox("Invalid bar code!!"); } }
验证效果
- 扫描枪输入:无论
txtbarcode是否有焦点,只要焦点不在TextBox上,ProcessCmdKey会正常捕获条码和Enter,调用一次read_scanner - 手动输入:在
txtbarcode中输入条码后按Enter,只有txtbarcode_KeyDown触发,调用一次read_scanner,不会重复
这样就完美保留了你需要的两个功能,同时解决了重复调用的问题。
内容的提问来源于stack exchange,提问作者user12019098
相关产品推荐
相关产品推荐

