加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

VB.NET Combobox – 数值的自动完成行为

发布时间:2020-12-17 00:22:44 所属栏目:大数据 来源:网络整理
导读:我在VB.NET(使用.NET framework 2.0)中组合框的自动完成行为有问题. 我使用组合框输入数值,并使用DropDown列表建议可能的数值.该列表按升序排序,例如{“10”,“92”,“9000”,“9001”}. 组合框属性设置如下: AutoCompleteMode:SuggestAppend AutoComplete
我在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”,“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.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读