C# - Revisitando o controle Combobox


Por ser um controle muito usado em aplicações Windows Forms o Combobox merece ser analisado com um pouco mais detalhes, assim você poderá usá-lo tranquilamente sem dúvidas quanto as suas principais propriedades.

Nos exemplos deste artigo eu estou usando o Visual C# 2010 Express Edition onde criei uma aplicação Windows Forms Application com o nome Combobox_Demo;

O controle ComboBox é um TextBox combinado com um ListBox sendo que ele permite que os usuários incluam texto no campo TextBox ou que façam uma seleção a partir de um conjunto definidos de possibilidades.

A propriedade DropDownStyle da seção Appearence da janela de propriedades do controle Combobox determina o estilo da Combobox e pode ter 3 valores:

O valor padrão é definido como DropDown que indica que a porção do texto é editável e assim o usuário pode digitar qualquer valor na área de Texto da Combobox.

Se esta propriedade for definida como DropDownList, o usuário não poderá editar diretamente o Texto na Combobox, podendo apenas selecionar valores a partir da lista.

Se o valor for definido como Simple a porção do Texto poderá ser editada e os valores da lista ficaram sempre visíveis.

Os itens definidos na lista de opções podem ser incluídos diretamente na propriedade Items da janela de propriedades e serem digitados na janela do editor de strings da coleção:

Para incluir itens individuais na lista de itens em tempo de execução podemos usar o método Add conforme o seguinte código:

    for (int x = 1; x < 10; x++)
    {
       comboBox1.Items.Add("Opção " + x.ToString());
    }

Para incluir objetos em tempo de execução podemos atribuir um array de objetos com o método AddRange. A lista exibe o valor string padrão para cada objeto.

No código a seguir estamos criando um ComboBox em tempo de execução via código e definindo algumas propriedades e usamos o método AddRange para incluir itens na ComboBox:

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

namespace Macoratti
{
    public partial class Form1 : Form
    {
        ComboBox cmb;
        System.Object[] ItemRange;

        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            CriaComboBox();
        }

        private void CriaComboBox()
        {
            cmb = new ComboBox();
            cmb.Location = new Point(12, 30);
            cmb.Size = new Size(168, 20);
            cmb.DropDownWidth = 150;
            IncluiItems();
            Controls.Add(cmb);
        }

        private void IncluiItems()
        {
            ItemRange = new System.Object[5];
            for (int i = 0; i <= 4; i++)
            {
                ItemRange[i] = "Opção " + i;
            }
            cmb.Items.AddRange(ItemRange);
        }
    }
}

A rotina CriaComboBox() é chamada no evento Load do formulário.

Esta rotina cria um novo controle ComboBox , define o seu tamanho e posição e chama
a rotina IncluiItens();

A rotina IncluiItems() inclui 5 itens na lista de itens do controle usando o método AddRange.

Incluindo e removendo Itens

A propriedade Combobox.Items permite que você obtenha uma referência a lista de itens que esta atualmente armazenada na Combobox. Com esta referência, podemos incluir itens, remover itens e obter o número de itens na coleção.

Os itens exibidos são em geral strings mas qualquer objeto pode ser usado. No exemplo a seguir veremos como incluir e remover itens individuais.

Inclua dois botões de comando btnIncluirItens e btnRemoverItens no formulário e a seguir defina o seguinte código no evento Click do botão btnIncluirItens para incluir itens após o último item da lista da Combobox:

  private void btnIncluirItens_Click(object sender, EventArgs e)
  {
            // para inserir na última posição
            int cnt = cmb.Items.Count;

            if (txtItens.Text != String.Empty)
            {
                cmb.Items.Insert(cnt, txtItens.Text);
            }
            else
            {
                cmb.Items.Insert(cnt, "Item " + cnt);
            }
            txtItens.Text = "";
//limpa a caixa de texto após a inclusão
  }

O método Insert inclui um item na lista de itens em uma posição específica.

Em seguida inclua o seguinte código no evento Click do botão btnRemoverItens para remover

 private void btnRemoverItens_Click(object sender, EventArgs e)
  {
            cmb.Items.Remove(cmb.SelectedItem);
 }
O método Remove() remove o item selecionado na ComboBox;

Para remover um item de um índice especifico ,usamos o método RemoveAt()
Ex: cmb.Items.RemoveAt(0)

Procurando um Item na Combobox

O método FindStringExact pode ser usado para encontrar o primeiro item na combobox que coincide com o critério de busca definido.

O valor retornado é um índice com base zero do primeiro item encontrado; no caso de nenhum item ser encontrado será retornado o valor -1.

O parâmetro passado para este método é uma string que é comparada contra o texto associado com os itens na lista da combobox.

A busca procura por equivalência iniciando a partir do início do texto, retornando o primeiro item na lista que satisfaz o critério.

Existem também o método FindStringExact(String,Int32) que toma uma string bem como um inteiro como parâmetro. Este método é usado para encontrar o primeiro item depois do índice especificado que satisfaz o critério definido de busca.(A busca realizada por este método não e case-sensitive)

No exemplo a seguir usamos o método FindStringExact para realizar uma procura na ComboBox. Para testar este código inclua um botão de comando btnProcurar no formulário e no evento Click do botão inclua o código a seguir:

    private void btnProcurar_Click(object sender, EventArgs e)
    {
            procuraStringNaCombo();
    }
    private void procuraStringNaCombo()
    {
            int res = -1;

            if (txtItens.Text != String.Empty)
            {
              
 // O método FindStringExact procura a primeira ocorrência na lista
                res = cmb.FindStringExact(txtItens.Text);

           
    // FindStringExact retorna -1 se nada for encontrado
                if (res != -1)
                {
                    MessageBox.Show(String.Format("A string {0} foi encontrada na posição {1}", txtItens.Text, res));
                    cmb.SelectedIndex = res;
                }
                else
                {
                    MessageBox.Show("A string informada não foi localizada na lista");
                }
            }
            else
            {
                MessageBox.Show("Informe a string para busca", "Valor inválido");
                txtItens.Focus();
            }
        }

No evento Click do botão Procurar chamamos a rotina procuraStringNaCombo() e esta rotina usa o texto informado na caixa de texto como parâmetro para a função FindStringExact();

O resultado pode ser visto abaixo:

Definindo um Combobox AutoCompletar

Você já deve saber que uma das formas de você implementar este recurso é usar as propriedades AutoCompleteMode e AutoCompleteSource.

Para incluir a funcionaliade de AutoCompletar na Combobox podemos usar a propridade AutoCompleteMode que obtém ou define uma opção que controla como o preenchimento automático funciona para a ComboBox. Os valores possíveis são:

Obs: AutoCompleteCustomSource - permite definirmos uma lista de informações que serão consultadas quando for preciso completar automaticamente um controle.

Segue abaixo um resumo dessas propriedades para refrescar a sua memória:

Obtém ou define um valor especificando a fonte de strings completas usadas para o auto-preenchimento automático.

Use as propriedades AutoComplteCustomeSource, AutoCompleteMode e AutoCompleteSource para criar um ComboBox que completa automaticamente uma cadeia de caracteres de entrada comparando o prefixo que esta sendo inserido com os prefixos de todas as cadeias de caracteres em uma origem.

De forma resumida podemos definir cada uma destas propriedades:

- AutoCompleteMode: define o comportamento do Auto Complete; (Opções: None, Append, Suggest e AppendSuggest)
- AutoCompleteSource: define qual a fonte de dados do Auto Complete;
- AutoCompleteCustomSource: É usada somente quando o AutoCompleteSource é definido como CustomSource.

As opções possíveis para AutoCompleteCustomSource são:

  • FileSystem, HistoryList, RecentUsedList, AllUrl, AllSystemSources, CustomeSource e None.

No exemplo a seguir vemos como ativar o preenchimento automático. Para isso vamos definir o estilo da como Combobox como DropDown e na propriedade AutoCompleteMode vamos definir os valores Append,Suggest e SuggestAppend;

Obs: Para exibir a lista da combobox automaticamente quando o controle for exibido basta definir a propriedade DroppedDown como true;

Para o nosso exemplo vamos redefinir a definição da ComboBox na rotina CriaComboBox();

  // Habilitar o preenchimento Automático
  cmb.DropDownStyle = ComboBoxStyle.DropDown;
  cmb.AutoCompleteMode = AutoCompleteMode.Suggest;
  cmb.KeyPress += new KeyPressEventHandler(cmb_KeyPress);

No evento KeyPress do controle ComboBox vamos definir o código:

private void cmb_KeyPress(object sender, KeyPressEventArgs e)
{
   
//habilitar a abertura automatica da combo.
   cmb.DroppedDown = true;
}

Dessa forma temos a ativação do preenchimento automático.

Simples , simples assim...

Eu sei é apenas C#, mas eu gosto...

Referências:

José Carlos Macoratti