2011-01-06 1 views
0

У меня есть сканер штрих-кода, который считывает строку штрих-кода и отображается в активном текстовом поле. Проблема, с которой я сталкиваюсь, заключается в том, что мне нужен этот штрих-код, который будет использоваться, как только его сканируется (без кнопки «ok»).проблема со значением считывания сканера штрих-кода в текстовое поле

Когда я выполняю событие Text Changed, он запускается, как только первый символ штрих-кода вводится в текстовое поле. (т. е. если штрих-код 123r54122, он запускается с «1» в текстовом поле).

Не существует постоянного символа конца штрих-кода или стандартной длины. Итак, как я мог бы запустить метод, когда была прочитана строка WHOLE?

ответ

4

Вы можете проверить длину текста (я думаю, что он является постоянным для штрих-кодов). . подпишитесь на событие TextChange и, если длина текста = barCodeLength, поднимите Scanned event.

Если штрих-код имеет переменную длину, вы можете попробовать что-то вроде этого: 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(); 
} 
+0

эти пользовательские штрихкоды, поэтому никакого набора длины – MichaelMcCabe

+0

Тогда вы должны 1) ждать некоторого пользовательского характера от считывателя штрих-кодов (например, строки) 2) ждать некоторого события от считывателя штрих-кода 3) определяют некоторый тайм-аут для нового персонажа появление и увеличение отсканированного события, если истек тайм-аут, но новые символы не добавлены. Например. запускать таймер после получения события с измененным текстом, сохранять текущее время и время, проверяя, был ли текст изменен. –

+0

Отлично. Прекрасно работает! – MichaelMcCabe

0

Не сканирует ли сканер сигнал о его завершении, считывая информацию? Конечно, если бы он не имел стандартной длины конечного символа. В любом случае, вы должны прочитать значение в памяти, а затем установить текст текстового поля сразу, а не вставлять каждый символ по мере его получения.

Редактировать; Если вы пишете информацию в текстовое поле по мере ее получения, то вызов события текстового поля ... зачем писать его в текстовое поле? Просто вызовите событие, когда вы определили, что это полный штрих-код напрямую.

+0

Его стороннее приложение, которое берет то, что сканируется, и вводит его в любое текстовое поле. Насколько я знаю, я не контролирую его (зная, когда он закончил и т. Д.) – MichaelMcCabe

+0

Вы могли бы создать таймер, чтобы ждать, пока не прекратятся данные. Только осуществимый способ, о котором я могу думать, если нет установленного предела, никакого конечного символа и никакого конечного сигнала. Хотя и немного «взломанный» – Rob

+0

Да. Я думаю, что мне придется делать идею таймера – MichaelMcCabe

1

Сканеры штрих-кода Я работал с добавлением новой строки (возврат/ввод) до конца строки штрих-кода. Установите текстовое поле, чтобы принять возвращение (AcceptReturn к истинным), а затем сделать что-то вроде

private void textBox1_KeyPress(object sender, KeyPressEventArgs e) 
{ 
    if (e.KeyChar == (char)Keys.Return) 
     doSomething(); 
} 
+0

Я пробовал это, но не обнаружил возврата. Мне нужно сделать таймер. Думаю, – MichaelMcCabe

+0

Это странно. Вы проанализировали строку? – dandan78

1

только сканер штрих-кода я использовал (модель USB от Lindy) может добавить возврат или нет в зависимости от того, как он настроен. Переключение между режимами достигается путем сканирования специального кода контрольной панели, напечатанного на листе, прилагаемом к сканеру.

Я не знаком с C#, но на Java вы можете прослушивать ActionEvent вместо TextEvent, чтобы обнаруживать, когда нажата кнопка возврата, а не символ, который набирается. Это было бы более простой альтернативой предложению dandan78, если оно доступно на C#.