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