Я создал элемент управления со списком Winforms AutoComplete, унаследованный от ComboBox, следующим методом:
Protected Overrides Sub OnKeyPress(ByVal e As System.Windows.Forms.KeyPressEventArgs)
MyBase.OnKeyPress(e)
Dim text As String = Me.Text
If Char.IsLetter(e.KeyChar) Then
text = text + e.KeyChar
End If
If (text.Length = AutoCompleteSearchChars And Char.IsLetter(e.KeyChar)) Then
SetAutoCompleteMethod.Invoke(text)
Me.AutoCompleteSource = AutoCompleteSource.ListItems
Me.Text = text
Me.SelectionStart = text.Length
Me.SelectionLength = 0
If Me.Items.Count > 0 Then
Me.SelectedIndex = 0
End If
e.Handled = True
End If
End Sub
«SetAutoCompleteMethod» - это делегат, указывающий на метод, который заполняет
элементы комбинированного списка, основанные на использовании текущего текста в поле со списком в качестве префикса для
поиск по шаблону. Это обеспечивает функциональность, аналогичную списку ajax autocomplete.
Все работает нормально при первом вызове, но при втором вызове появляется сообщение «Попытка чтения или записи в защищенную память. Это часто указывает на то, что другая память повреждена» Ошибка появляется после того, как весь код для обновления выпадающего списка завершен. Я получаю следующую трассировку стека:
в
System.Windows.Forms.UnsafeNativeMethods.DispatchMessageW (MSG &
сообщение) в
System.Windows.Forms.Application.ComponentManager.System.Windows.Forms.
UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop (Int32
dwComponentID, причина Int32, Int32
pvLoopData) в
System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner (Int32
причина, контекст ApplicationContext)
в
System.Windows.Forms.Application.ThreadContext.RunMessageLoop (Int32
причина, контекст ApplicationContext)
в
System.Windows.Forms.Application.Run (ApplicationContext
контекст) в
Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase.OnRun ()
в
Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase.DoApplicationModel ()
в
Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase.Run (String []
commandLine) в
ApplicationShell.My.MyApplication.Main (String []
Аргс) в
17d14f5c-a337-4978-8281-53493378c1071.vb: линия
81 в
System.AppDomain._nExecuteAssembly (Собрание
сборка, строка [] args) в
System.AppDomain.ExecuteAssembly (String
AssemblyFile, Доказательства
AssemblySecurity, String [] args) в
Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly ()
в
System.Threading.ThreadHelper.ThreadStart_Context (Объект
состояние) в
System.Threading.ExecutionContext.Run (ExecutionContext
executeContext, ContextCallback
обратный вызов, состояние объекта) в
System.Threading.ThreadHelper.ThreadStart ()
Кто-нибудь может указать мне правильное направление, чтобы решить эту проблему?