gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 12:42:42 26 4
gpt4 key购买 nike

我对 VB.NET 中组合框的自动完成行为有问题(使用 .NET 框架 2.0)。

我使用组合框输入数值,并使用它的下拉列表来建议可能的数值。此列表按升序排序,例如 {"10","92", "9000", "9001"}。

组合框属性设置如下:

  • 自动完成模式:SuggestAppend
  • 自动完成源:列表项
  • 下拉样式:下拉
  • 排序: 错误

  • DropDown 列表的填充方式如下:
  • myCombobox.Items.Add("10")
  • myCombobox.Items.Add("92")
  • myCombobox.Items.Add("9000")
  • myCombobox.Items.Add("9001")

  • 当我不输入任何内容时,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+):

    首先从列表框更改为数据网格 View 。
    然后声明一个字符串列表并填充要自动完成的值
     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 个项目。

    关于VB.NET Combobox - 数值的自动完成行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9386215/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com