Способ решения этой проблемы с очень большими наборами данных (полный набор информации о препарате):
1) Обработка события TextChanged комбо
2) В этом событии получитесписок предложений, которые соответствуют текущему вводу пользователя из базы данных.Мы используем возможности поиска в базе данных для поиска совпадений в любом месте строки.
3) Когда предложения найдены, свяжите их с полем со списком
4) Подождите немного (500 мс)чтобы позволить пользовательскому интерфейсу наверстать упущенное (мы используем комбинацию System.Threading.Thread.Sleep и System.Windows.Format.Application.DoEvents ()).
Несколько замечаний по этому подходу:
1) Ничто не привязано к списку при первом открытии формы
2) Мы ждем, пока пользователь введет хотя бы 4 символа, прежде чем мы начнем поиск, чтобы уменьшить попадание в БД и улучшитьпользовательский опыт (например, вы не хотите показывать все совпадения для A).
Обновление с кодом для отображения полного решения:
Вот некоторыедополнительные примечания и код, чтобы показать фактический процесс.
ComboBox должен быть настроен со всеми свойствами, установленными в их значения по умолчанию, за исключением:
AutoCompleteMode = SuggestAppend
PreferredDropDownSize = 0, 0
Вот код, который мы используем для нашей конкретной ситуации (поиск первых четырехchars) с заполнителем для извлечения и назначения данных:
Private m_fOkToUpdateAutoComplete As Boolean
Private m_sLastSearchedFor As String = ""
Private Sub cboName_KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles cboName.KeyDown
Try
' Catch up and down arrows, and don't change text box if these keys are pressed.
If e.KeyCode = Keys.Up OrElse e.KeyCode = Keys.Down Then
m_fOkToUpdateAutoComplete = False
Else
m_fOkToUpdateAutoComplete = True
End If
Catch theException As Exception
' Do something with the error
End Try
End Sub
Private Sub cboName_TextChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles cboName.TextChanged
Try
If m_fOkToUpdateAutoComplete Then
With cboName
If .Text.Length >= 4 Then
' Only do a search when the first 4 characters have changed
If Not .Text.Substring(0, 4).Equals(m_sLastSearchedFor, StringComparison.InvariantCultureIgnoreCase) Then
Dim cSuggestions As IEnumerable
Dim sError As String = ""
' Record the last 4 characters we searched for
m_sLastSearchedFor = .Text.Substring(0, 4)
' And search for those
cSuggestions = GetSomeSuggestions(m_sLastSearchedFor) ' Your code here
.DataSource = Nothing
If cSuggestions IsNot Nothing Then
' Because this can use the same data source as the list, ensure that
' the bindingcontexts are different so that the lists are not tied to each other
.BindingContext = New BindingContext
.DataSource = cSuggestions
' Let the UI process the results
System.Threading.Thread.Sleep(10)
System.Windows.Forms.Application.DoEvents()
End If
End If
Else
If Not String.IsNullOrEmpty(m_sLastSearchedFor) Then
' Clear the last searched for text
m_sLastSearchedFor = ""
cboName.DataSource = Nothing
End If
End If
End With
End If
Catch theException As Exception
' Do something with the error
End Try
End Sub