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.
El código para VB .NET
(cualquier versión)
|
'------------------------------------------------------------------------------
' 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
'------------------------------------------------------------------------------
' 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
|
El código para C#
(cualquier versión)
|
//-----------------------------------------------------------------------------
// 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;
}
}
}
}
}
//-----------------------------------------------------------------------------
// 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
|