JcmSoft - VB.NET   Combobox : usando o recurso Auto Completar

Neste artigo eu vou mostrar como criar uma combobox na qual podemos usar o recurso auto completar. Este recurso quando ativo , permite que a medida que o usuário digite os caracteres na combo seja feita uma filtragem dos itens da combo ; os itens filtrados serão exibidos a medida que a digitação prossegue até que o item procurado seja encontrado.

Nos já usamos este recurso no VB6 com os controles:  combobox , listbox e DBCombo. Para detalhes veja os artigos abaixo:

  1. Opção de busca rápida no VB
  2. DBCombo dinâmica - Fazendo uma busca automática
  3. Obtendo busca automática em uma combobox usando API ( SendMessage)

Mas agora estamos em tempos de VB .NET. Como podemos obter o mesmo resultado ? Esta é a minha deixa...

Você já sabe que o VB .NET agora tem todos os recursos de uma linguagem orientada a objetos . Um dos pilares de orientação a objeto é a herança ( leia o artigo : VB.NET - Primeiros passos - Conceitos - V) e para você ir se habituando com estes novos recursos vamos usar a herança para criar um controle ComboBox que permita o recurso Auto Completar.

Como vamos fazer isto ? Ora , o VB .NET já oferece um controle Combobox pronto , e , com a herança ,  ao invés de re-inventar a roda , vamos usar o controle já pronto herdando suas propriedades e métodos. Para implementar o recurso de Auto Completar vamos apenas sobrescrever os métodos  OnKeyDown e OnTextChanged  e implementar o recurso da busca dos itens na combo. Agora ao trabalho...

1 - Inicie um novo projeto no Visual Studio.NET com as seguintes características (sinta-se a vontade para alterar a seu gosto.)

  1. Project Types : Visual Basic .NET
  2. Templates : Class Library
  3. Name : ComboboxAutoComplete
  4. Location : c:\vbnet\ComboboxAutoComplete

2- Inclua uma referência no projeto ao namespace System.Windows.Forms . Para isto clique com o botão direito do mouse sobre o nome do projeto e clique na opção Add Reference. Na aba .NET selecione o componente : System.Windows.Forms.dll  e clique em OK , conforme abaixo:

no arquivo de classe - ComboboxAutoComplete.vb - insira o seguinte código:

Imports System.Windows.Forms

 

'Estamos criando uma combobox usando a herança e sobreescrevendo alguns dos seus métodos

Public Class AutoCompletarComboBox

Inherits ComboBox

 

'Usamos esta variavel para sinalizar para a sub OnTextChanged se iremos ou nao iremos usar o autocompletar

Private _AutoComplete As Boolean = True

 

'Isto é disparadao quando uma tecla é pressionada na combo

Protected Overrides Sub OnKeyDown(ByVal e As KeyEventArgs)

      'ativa auto completar somente quando a tecla pressionada não for backspace nem delete.

    _AutoComplete = e.KeyCode <> Keys.Delete And e.KeyCode <> Keys.Back

 

     'Como sobre escrevemos o evento OnKeyDown event precisamos dizer para noossa classe "Base" que uma tecla foi pressionada

   MyBase.OnKeyDown(e)

End Sub

 

'disparado quando o texto na combo mudar

Protected Overrides Sub OnTextChanged(ByVal e As EventArgs)

 

    'somente faça se o usuário não pressionou backspace ou delete

   If _AutoComplete Then

           Dim TextEntered As String = Me.Text

     ' pega o texto atual fora da combo box

         Dim index As Integer = Me.FindString(TextEntered)

         'FindString é o metodo na combo box que estamos usando

         If index >= 0 Then

            'se o texto não existir nos itens da combo então...

         _AutoComplete = False

             'desabilita o auto completar enquanto mudamos o indice selecionado

            Me.SelectedIndex = index

            'altera o index selecionado

       _AutoComplete = True

           'habilita o auto completar

           Me.Select(TextEntered.Length, Me.Text.Length)

          'seleciona somente o texto incluido

       End If

    End If

 

    MyBase.OnTextChanged(e)

   'Como sobre escrevemos o evento OnTextChanged event precisamos dizer para nossa classe "Base" que uma tecla foi pressionada

End Sub

 

End Class

Destaque:

-  O nome do componente que será criado será o nome definido na classe : Public Class AutoCompletarComboBox

- Inherits ComboBox - indica que estamos herdando todas as propriedades e métodos do controle Combobox

- Protected Overrides Sub OnKeyDown - indica que vamos sobrescrever o método OnkeyDown do controle Combobox

- Protected Overrides Sub OnTextChanged - indica que vamos sobrescrever o método OnTextChanged do controle combobox.

O código esta comentado e dispensa maiores detalhes.

3- Agora vamos construir o projeto usando a opção - Build ComboboxAutoComplete - do  menu Build. Com isto nosso novo componente - AutoCompletarComboBox - foi criado no diretório  bin da nossa aplicação e esta pronto para ser usado. Temos então um componente criado a partir de um controle existente usando os novos recursos da orientação a objetos do Vb .NET.

4- Vamos agora inserir o componente na barra de ferramentas para podermos usar o componente em nosso projeto. Abra a barra de ferramentas (Toolbox) e clique com o botão direito do mouse sobre ela.  Selecione a seguir a opção - Customize Toolbox - (conforme figura ao lado)

5- Na janela - Customize ToolBox - selecione a aba  - .NET Framework Components - e clique no botão - Browse . Selecione o arquivo referente ao nosso projeto : ComboboxAutoComplete , conforme abaixo.

Pronto ! nosso componente combobox com recurso auto completar esta pronto para ser usado em qualquer projeto Windows Forms. Vamos mostrar isto agora.

Usando o ComboBox criado com recurso auto completar

1 - Inicie um novo projeto no Visual Studio.NET com as seguintes características (sinta-se a vontade para alterar a seu gosto.)

  1. Project Types : Visual Basic .NET
  2. Templates : Windows Forms
  3. Name : ComboboxAutoCompletar_Teste
  4. Location : c:\vbnet\ComboboxAutoCompletar_Teste
No formulário padrão - form1.vb - vamos inserir o nosso controle , para isto , abra a ToolBox e clique na aba - General .

Observe que o nosso componente esta presente na ToolBox(veja figura ao lado).

Basta arrastá-lo até o formulário e teremos algo parecido com a figura a seguir:

 

 

No evento Load do formulário vamos incluir o código para preencher a combo com alguns itens.

 

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

   AutoCompletarComboBox1.Items.Add("Macoratti")

   AutoCompletarComboBox1.Items.Add("Janice")

   AutoCompletarComboBox1.Items.Add("Janilda")

   AutoCompletarComboBox1.Items.Add("Jessica")

   AutoCompletarComboBox1.Items.Add("Miriam")

   AutoCompletarComboBox1.Items.Add("Fabio")

   AutoCompletarComboBox1.Items.Add("Felipe")

   AutoCompletarComboBox1.Items.Add("Giovana")

   AutoCompletarComboBox1.Items.Add("Igor")

   AutoCompletarComboBox1.SelectedIndex = 0

End Sub

 

Execute o projeto e digite algum caractere referente ao um dos itens da combo. Se você digitar M , o item Macoratti é localizado e exibido. Conforme você ir digitando os itens são filtrados de acordo com os caracteres encontrados nos respectivos itens.

Gostou ??? Você acabou de usar um componente criado através da herança e da sobrecarga presentes no VB .NET. Viu como a OOP facilitou a nossa vida ???

Até mais ! Aguarde mais artigos sobre o  VB .NET ...


José Carlos Macoratti