ComboBox con aurtocompletado de texto en VB

ComboBox con función de autocompletado al ir escribiendo caracteres en un cuadro de texto, con el ComboBox oculto en el formulario, en Visual Basic .NET

Resumen del ejercicio: a medida que se van escribiendo letras en un cuadro de texto, otro cuadro de texto va mostrando la primera coincidencia de una lista de palabras de un control Combobox oculto en el formulario (similar a la función Intellisense). Las lista de palabras existentes en la colección se muestran en un control RichTextBox para facilitar la interacción con el usuario.

Código en Visual Basic .NET

Utilizamos 2 controles TextBox, en uno escribimos las letras de la palabra buscada y el otro va mostrando la primera coincidencia. La lista de palabras en las que buscaremos coincidencias están almacenadas en un control ComboBox oculto ya que no necesito mostrarlo, solamente utilizar su funcionalidad.

En este ejercicio he elegido palabras reservadas del lenguaje pero puedes emplear cualquier otra lista de palabras. Se añaden por código en las propiedades del ComboBox con el método Items.AddRange de esta forma:

 Me.ComboBox1.Items.AddRange(New Object() {"#Const", "#Else", "#ElseIf", "#End", "#If", "AddHandler", "AddressOf", "Alias", "And", "AndAlso", "As", "Boolean", "ByRef", "Byte", "ByVal", "Call", "Case", "Catch", "CBool", "CByte", "CChar", "CDate", "CDbl", "CDec", "Char", "CInt", "Class", "CLng", "CObj", "Const", "Continue", "CSByte", "CShort", "CSng", "CStr", "CType", "CUInt", "CULng", "CUShort", "Date", "Decimal", "Declare", "Delegate", "Dim", "DirectCast", "Do", "Double", "Each", "Else", "ElseIf", "En", "End", "EndIf", "Enum", "Erase", "Error", "Espacio de nombres ", "Event", "False", "Finally", "For", "For Each…Next", "Friend", "Function", "Get", "GetType", "GetXMLNamespace", "Global", "GoSub", "GoTo", "Handles", "Implements", "Imports", "In", "Inherits", "Integer", "Interface", "Is", "IsNot", "Let", "Lib", "Like", "Long", "Loop", "Me", "Mod", "Module", "MustInherit", "MustOverride", "MyBase", "MyClass", "Namespace", "Narrowing", "New", "Not", "Nothing", "NotInheritable", "NotOverridable", "Object", "Of", "On", "Opción", "Operator", "Or", "OrElse", "Out", "Overridable", "Overrides", "ParamArray", "Partial", "Private", "Property", "Protected", "Public", "RaiseEvent", "ReadOnly", "ReDim", "REM", "RemoveHandler", "Resume", "Return", "Salir", "SByte", "Seleccionar", "Set", "Shadows", "Shared", "Short", "Single", "Static", "Step", "Stop", "String", "Structure", "Structure Constraint", "Sub", "SyncLock", "Then", "Throw", "True", "Try", "TryCast", "TypeOf…Is", "UInteger", "ULong", "UShort", "Using", "Variant", "Wend", "When", "While", "Widening", "With", "WithEvents", "WriteOnly", "Xor"})

Cada vez que cambia el texto del TextBox de entrada de caracteres(cada vez que escribimos algo) el programa va buscando coincidencias entre los caracteres tecleados y las palabras almacenadas en el ComboBox, esto se consigue guardando en una variable de cadena lo que se va escribiendo y buscando esa cadena en los ítems del ComboBox con FindString que devuelve el índice del elemento coincidente o -1 si no encuentra coincidencia. En el ComboBox se selecciona el ítem que corresponde al índice y ese ítem se muestra en el otro TextBox destinado a mostrar las palabras encontradas.

' Si cambio el texto del cuadro de texto TextBoxEntrada
Private Sub TextBoxEntrada_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TextBoxEntrada.TextChanged
Dim cadena As String ' almacena los caracteres tecleados
Dim indice As Integer ' para buscar la cadena en la lista de elementos
cadena = TextBoxEntrada.Text.ToLower ' cadena almacena los caracteres tecleados (en minùsculas)
indice = ComboBox1.FindString(cadena) ' indice referido al ítem que contiene la cadena
' Si hay alguna coincidencia selecciono el elemento en la lista
' En listas y cuadros combinados, SelectedIndex  -1 significa ningún ítem seleccionado 
If indice > -1 Then
		ComboBox1.SelectedIndex = indice ' índice del elemento seleccionado
		TextBoxPalabras.Text = ComboBox1.SelectedItem.ToString
	ElseIf indice = -1 Then
		ComboBox1.SelectedIndex = -1 ' para no elegir ningún elemento
		TextBoxPalabras.Text = ""
End If
If TextBoxEntrada.Text = "" Then ' si vacío la caja de texto
	ComboBox1.SelectedIndex = -1 ' para no elegir ningún elemento
	TextBoxPalabras.Text = ""
End If
End Sub

Puedes descargar la aplicación completa en Visual Studio 2017 desde aquí.