Windows Secrets for Visual Basic, Part 1, Page 4
Save User Time: Add AutoComplete to Combo Boxes
Develop an application in a program such as Microsoft Access and all your combo boxes will incorporate "AutoComplete" by default, that ability to be able to tap a few characters in a drop down and have the nearest matching selection picked out for you.
In Visual Basic however, there's no such intrinsic support. If you want AutoComplete, you've got to do it yourself. And this tip shows you how.
Simply add the following methods to your form. The first is called AutoCompleteKeyUp and accepts a combo box and KeyEventArgs object as arguments. You need to call these in the KeyUp event of your combo box: it looks at what the user has typed and selects the most appropriate match. The second is called AutoCompleteLeave and should be called when the Leave event of your combo box is fired. This one simply takes whatever you've finally chosen and cases it properly, as per the matching selection in the combo box.
Let's look at those functions now:
Public Sub AutoCompleteKeyUp(ByVal Combo
As ComboBox, _
ByVal e As KeyEventArgs)
Dim strTyped As String
Dim intFoundIndex As Integer
Dim objFoundItem As Object
Dim strFoundText As String
Dim strAppendText As String
' Ignore basic selection keys
Select Case e.KeyCode
Case Keys.Back, Keys.Left, Keys.Right, Keys.Up, _
Keys.Delete, Keys.Down, Keys.CapsLock
Return
End Select
' Find what user has typed in list
strTyped = Combo.Text
intFoundIndex = Combo.FindString(strTyped)
' If found...
If intFoundIndex >= 0 Then
' Get list item (actual type depends on whether data
bound)
objFoundItem = Combo.Items(intFoundIndex)
' Use control to resolve text - in case data bound
strFoundText = Combo.GetItemText(objFoundItem)
' Append the typed text to rest of the found string
' (text is set twice due to a combo box quirk:
' on certain platforms, setting just once ignores casing!)
strAppendText = strFoundText.Substring(strTyped.Length)
Combo.Text = strTyped & strAppendText
Combo.Text = strTyped & strAppendText
' Select the appended text
Combo.SelectionStart = strTyped.Length
Combo.SelectionLength = strAppendText.Length
End If
End Sub
Public Sub AutoCompleteLeave(ByVal Combo As ComboBox)
' Correct casing when leaving combo
Dim intFoundIndex As Integer
intFoundIndex = Combo.FindStringExact(Combo.Text)
Combo.SelectedIndex = -1
Combo.SelectedIndex = intFoundIndex
End Sub
And here's how you may call these functions from your combo box:
Private Sub ComboBox1_KeyUp(ByVal
sender As Object, _
ByVal e As
System.Windows.Forms.KeyEventArgs) _
Handles ComboBox1.KeyUp
AutoCompleteKeyUp(ComboBox1, e)
End Sub
Private Sub ComboBox1_Leave(ByVal sender As Object, _
ByVal e As System.EventArgs) Handles ComboBox1.Leave
AutoCompleteLeave(ComboBox1)
End Sub
That's all you need to create your own AutoComplete combo boxes. And if you're feeling really adventurous, you might even want to wrap all of this up into a neat little user control. But we'll leave that for another tip...

Figure 2: Our AutoComplete combo box strutting its stuff.
