VB.NET Combobox – 数值的自动完成行为
我在VB.NET(使用.NET framework 2.0)中组合框的自动完成行为有问题.
我使用组合框输入数值,并使用DropDown列表建议可能的数值.该列表按升序排序,例如{“10”,“92”,“9000”,“9001”}. 组合框属性设置如下: > AutoCompleteMode:SuggestAppend DropDown列表就像这样填充: > myCombobox.Items.Add(“10”) 当我没有输入任何内容时,DropDown列表的值的顺序是正确的,原始/升序.但是,当我开始输入内容时,DropDown列表中的建议值会被排序(按字母顺序排列):如果我输入“9”,建议列表将变为{“9000”,“9001”,“92”}. 我想阻止此行为以原始/升序获取列表的值.我弄不清楚怎么样…… 可能的解决方法是用零填充列表中的值,例如,{“0010”,“0092”,“9001”}但我想避免这种情况. 编辑: 正如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. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |