VB.NET组合框
VB.NET中的组合框的自动完成行为存在问题(使用.NET Framework 2.0)。
我使用组合框键入数字值,并使用DropDown列表来建议可能的数值。 该列表按升序排序,例如{“10”,“92”,“9000”,“9001”}。
组合框属性设置如下:
DropDown列表就是这样填充的:
当我不输入任何内容时,DropDown列表的值的顺序是正确的,按原始/升序排列。 但是,当我开始键入内容时,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。
出于好奇,欢迎任何其他答案:)
似乎是组合框显示数据时的问题,因为即使您设置了自定义源,它也会按字母顺序重新排序:
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
这种方法在我的机器上运行的速度比我输入的快10千件。
链接地址: http://www.djcxy.com/p/10465.html上一篇: VB.NET Combobox