When you develop an application in Microsoft Access, your combo boxes will, by default, incorporate autocomplete. However, Visual Basic does not include this intrinsic support. If you want autocomplete in VB, you’ve got to do it yourself. This tip shows you how.
First, you’ll need to add some methods to your form:
- AutoCompleteKeyUp: This method accepts a combo box and KeyEventArgs objects as arguments. When you call this in the KeyUp event of your combo box, the method evaluates what the user has typed and selects the most appropriate match.
- AutoCompleteLeave: Call this method when the Leave event of your combobox is fired. This method simply takes whatever you’ve finally chosen and cases it properly, according to 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 to 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