Отсканированное значение (с использованием сканера) в текстовом поле - PullRequest
11 голосов
/ 24 мая 2010

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

Проблема:

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

Код:

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

Ответы [ 5 ]

9 голосов
/ 24 мая 2010

Особенность сканеров штрих-кода в том, что они обычно выглядят как стандартная клавиатура 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 голосов
/ 31 января 2017

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

 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
            }
        }
2 голосов
/ 24 мая 2010

попробуйте изменить обработчик события TextChanged следующим образом:

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


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

0 голосов
/ 08 июля 2019

<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>
0 голосов
/ 24 мая 2010

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

...