我使用组合框输入数值,并使用DropDown列表建议可能的数值.该列表按升序排序,例如{“10”,“92”,“9000”,“9001”}.
组合框属性设置如下:
> AutoCompleteMode:SuggestAppend
> AutoCompleteSource:ListItems
> DropDownStyle:DropDown
>排序:错误
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”,“9001”}但我想避免这种情况.
编辑:
正如bendataclear所建议的那样,可以使用列表框来显示建议.
这适用于小型列表,但不能很好地扩展到大型列表.它可能对某些应用程序有用.根据bendataclear给出的代码,我以这种方式工作:
Private Sub ComboBox1_KeyUp(sender As System.Object,e As System.Windows.Forms.KeyEventArgs)处理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.
出于好奇,欢迎任何其他答案:)
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):
首先从列表框更改为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.