Мой клиент хотел иметь текстовое поле в форме «Клиент» приложения, которое предлагает соответствующие окончания названию улицы. Он начинает вводить название улицы, и в текстовом поле появляется список улиц, которые начинаются с последовательности символов, которую он набрал в текстовом поле.
Я сказал себе: все в порядке, у текстовых полей есть свойство AutoCompleteCustomSource, и хотя список общих названий улиц будет длиннее, чем он может быть предварительно заполнен при запуске, я мог бы просто нажать на базу данных с запросом, заполнить AutoCompleteStringCollection и показать это пользователю.
Теперь вот что: если я сделаю список заполненным при каждом нажатии / нажатии клавиши, программа вылетает и выдает AccessViolationException.
Я узнал, что это потому, что:
Элемент управления находится в середине отображения списка автозаполнения, когда он одновременно изменяется, что приводит к сбою.
При обновлении списка автозаполнения элемент управления воссоздается с новыми указателями. События клавиатуры и мыши (KeyPress, MouseOver, MouseLeave, MouseHover) пытаются сослаться на указатели старого элемента управления, которые теперь недопустимы в памяти, вызывая нарушение доступа к памяти.
Базовая реализация автозаполнения не позволяет изменять объект списка кандидатов автозаполнения после его установки в окне. Чтобы разрешить изменение списка, WinForms уничтожает элемент управления Edit или ComboBox и воссоздает его. Это вызывает исключение, если базовый элемент управления уничтожен, пока окно автозаполнения все еще использует его.
Я читал об этом на MSDN , их разрешение:
Не изменяйте список кандидатов автозаполнения динамически во время ключевых событий.
Я также пробовал все из этой темы
Так, как я мог сделать эту работу, если я настаиваю на предложении подходящих названий улиц при нажатии клавиш?
Примечание : Я знаю, что вы можете сделать это, создав пользовательский элемент управления и все такое, , но можно ли это сделать просто с помощью волшебного кода?