VB.NET комбобокс - автозаполнение поведение для числовых значений

у меня проблема с автозаполнением поведения comboboxes в VB.NET (с .NET framework 2.0).

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

свойства combobox устанавливаются следующим образом:

  • AutoCompleteMode: SuggestAppend
  • AutoCompleteSource: ListItems
  • DropDownStyle: DropDown
  • Сортировано: False

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

  • myCombobox.Предметы.Добавить("10")
  • myCombobox.Предметы.Добавить("92")
  • myCombobox.Предметы.Добавить("9000")
  • myCombobox.Предметы.Добавить("9001")

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

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

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

Edit:

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

Private Sub ComboBox1_KeyUp(sender As System.Object, e As System.Windows.Forms.KeyEventArgs) Handles ComboBox1.KeyUp

    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

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

Edit 2:

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

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

1 ответов


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

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

Edit:

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

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

 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 быстрее, чем я могу ввести.