在VB.Net中搜索ListBox元素

时间:2010-11-29 17:00:01

标签: vb.net vb6 listbox filtering

我正在将应用程序从VB6迁移到VB.Net,我发现ListBox的行为发生了变化,我不确定如何使它等于VB6。

问题在于:

在VB6应用程序中,当ListBox聚焦并输入时,列表会选择与我输入的内容相匹配的元素。例如如果列表包含国家/地区列表并输入“ita”,则会在列表框中选择“意大利”。 问题是,如果输入“ita”,那么使用.Net版本的控件,它将选择以i开头的第一个元素,然后是以“t”开头的第一个元素,最后是以“a”开头的第一个元素

那么,关于如何获得原始行为的任何想法? (我在考虑某些属性,我没有因某种原因或类似的东西而看到)

我真的不想为此编写一个事件处理程序(顺便说一句,这不会是微不足道的。)

非常感谢!

3 个答案:

答案 0 :(得分:4)

我分享了Willw的挫败感。这就是我提出的。将一个名为ListBoxTypeAhead的类添加到项目中并包含此代码。然后使用此类作为表单上的控件。它捕获键盘输入并以旧VB6列表框的方式移动所选项目。如果您愿意,可以取出计时器。它模仿Windows资源管理器中键盘输入的行为。

Public Class ListBoxTypeAhead

  Inherits ListBox

  Dim Buffer As String
  Dim WithEvents Timer1 As New Timer

  Private Sub ListBoxTypeAhead_KeyDown(sender As Object, _
    e As System.Windows.Forms.KeyEventArgs) Handles Me.KeyDown

    Select Case e.KeyCode
      Case Keys.A To Keys.Z, Keys.NumPad0 To Keys.NumPad9
        e.SuppressKeyPress = True
        Buffer &= Chr(e.KeyValue)
        Me.SelectedIndex = Me.FindString(Buffer)
        Timer1.Start()
      Case Else
        Timer1.Stop()
        Buffer = ""
    End Select

  End Sub

  Private Sub ListBoxTypeAhead_LostFocus(ByVal sender As Object, _
    ByVal e As System.EventArgs) Handles Me.LostFocus

    Timer1.Stop()
    Buffer = ""

  End Sub

  Public Sub New()

    Timer1.Interval = 2000

  End Sub

  Private Sub Timer1_Tick(sender As Object, e As System.EventArgs) Handles Timer1.Tick

    Timer1.Stop()
    Buffer = ""

  End Sub

End Class

答案 1 :(得分:1)

正如您可能知道的那样,此功能称为“预先输入”,并且它未内置到Winform ListBox中(因此您不会错过任何属性)。

如果将View属性设置为List,则可以在ListView控件上获得预先输入功能。

答案 2 :(得分:-1)

    Public Function CheckIfExistInCombo(ByVal objCombo As Object, ByVal TextToFind As String) As Boolean
        Dim NumOfItems As Object 'The Number Of Items In ComboBox
        Dim IndexNum As Integer 'Index
        NumOfItems = objCombo.ListCount
        For IndexNum = 0 To NumOfItems - 1
            If objCombo.List(IndexNum) = TextToFind Then
                CheckIfExistInCombo = True
                Exit Function
            End If
        Next IndexNum
        CheckIfExistInCombo = False
    End Function