VB.NET组合框

VB.NET中的组合框的自动完成行为存在问题(使用.NET Framework 2.0)。

我使用组合框键入数字值,并使用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”,“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

    下一篇: IntelliJ's IDEA and Eclipse on the same project