Violazione di accesso su modifica AutoComplete List

Su TextBox e ComboBox è possibile gestire l’Auto Complete a partire dal FrameWork 2.0,  mediante la proprietà AutoCompleteSource è possibile gestire anche una Custom AutoCompleteSource basata su una AutoCompleteStringCollection.

Occorre però tenere presente che la modifica della AutoCompleteCustomSource in determinate situazioni può causare un’eccezione di violazione di accesso descritta nella KB 952544 – Access Violation when modifying the AutoComplete list of ComboBox or Edit box:

“The control is in the middle of showing the AutoComplete list when at the same time it is being modified, resulting in the crash.
The underlying AutoComplete implementation does not allow for changing the AutoComplete candidate list object once it has been set on a window.  To allow changing the list, WinForms destroys the Edit control or ComboBox and recreates it.  This causes an exception if the underlying control is destroyed while the AutoComplete window is still use it.”

Per risolvere il problema occorre evitare la modifica dell’Autocomplete durante la modifica del testo del controllo che sta visualizzando l’AutoComplete:

“Do not modify the AutoComplete candidate list dynamically during key events.”

Sebbene si trovino talvolta soluzioni a questo problema in vari post su forum, occorre tenere presente che il problema può presentarsi o meno in base al sistema su cui si opera in relazioni alla velocità di risposta dell’interfaccia grafica e quindi alla successione degli eventi di modifica e di refresh dell’Autocomplete. Di conseguenza l’approccio corretto è quello di riempire una volta sola AutoComplete list con tutti i valori necessari prima che il controllo venga editato, oppure riempire l’AutoComplete list solo quando si è certi che controllo non è editato.

A riguardo si vedano i seguenti post: