#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 символу), вы все равно будете выполнять правильный поиск.