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