VB.NET Combobox - поведение автозаполнения для числовых значений - PullRequest
7 голосов
/ 22 февраля 2012

У меня проблема с автоматическим заполнением списков в VB.NET (с .NET Framework 2.0).

Я использую комбинированный список для ввода числовых значенийи его список DropDown, предлагающий возможные числовые значения.Этот список отсортирован в порядке возрастания, например {"10", "92", "9000", "9001"}.

Свойства комбинированного списка установлены следующим образом:

  • AutoCompleteMode: SuggestAppend
  • AutoCompleteSource: ListItems
  • DropDownStyle: DropDown
  • Sorted: False

Список DropDown просто заполняется так:

  • myCombobox.Items.Add ("10")
  • myCombobox.Items.Add ("92")
  • myCombobox.Items.Add ("9000")
  • myCombobox.Items.Add ("9001")

Когда я ничего не набираю, порядок значений в списке DropDown правильный, в исходном / восходящем порядке.Однако, когда я начинаю что-то печатать, предлагаемые значения в списке DropDown сортируются (в алфавитно-цифровом формате): если я набираю «9», список предложений становится {«9000», «9001», «92»}.

Я бы хотел, чтобы это поведение не получало значения списка в исходном / возрастающем порядке.Я не могу понять, как ...

Возможный обходной путь - заполнить нулями значения в списке, например, {"0010", "0092", "9000", "9001"} но я бы хотел этого избежать.

Редактировать:

Как предлагает bendataclear, можно использовать список для отображения предложений.Это будет работать для небольших списков, но не подходит для больших списков.Это может быть полезно для некоторых приложений.Основываясь на коде, заданном bendataclear, я заставил его работать следующим образом:

Private Sub ComboBox1_KeyUp(sender As System.Object, e As System.Windows.Forms.KeyEventArgs) Handles ComboBox1.KeyUp</p> <pre><code> Dim cursorPos As Integer = ComboBox1.SelectionStart ListBox1.Items.Clear() For Each s In ComboBox1.Items If s.StartsWith(ComboBox1.Text) Then ListBox1.Items.Add(s) End If Next If ListBox1.Items.Count > 0 And ComboBox1.Text.Length > 0 Then ComboBox1.Text = ListBox1.Items(0) ComboBox1.SelectionStart = cursorPos ComboBox1.SelectionLength = 0 End If End Sub

Код не был тщательно протестирован и может быть улучшен, но основная идея есть.

Редактировать 2:

Использование DataGridView приводит к повышению производительности;это было достаточно для меня.Спасибо bendataclear.

Просто из любопытства приветствуется любой другой ответ:)

1 Ответ

3 голосов
/ 30 марта 2012

Кажется, что проблема, когда в комбинированном окне отображаются данные, даже если вы задаете пользовательский источник, он переупорядочивает в алфавитном порядке:

ComboBox1.Items.Add("10")
ComboBox1.Items.Add("92")
ComboBox1.Items.Add("9000")
ComboBox1.Items.Add("9001")

ComboBox1.AutoCompleteCustomSource.Add("10")
ComboBox1.AutoCompleteCustomSource.Add("92")
ComboBox1.AutoCompleteCustomSource.Add("9000")
ComboBox1.AutoCompleteCustomSource.Add("9001")

ComboBox1.AutoCompleteSource = AutoCompleteSource.CustomSource

Я думаю, что единственный способ, о котором я могу думать, - этосоздайте свой собственный автозаполнение что-то вроде (не проверено):

Dim cbotxt As String = ComboBox1.Text
Dim key As String

key = ChrW(e.KeyCode)


ListBox1.Items.Clear()

For Each i In ComboBox1.Items

    Dim s As String = i.ToString()

    If s.StartsWith(ComboBox1.Text & key) Then

        ListBox1.Items.Add(s)


    End If

Next

If ListBox1.Items.Count > 0 Then
    ListBox1.Visible = True
    ComboBox1.Text = ListBox1.Items(0)

End If

Редактировать:

Хороший подход для многих элементов (я использую для приложения 10000+ в приложении):

Сначала перейдите из списка в сетку данных.Затем объявите список строк и заполните значениями, которые вы хотите автозаполнить

 Dim Numberlist as List<Of String>

' Fill List using Numberlist.Add("String")

Затем в свойстве изменения текста:

Filter = NumberList.FindAll(AddressOf checkNum)

DataGridView1.DataSource = Filter

И добавьте функцию для проверки строк.

Function checkNum(ByVal b As String) As Boolean

    If b.StartsWith(ComboBox1.Text) Then
        Return True
    Else
        Return False
    End If

End Function

Этот метод работает на моей машине с 10k элементов быстрее, чем я могу набрать.

...