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

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

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

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

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

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

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

Когда я ничего не набираю, порядок значений в раскрывающемся списке правильный: исходный / возрастающий. Однако, когда я начинаю что-то вводить, предлагаемые значения в списке 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

    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.

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

7
задан DevelBD 7 June 2013 в 14:49
поделиться