我有一个条形码扫描仪,它读取条形码字符串并显示在活动文本框中。我遇到的问题是,我需要在扫描后立即使用该条形码(没有用户“确定”按钮)。
当我执行 Text Changed 事件时,一旦将条形码的第一个字符输入到文本框中,它就会触发。(即,如果条形码是 123r54122,它会在文本框中以“1”触发)。
条形码没有一致的结束字符或标准长度。那么当整个字符串被读入时,我将如何去触发一个方法呢?
我有一个条形码扫描仪,它读取条形码字符串并显示在活动文本框中。我遇到的问题是,我需要在扫描后立即使用该条形码(没有用户“确定”按钮)。
当我执行 Text Changed 事件时,一旦将条形码的第一个字符输入到文本框中,它就会触发。(即,如果条形码是 123r54122,它会在文本框中以“1”触发)。
条形码没有一致的结束字符或标准长度。那么当整个字符串被读入时,我将如何去触发一个方法呢?
您可以验证文本长度(我认为条形码是恒定的)。例如订阅 TextChange 事件,如果 text length = barCodeLength 然后引发 Scanned 事件。
如果条形码具有可变长度,您可以尝试以下操作:1)定义
private Timer _timer;
private DateTime _lastBarCodeCharReadTime;
2) 初始化定时器
_timer = new Timer();
_timer.Interval = 1000;
_timer.Tick += new EventHandler(Timer_Tick);
3) 添加处理程序
private void Timer_Tick(object sender, EventArgs e)
{
const int timeout = 1500;
if ((DateTime.Now - _lastBarCodeCharReadTime).Milliseconds < timeout)
return;
_timer.Stop();
// raise Changed event with barcode = textBox1.Text
}
4) 在 TextChanged 事件处理程序中添加这个
private void textBox1_TextChanged(object sender, EventArgs e)
{
_lastBarCodeCharReadTime = DateTime.Now;
if (!_timer.Enabled)
_timer.Start();
}
我使用过的唯一条码扫描器(Lindy 的 USB 型号)可以根据其配置方式附加或不附加返回。通过扫描打印在扫描仪随附的传单上的特殊控制条形码来实现模式之间的切换。
我不熟悉 C#,但在 Java 中,您可以侦听 ActionEvent 而不是 TextEvent 来检测何时按下返回而不是输入字符。如果它在 C# 中可用,这将是 dandan78 建议的更简单的替代方案。
我使用过的条码扫描仪在条码字符串的末尾添加了一个换行符(回车/回车)。将文本框设置为接受返回(AcceptReturn 为 true),然后执行类似的操作
private void textBox1_KeyPress(object sender, KeyPressEventArgs e)
{
if (e.KeyChar == (char)Keys.Return)
doSomething();
}
扫描仪是否没有发送信号表明它已完成读取信息?如果它没有标准长度的结束字符,它肯定会。无论如何,您应该将值读入内存,然后立即设置文本框文本,而不是在收到每个字符时插入它。
编辑; 如果您在收到信息时将信息写入文本框,然后调用文本框事件..为什么还要将其写入文本框?当您确定它是一个完整的条形码时,只需调用该事件即可