Cómo... en .NET

Auto completar en Visual Basic y C# 2003

Publicado el 25/Oct/2006
Actualizado el 13/Abr/2007
Autor: Guillermo 'guille' Som

Ejemplo para simular auto completar en un ComboBox o en un TextBox con un ListBox asociado. Para mostrar el texto que coincida con los elementos del combo o el listBox. Y como de costumbre, con código tanto para VB como para C#.

 

Introducción:

Lo que aquí te muestro te puede ser de utilidad para que tus controles (particularmente el ComboBox) funcionen como ya estamos acostumbrados en muchas aplicaciones: que conforme escribas se vaya mostrando lo que más se parezca a eso que escribes.
Aunque en este ejemplo solo se buscará en los elementos de un ComboBox o de un ListBox, en este último caso, el texto que se comprobará será el que esté en una caja de textos.

Nota:
En los lenguajes de la versión 2.0 (o superior) de .NET Framework (Visual Studio 2005 y superior) esto se puede hacer fácilmente por medio de las propiedades AutoComplete y relacionadas, con la diferencia de que además de los elementos del combo o el listBox también puedes usar otras fuentes, como el sistema de archivos, el historial de recientes, o cualquier otra fuente personaliza (un array, etc.)

Aquí tienes un ejemplo para usarlo con Visual Studio 2005 (tanto para VB como para C#)
 

 

El código de ejemplo está dividido en dos partes, por un lado una clase que es la que tiene la funcionalidad de auto completar y por otro, el código de ejemplo para usar esa clase, tanto para Visual Basic como para C#.

No lo he probado en Visual Studio .NET 2002, pero supongo que funcionará sin problemas.

En Visual Basic la clase que tiene el código para hacer el efecto de auto completar es en realidad un módulo (Module), sin embargo, en C# es una clase con los métodos estáticos (o compartidos). Pero la forma de usar esa clase (BuscarCombo) es la misma en ambos lenguajes.

Los datos a usar en el ComboBox y el ListBox del formulario de ejemplo los relleno por medio del contenido de un array de tipo String usando el método AddRange de la colección Items de esos controles.

El formulario de ejemplo es muy simple (no incluyo el código generado por el diseñador), ya que solo tiene un control ComboBox, un control TextBox, un control ListBox, dos etiquetas y un botón para cerrar la aplicación.
El nombre de esos controles los he dejado tal como los genera el diseñador de formularios de Visual Basic .NET, al botón le he cambiado el nombre por btnCerrar.

 

Espero que te sea de utilidad.

Nos vemos.
Guillermo

Nota del 13/Abr/07:
Aquí tienes un ejemplo de cómo simular auto completar accediendo a una base de datos.

 


Código para Visual Basic.NET (VB.NET)El código para VB .NET (cualquier versión)

 

BuscarCombo

'------------------------------------------------------------------------------
' BuscarCombo                                                       (25/Oct/06)
' Clase para simular auto completar en un ComboBox o ListBox
' 
' Basado en un código de Visual Basic "clásico" publicado en mi sitio en:
' http://www.elguille.info/vb/VB_TIP3.HTM#vb3_07
' http://www.elguille.info/vb/objetos/vbo_objects.htm
' http://www.elguille.info/vb/utilidades/gsNotas/gsnotasv3cod2.htm#BuscarCombo
' Y otro más antiguo, seguramente de 1996 ó 1997 (para VB3):
' http://www.elguille.info/vb/VB_TIP1.HTM#vb008
'
' ©Guillermo 'guille' Som, 1998-2006
'------------------------------------------------------------------------------
Option Strict On
Option Explicit On 

Imports System.Windows.Forms

Module BuscarCombo
    Private combo1Borrado As Boolean

    Public Sub unCombo_KeyDown(ByVal keyCode As System.Windows.Forms.Keys)
        If keyCode = Keys.Delete Then
            combo1Borrado = True
        Else
            combo1Borrado = False
        End If
    End Sub

    Public Sub unCombo_KeyPress(ByVal keyChar As Char)
        ' Si se pulsa Borrar... ignorar la búsqueda al cambiar
        If keyChar = Microsoft.VisualBasic.vbBack Then
            combo1Borrado = True
        Else
            combo1Borrado = False
        End If
    End Sub

    Public Sub unCombo_Change(ByVal combo As ComboBox)
        unCombo_Change(combo.Text, combo)
    End Sub

    Public Sub unCombo_Change(ByVal texto As String, ByVal combo As ComboBox)
        If Not combo1Borrado Then
            If Microsoft.VisualBasic.Len(texto) = 0 Then Exit Sub
            With combo
                Dim i As Integer = .FindString(texto)
                If i > -1 Then
                    .SelectedIndex = i
                    .Text = .Items(i).ToString
                    .SelectionStart = texto.Length
                    .SelectionLength = .Text.Length - .SelectionStart
                End If
            End With
        End If
    End Sub

    Public Sub unCombo_Change(ByVal text As TextBox, ByVal combo As ListBox)
        If Not combo1Borrado Then
            Dim n As Integer = Microsoft.VisualBasic.Len(text.Text)
            If n = 0 Then Exit Sub
            With combo
                Dim i As Integer = .FindString(text.Text)
                If i > -1 Then
                    .SelectedIndex = i
                    text.Text = .Items(i).ToString
                    text.SelectionStart = n
                    text.SelectionLength = text.Text.Length - text.SelectionStart
                End If
            End With
        End If
    End Sub

End Module

 

El formulario de ejemplo

'------------------------------------------------------------------------------
' Prueba de auto completar en Visual Basic 2003                     (25/Oct/06)
' Ejemplos para usar un ComboBox o un ListBox con un TextBox
'
' ©Guillermo 'guille' Som, 2006
'------------------------------------------------------------------------------
Option Strict On
Option Explicit On 

Public Class Form1
    Inherits System.Windows.Forms.Form

#Region " Código generado por el Diseñador de Windows Forms "
    ' Omitido el diseñador de formularios
#End Region

    Private Sub Form1_Load(ByVal sender As System.Object, _
                ByVal e As System.EventArgs) Handles MyBase.Load
        Dim a() As String = {"Pepe Luis", "Pepe Ruiz", "Juan Francisco", _
                             "Luisa Lopez", "Lorenzo Llamas", "Lucio Bigote", _
                             "Juan Fernandez", "Pedro Picapiedra", _
                             "Luis Gonzalez", "Luna Soleada"}
        With ComboBox1
            .Items.Clear()
            .Items.AddRange(a)
            .SelectedIndex = 0
        End With

        With ListBox1
            .Items.Clear()
            .Items.AddRange(a)
            .SelectedIndex = 0
        End With

    End Sub

    Private Sub btnCerrar_Click(ByVal sender As System.Object, _
                ByVal e As System.EventArgs) Handles btnCerrar.Click
        Me.Close()
    End Sub

    ' Para implementar auto completar en el ComboBox
    '
    ' Los métodos KeyDown y KeyPress se pueden usar
    ' para todos los controles en los que queramos usar autocompletar
    Private Sub ComboBox1_KeyDown(ByVal sender As Object, _
            ByVal e As System.Windows.Forms.KeyEventArgs) _
            Handles ComboBox1.KeyDown
        BuscarCombo.unCombo_KeyDown(e.KeyCode)
    End Sub

    Private Sub ComboBox1_KeyPress(ByVal sender As Object, _
                ByVal e As System.Windows.Forms.KeyPressEventArgs) _
                Handles ComboBox1.KeyPress
        BuscarCombo.unCombo_KeyPress(e.KeyChar)
    End Sub

    ' Este método debe ser diferente para cada control
    ' o si son varios hacer la conversión de "sender" a ComboBox
    Private Sub ComboBox1_TextChanged(ByVal sender As Object, _
                ByVal e As System.EventArgs) _
                Handles ComboBox1.TextChanged
        BuscarCombo.unCombo_Change(ComboBox1)
        ' También se puede usar así:
        ' Esto es útil si el texto está en otro control
        'BuscarCombo.unCombo_Change(ComboBox1.Text, ComboBox1)
    End Sub

    ' Mostrar el elemento seleccionado
    Private Sub ListBox1_SelectedIndexChanged(ByVal sender As Object, _
                ByVal e As System.EventArgs) _
                Handles ListBox1.SelectedIndexChanged, ListBox1.Click
        Me.TextBox1.Text = ListBox1.SelectedItem.ToString
    End Sub

    ' Para implementar auto completar en el TextBox/ListBox
    ' Para el ListBox usamos como fuente el TextBox
    Private Sub TextBox1_KeyDown(ByVal sender As Object, _
                ByVal e As System.Windows.Forms.KeyEventArgs) _
                Handles TextBox1.KeyDown
        BuscarCombo.unCombo_KeyDown(e.KeyCode)
    End Sub

    Private Sub TextBox1_KeyPress(ByVal sender As Object, _
                ByVal e As System.Windows.Forms.KeyPressEventArgs) _
                Handles TextBox1.KeyPress
        BuscarCombo.unCombo_KeyPress(e.KeyChar)
    End Sub

    Private Sub TextBox1_TextChanged(ByVal sender As Object, _
            ByVal e As System.EventArgs) _
            Handles TextBox1.TextChanged
        ' Cuando es el ListBox, pasamos el TextBox y el ListBox
        BuscarCombo.unCombo_Change(TextBox1, ListBox1)
    End Sub
End Class

 


Código para C Sharp (C#)El código para C# (cualquier versión)

 

BuscarCombo

//-----------------------------------------------------------------------------
// BuscarCombo                                                      (25/Oct/06)
// Clase para simular auto completar en un ComboBox o ListBox
// Convertido automáticamente a C# con VB2CS2003
//
// Basado en un código de Visual Basic "clásico" publicado en mi sitio en:
// http://www.elguille.info/vb/VB_TIP3.HTM#vb3_07
// http://www.elguille.info/vb/objetos/vbo_objects.htm
// http://www.elguille.info/vb/utilidades/gsNotas/gsnotasv3cod2.htm#BuscarCombo
// Y otro más antiguo, seguramente de 1996 ó 1997 (para VB3):
// http://www.elguille.info/vb/VB_TIP1.HTM#vb008
//
// ©Guillermo 'guille' Som, 1998-2006
//-----------------------------------------------------------------------------
 
using System;
using System.Windows.Forms;

namespace autoCompletar_CS2003
{

class BuscarCombo
{
    private static bool combo1Borrado;

    public static void unCombo_KeyDown(System.Windows.Forms.Keys keyCode) 
    {
        if( keyCode == Keys.Delete )
        {
            combo1Borrado = true;
        }
        else
        {
            combo1Borrado = false;
        }
    }  
    public static void unCombo_KeyPress(char keyChar) 
    {
        // Si se pulsa Borrar... ignorar la búsqueda al cambiar
        if( keyChar == (char)Keys.Back )
        {
            combo1Borrado = true;
        }
        else
        {
            combo1Borrado = false;
        }
    }  

    public static void unCombo_Change(ComboBox combo) 
    {
        unCombo_Change(combo.Text, combo);
    }  

    public static void unCombo_Change(string texto, ComboBox combo) 
    {
        if( !combo1Borrado )
        {
            if( texto == null || texto.Length == 0 ) return;
            int i = combo.FindString(texto);
            if( i > -1 )
            {
                combo.SelectedIndex = i;
                combo.Text = combo.Items[i].ToString();
                combo.SelectionStart = texto.Length;
                combo.SelectionLength = combo.Text.Length - combo.SelectionStart;
            }
        }
    }  

    public static void unCombo_Change(TextBox text, ListBox combo) 
    {
        if( !combo1Borrado )
        {
            if( text.Text == null || text.Text.Length == 0 ) return;

            int n = text.Text.Length;
            if( n == 0 ) return;
            int i = combo.FindString(text.Text);
            if( i > -1 )
            {
                combo.SelectedIndex = i;
                text.Text = combo.Items[i].ToString();
                text.SelectionStart = n;
                text.SelectionLength = text.Text.Length - text.SelectionStart;
            }
        }
    }  

}

}

 

El formulario de ejemplo

//-----------------------------------------------------------------------------
// Prueba de auto completar en Visual C# 2003                       (25/Oct/06)
// Ejemplos para usar un ComboBox o un ListBox con un TextBox
//
// ©Guillermo 'guille' Som, 2006
//-----------------------------------------------------------------------------

using System;
using System.Drawing;
using System.ComponentModel;
using System.Windows.Forms;

namespace autoCompletar_CS2003
{

public class Form1 : System.Windows.Forms.Form
{
    // Omitido el código del diseñador y otras inicializaciones

    private void Form1_Load(System.Object sender, System.EventArgs e) 
    {
        ListBox1.Click +=new EventHandler(ListBox1_SelectedIndexChanged);

        string[] a = {"Pepe Luis", "Pepe Ruiz", 
                        "Juan Francisco", "Luisa Lopez", 
                        "Lorenzo Llamas", "Lucio Bigote", 
                        "Juan Fernandez", "Pedro Picapiedra", 
                        "Luis Gonzalez", "Luna Soleada"};

        ComboBox1.Items.Clear();
        ComboBox1.Items.AddRange(a);
        ComboBox1.SelectedIndex = 0;

        ListBox1.Items.Clear();
        ListBox1.Items.AddRange(a);
        ListBox1.SelectedIndex = 0;
    }  

    private void btnCerrar_Click(System.Object sender, System.EventArgs e)
    {
        this.Close();
    }  

    // Para implementar auto completar en el ComboBox
    //
    // Los métodos KeyDown y KeyPress se pueden usar
    // para todos los controles en los que queramos usar autocompletar
    private void ComboBox1_KeyDown(object sender, KeyEventArgs e) 
    {
        BuscarCombo.unCombo_KeyDown(e.KeyCode);
    }  

    private void ComboBox1_KeyPress(object sender, KeyPressEventArgs e) 
    {
        BuscarCombo.unCombo_KeyPress(e.KeyChar);
    }  

    // Este método debe ser diferente para cada control
    // o si son varios hacer la conversión de "sender" a ComboBox
    private void ComboBox1_TextChanged(object sender, EventArgs e) 
    {
        BuscarCombo.unCombo_Change(ComboBox1);
        // También se puede usar así:
        // Esto es útil si el texto está en otro control
        //BuscarCombo.unCombo_Change(ComboBox1.Text, ComboBox1);
    }  

    // Mostrar el elemento seleccionado
    private void ListBox1_SelectedIndexChanged(object sender, EventArgs e)
    {
        this.TextBox1.Text = ListBox1.SelectedItem.ToString();
    }  

    // Para implementar auto completar en el TextBox/ListBox
    // Para el ListBox usamos como fuente el TextBox
    private void TextBox1_KeyDown(object sender, KeyEventArgs e) 
    {
        BuscarCombo.unCombo_KeyDown(e.KeyCode);
    }  

    private void TextBox1_KeyPress(object sender, KeyPressEventArgs e) 
    {
        BuscarCombo.unCombo_KeyPress(e.KeyChar);
    }  

    private void TextBox1_TextChanged(object sender, EventArgs e) 
    {
        // Cuando es el ListBox, pasamos el TextBox y el ListBox
        BuscarCombo.unCombo_Change(TextBox1, ListBox1);
    }
}

}

 


Espacios de nombres usados en el código de este artículo:

System.Windows.Forms
 



Ir al índice principal de el Guille