none
combobox não deixar colocar valor diferente da lista RRS feed

  • Pergunta

  • olá pessoal.

    tenho um combobox com as seguintes configurações.

    autocompletemode = suggest

    autocompletesource = listitems

    dropdownstyle = dropdown

    eu preciso que não deixe escrever um item que não esteja na lista.

    Não quero deixar o dropdownstyle = dropdownlist, pois quero ir digitando e o combo me sugerir.

    como faço isso.

    se colocar um texto diferente da lista, não deixar...

    quarta-feira, 14 de novembro de 2012 10:53

Todas as Respostas

  • Você terá que criar uma rotina no evento KeyPress que percorra os itens do comboBox e verifique se o texto atual digitado existe dentro de algum dos itens deste comboBox, caso não exista, sete e.Handled = true no seu evento "KeyPress"

    algo do tipo:

    private void comboBox_KeyPress(object sender, KeyPressEventArgs e)
            {
                // Agrupa o que já existe no Combobox + a letra digitada
                string textoDigitado = this.comboBox.Text + e.KeyChar.ToString();
                string textoComboBox = "";
                bool existeTexto = false;
    
                for (int i = 0; i < this.comboBox.Items.Count; i++)
                {
                    textoComboBox = this.comboBox.Items[i].ToString();
    
                    if (textoComboBox.Contains(textoDigitado))
                    {
                        existeTexto = true;
                    }
                }
    
                if (existeTexto)
                    e.Handled = false;
                else
                    e.Handled = true;
            }


    Giuvane Conti - Se a resposta for útil, marque-a.

    quarta-feira, 14 de novembro de 2012 12:25
  • Como você preenche seu Comcobox? Se você preenche via DisplayMember, ValueMember e DataSource faça o seguinte:

    No evento Leave do seu combo coloque o seguinte código:

    private void cmbSeuCombo_Leave(object sender, EventArgs e)
            {
                try
                {
                    procurarTextoEmCombo(ref cmbSeuCombo, "Item inválido");
                }
                catch (Exception ex)
                {
                    MessageBox.Show(this, ex.Message, this.Text, MessageBoxButtons.OK, MessageBoxIcon.Warning);
                }
            }

    E crie o método:

    /// <summary>
            /// Seleciona no combobox o item que tem parte do texto digitado. É como se fosse um comando 'Like'. Se o texto não estiver no combobox 
            /// é criada uma exception com o texto passado como parametro.
            /// Autor: Renato Brito Coqueiro
            /// </summary>
            /// <param name="combo"></param>
            public static void procurarTextoEmCombo(ref ComboBox combo, string textoEmCasoDeErro)
            {
                var texto = combo.Text.Trim();
    
                if (texto == "")
                    return;
    
                //PERCORRO O COMBO E DEIXO SELECIONADO O ITEM QUE COMEÇA COM O TEXTO JÁ DIGITADO
                for (int i = 0; i < combo.Items.Count; i++)
                {
                    if (combo.Items[i].GetType().GetProperty(combo.DisplayMember).GetValue(combo.Items[i], null).ToString().IndexOf(texto) > -1)
                    {
                        combo.SelectedIndex = i;
                        return;
                    }
                }
                //SE CHEGOU AQUI É PORQUE O ITEM NÃO ESTÁ NO COMBO
                combo.Text = "";
                combo.Focus();
                throw new ArgumentException(textoEmCasoDeErro);
    
            }

    Esa função varre o dataSource do seu combo fazendo um Like com os itens. Daí se voce digitar somente parte do texto o método já completa automaticamente no evento leave ;)

    Se ajudou não esqueça de marcar ;)

    quinta-feira, 29 de novembro de 2012 18:48