Inquiridor
combobox não deixar colocar valor diferente da lista

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...
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.
-
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 ;)