Автозаполнение текстового поля C #: ограничение до 50 предложений - PullRequest
5 голосов
/ 01 февраля 2010

Я работаю в C # с текстовым полем, которое действует как ввод для поиска записи базы данных (Access SQL) по номеру идентификатора. Я хочу использовать автозаполнение в текстовом поле, но с некоторыми ограничениями.

Большая проблема заключается в том, что количество идентификаторов в системе составляет порядка тысяч, поэтому вместо того, чтобы заполнять поле Автозаполнение один раз всеми из них, мне нужно отслеживать, что находится в текстовом поле, и отображать предложения автозаполнения только при Есть ~ 50 или меньше вариантов.

В настоящее время я выполняю этот запрос для каждого KeyDown: SELECT count (*) FROM Table WHERE id LIKE 'textbox.text%'

Когда счетчик меньше 50, я заполняю автозаполнение результатами из версии SELECT id вышеприведенного оператора. Это привело меня к нескольким проблемам, большинство из которых, кажется, причуды C #, я не понимаю.

1) Когда я очищаю или добавляю в AutoCompleteCustomSet в одном событии KeyDown, фактически нажатая клавиша не добавляется в строку (т. Е. Обычное поведение ввода в текстовое поле не происходит).

2) Я попытался отделить обновление AutoCompleteCustomeSet от другого события (KeyPress или KeyUp), но это либо привело к сбою, либо отображение автозаполнения отображалось только на короткое время, прежде чем его скрыть.

Я чувствую, что эта проблема должна быть распространенной, и я просто иду по ней неправильно. Кто-нибудь может дать совет? Спасибо!

РЕДАКТИРОВАТЬ: это Windows Forms

РЕДАКТИРОВАТЬ 2: Выбор 50 лучших не решает проблему, что по мере того, как пользователь вводит (и, возможно, backspace и повторно вводит), 50 лучших изменится.

Ответы [ 4 ]

1 голос
/ 01 февраля 2010

Пробовали ли вы вместо этого событие TextChanged? Я ожидаю, что это событие будет запущено ПОСЛЕ того, как текстовое поле будет обновлено, что позволит избежать упомянутых вами причуд.

0 голосов
/ 09 февраля 2010

Причиной сбоя может быть то, что вы получаете условие гонки при замене источника автозаполнения, который используется фоновым потоком для вычисления кандидатов во время набора текста (или вместо String вы ставите null.Empty в списке кандидатов)

До Windows Vista объект автозаполнения сопоставлял кандидатов только с префиксом , поэтому не заполняйте строки кандидатов, не начинающиеся с напечатанной строки.

Используйте IAutoCompleteDropDown :: ResetEnumerator для сброса списка кандидатов .

0 голосов
/ 01 февраля 2010

Будет ли ограничивать ваши предложения 50 работами для вас? При выборе предложений вы можете использовать запрос, подобный следующему:

ВЫБЕРИТЕ ТОП-50 * ОТ ВАШЕЙ ТАБЛИЦЫ ГДЕ .....

0 голосов
/ 01 февраля 2010

Разве вы не можете просто выбрать ТОП 50 из таблицы ГДЕ ...?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...