2010-02-01 2 views
5

Я работаю в C# с текстовым полем, который действует как вход для поиска записей в базе данных (Access SQL) по номеру id. Я хочу иметь возможность использовать AutoComplete в текстовом поле, но с некоторыми ограничениями.C# Текстовое поле Автозаполнение: ограничение до ~ 50 предложений

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

В настоящее время я делаю этот запрос на каждом KeyDown: SELECT COUNT (*) FROM Таблица WHERE ID LIKE 'TextBox.Text%'

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

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

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

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

EDIT: это Windows Forms

edit2: Верхняя 50 выбрать не решает проблему, так как пользователь (и потенциально забоя и повторно типов) верх 50 будет меняться.

+1

Это WinForms? WPF? ASP.NET? – LBushkin

ответ

1

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

+0

Спасибо, это действительно работало. Часть моей проблемы также вызывала Clear() в AutoCompleteCustomSet при каждом нажатии клавиши. По-видимому, это действительно не нужно, и у этого были отрицательные побочные эффекты. – Rich

0

Не можете ли вы просто выбрать TOP 50 FROM Table WHERE ...?

0

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

ВЫБРАТЬ TOP 50 * FROM YourTable WHERE .....

0

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

Перед Windows Vista объект Autocomplete match candidates with prefix only, поэтому не заполняйте строки-кандидаты, не начинающиеся с типизированной строки.

Use IAutoCompleteDropDown::ResetEnumerator to reset the candidate list.