开发者

Search ListBox elements in VB.Net

开发者 https://www.devze.com 2023-01-28 12:52 出处:网络
I\'m migrating an application from VB6 to VB.Net and I found a change in the behavior of the ListBox and I\'m not sure of how to make it equal to VB6.

I'm migrating an application from VB6 to VB.Net and I found a change in the behavior of the ListBox and I'm not sure of how to make it equal to VB6.

The problem is this:

In the VB6 app, when the ListBox is focused and I type into it, the list selects the element that matches what I type. e.g. If the list contains a list of countries and I type "ita", "Italy" will be selected in the listbox. The problem is that with the .Net version of the control if I type "ita" it will select the first element that starts with i, then the first element that starts with "t" and finally the first e开发者_开发问答lement that starts with "a".

So, any idea on how to get the original behavior? (I'm thinking in some property that I'm not seeing by some reason or something like that)

I really don't want to write an event handler for this (which btw, wouldn't be trivial).

Thanks a lot!


I shared willw's frustration. This is what I came up with. Add a class called ListBoxTypeAhead to your project and include this code. Then use this class as a control on your form. It traps keyboard input and moves the selected item they way the old VB6 listbox did. You can take out the timer if you wish. It mimics the behavior of keyboard input in Windows explorer.

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


As you probably know, this feature is called 'type ahead,' and it's not built into the Winform ListBox (so you're not missing a property).

You can get the type-ahead functionality on the ListView control if you set its View property to List.


    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
0

精彩评论

暂无评论...
验证码 换一张
取 消