Отсканированное значение (с помощью сканера) в текстовом поле

Я использую Scanner (базовая модель) для сканирования штрих-кода. Отсканированный штрих-код будет записан в текстовое поле. В событии txtBarcode_TextChanged я получаю штрих-код для доступа.

Проблема:

Если я нажал на сканер более одного раза, штрих-код добавится к предыдущему значению.

код:

 protected void txtBarcode_TextChanged(object sender, EventArgs e)
    {
        string txt = this.txtBarcode.Text;
        this.txtBarcode.Text = string.Empty;
    }

Ответ 1

Вещь со сканерами штрих-кодов заключается в том, что они обычно представляют собой стандартную HID-клавиатуру. Поэтому каждый новый проверенный код фактически "набирается" после предыдущего. Решение, которое я использовал в прошлом, - это посмотреть, сколько времени проходит между нажатиями клавиш в этом текстовом поле. Если это более 10 миллисекунд (или вокруг этого значения, я считаю, что это был самый большой промежуток времени для сканера, который я использовал для "ввода" всего кода), тогда это новый штрих-код, и вы должны удалить все до него.

У меня нет IDE для передачи, поэтому большинство имен классов/методов, вероятно, отключены, но что-то вроде примера:

DateTime lastKeyPress = DateTime.Now;

void txtBarcode_KeyPress(object sender, KeyPressEventArgs args)
{

   if(((TimeSpan) (DateTime.Now - lastKeyPress)).TotalMilliseconds > 10)
   {
     txtBarcode.Text = "";      
   }
   lastKeyPress = DateTime.Now;
}

Я думаю, что это нужно делать. Он работает, потому что событие KeyPress происходит до добавления символа, поэтому вы можете сначала очистить текстовое поле.

Изменить. Чтобы настроить, я думаю, что везде, где у вас есть txtBarcode.TextChanged += txtBarcode_TextChanged, вместо этого у вас есть txtBarcode.KeyPress += txtBarcode_KeyPress. Проверьте, правильно ли указано имя события.

Изменить 2:


Версия jQuery:

Предполагая этот HTML (поскольку вы используете ASP, ваш исходный код для входного тега будет выглядеть по-другому, но на выходе все равно будет атрибут id, который действительно является единственным):

   <form action="" method="post">
        <input type="text" name="txtBarcode" id="txtBarcode" />
    </form>

Затем этот javascript работает:

$(document).ready(function() {

   var timestamp = new Date().getTime();

   $("#txtBarcode").keypress(function(event)
   {
        var currentTimestamp = new Date().getTime();

        if(currentTimestamp - timestamp > 50)
        {
            $(this).val("");
        }
        timestamp = currentTimestamp;
   });                                

});

Кажется, что (по крайней мере, в веб-браузере) 50 миллисекунд - это необходимое время, чтобы позволить между символами. Я тестировал это в Firefox, Chrome и IE7.

Ответ 2

попробуйте изменить обработчик событий TextChanged в виде этого:

txtBarcode.SelectionStart = 0;  
txtBarcode.SelectionLength = txtBarcode.Text.Length;


Он выберет текст в текстовом поле после прочтения кода и перепишет его на другом чтении. + он будет более подходящим для пользователей, чтобы скопировать его или изменить вручную

Ответ 3

Большинство сканеров могут быть запрограммированы на "нажмите enter" после сканирования, проверьте ваше руководство пользователя. Вы можете использовать обработчик события Keypress или Keydown для проверки клавиши "enter" и использовать его как разделитель для вашего штрих-кода. Вы также можете использовать специальный разделительный символ, если хотите.

 private void txtScan_KeyDown(object sender, KeyRoutedEventArgs e)
        {
            if (e.Key == Windows.System.VirtualKey.Enter)
            {
               //Do something here...

                txtScan.Text = "";
                txtScan.Focus(FocusState.Programmatic);
                e.Handled = true;  //keeps event from bubbling to next handler
            }
        }

Ответ 4

<html>

<body>
  <script>
    var _lastRead = new Date();

    function Validate(control) {
      var _now = new Date();
      if ((_now - _lastRead) > 10) {
        control.value = "";
      }
      _lastRead = new Date();
    }
  </script>
  <input type="text" id="txtInput" onkeypress="Validate(this);" />
</body>

</html>

Ответ 5

Если вы назначаете txtBarcode.value += barcode, измените его на txtBarcode.value = barcode