Текстовое поле: событие TextChanged — автоматическая проверка при вводе x символов

#c# #textbox #textchanged

#c# #текстовое поле #textchanged

Вопрос:

У меня есть приложение, которое считывает штрих-код со сканера USB. Я хочу выполнить поиск в базе данных, как только штрих-код будет введен в конкретное текстовое поле.

Очевидно, что я собираюсь поместить свой код в обработчик события TextChanged, но у меня небольшая проблема в том, что считываемый штрих-код может состоять из 41 или 43 символов. Вопрос в том, как я узнаю, какой тип кода вводится. Сканер просто вводит код в любое поле с фокусом в виде строки символов — как если бы он был введен с клавиатуры — поэтому я не могу запросить сканер для определения длины кода.

До сих пор я думал о двух подходах:

  • Определить первый символ, подождать x.x секунд, а затем выполнить мой поиск — дать достаточно времени для ввода полного кода
  • Обнаруживаю 41-й символ, жду 0.x секунд, а затем выполняю поиск.

Хорошо, я уверен, что это будет работать нормально, но есть ли какие-либо более красноречивые решения?

ЗАКЛЮЧЕНИЕ:

Однако, некоторые полезные предложения Ondrej вдохновили меня на самое простое решение для моего сценария. 43 кода символа содержат два символа, которые являются фиксированными для всех кодов — наличие (или отсутствие) этих двух символов означает, что я знаю, что нужно подождать, если эти два символа присутствуют, но присутствует только 41 символ.

Мне просто нужно подтвердить свое подозрение, что коды из 41 символа не могут содержать эту пару символов в этой конкретной позиции, в чем я совершенно уверен.

Ответ №1:

Одним из вариантов является выполнение асинхронного поиска после считывания 41-го символа, все еще ожидая еще двух символов в потоке пользовательского интерфейса. Если вы получаете совпадение по этому штрих-коду, вы можете прекратить ожидание и показать этот результат. В качестве альтернативы, если во время выполнения поиска введен 42-й символ, вы можете прервать его и немедленно начать новый поиск при вводе 43-го символа. Однако предполагается, что ни один 43-символьный штрих-код не начинается с существующего 41-символьного штрих-кода.

Я бы также посмотрел, содержат ли штрих-коды какой-либо шаблон (например: коды с 41 символом имеют X в качестве 9-го символа, а коды с 43 символами — нет), и проверил бы это при вводе.

Комментарии:

1. Ваше второе предложение, безусловно, самое простое — я не могу поверить, что не подумал об этом раньше. 43-символьный код на самом деле состоит из двух символов, которые не меняются.

Ответ №2:

У вас мог бы быть таймер, и, пока никаких изменений не произошло, скажем, в течение 1 секунды, чтобы затем выполнить поиск, если он должен быть длиной 41 или 43 символа.

Ответ №3:

Я бы перенес вызов поиска в базе данных в фоновый рабочий класс.
В обработчике событий TextChanged первое, что я бы сделал, это если backgroundworker работает, я бы отменил его. Затем, если длина текста равна 41 или 43, я бы обработал вызов DB в backgroundworker.

Таким образом, если пользователь набирает 41 символ, происходит вызов, если он вводит 42-й символ, вызов отменяется, однако, если он вводит 43, затем удалите два символа (чтобы вернуться к 41 символу), вы все равно будете выполнять правильный поиск.