COMBOBOX PROBLEMA TECLA ENTER
Bom dia! C# 2008 - Framework 3.5 - Windows Forms Aplication
Fiz um combo com autopreenchimento configurado assim:
cboDepartamentos.DisplayMember = [Ô]DEPTO[Ô];
cboDepartamentos.ValueMember = [Ô]ID[Ô];
cboDepartamentos.DataSource = objDepartamentos.CarregaCombo(myTipo);
cboDepartamentos.AutoCompleteMode = AutoCompleteMode.SuggestAppend;
cboDepartamentos.AutoCompleteSource = AutoCompleteSource.ListItems;
cboDepartamentos.SelectedIndex = -1;
cboDepartamentos.Refresh();
O form está com Keypress = true;
No evento Keypress do combo incluÃ:
private void cboDepartamentos_KeyPress(object sender, KeyPressEventArgs e)
{
//habilitar a abertura automatica da combo.
cboDepartamentos.DroppedDown = true;
}
Problema 1:
Ao digitar um texto no combo, ele é localizado corretamente, porém só é selecionado (carregado para o campo ou setado o item localizado) se for pressionado a tecla TAB. Se pressionar a tecla ENTER ele limpa o controle e não seleciona o item. Como o padrão pro usuário é pressionar sempre ENTER, como faço para ele aceitar o ENTER e selecionar?
Porém se eu desativar o cboDepartamentos.DroppedDown = false; ele aceita o ENTER para selecionar o item, mas não exibe a lista ao usuário e se o usuário abrir a lista pela setinha do controle e digitar o texto, o ENTER já não funciona novamente.
Problema 2:
O Enter não funcionando, também não consigo fazer com que o foco do controle mude de campo após pressionar o ENTER, parece que ele está desativado no Combobox. Fica muito estranho ao usuário, na maioria dos campos usar o ENTER para tabular e no combo ser obrigado a usar o TAB. Com isso também não consigo interceptar o ENTER no evento Keypress para pegar o conteúdo selecionado, exemplo: atualizar outro controle em função do conteúdo selecionado:
private void cboDepartamentos_KeyPress(object sender, KeyPressEventArgs e)
{
//compara tecla com ENTER
if (e.KeyChar == Convert.ToChar(13)) // Se pressionar o ENTER esse evento não é disparado, só com outras teclas.
{
cboDepartamentos.DroppedDown = false;
MessageBox.Show([Ô]ID = [Ô] + cboDepartamentos.SelectedItem + [Ô] - Texto = [Ô] + cboDepartamentos.SelectedText);
}
}
Nota: Já pesquisei na web, e encontrei um monte de perguntas semelhantes, mas nenhuma com resposta que funcione. Será que esse BUG não tem solução?
Fiz um combo com autopreenchimento configurado assim:
cboDepartamentos.DisplayMember = [Ô]DEPTO[Ô];
cboDepartamentos.ValueMember = [Ô]ID[Ô];
cboDepartamentos.DataSource = objDepartamentos.CarregaCombo(myTipo);
cboDepartamentos.AutoCompleteMode = AutoCompleteMode.SuggestAppend;
cboDepartamentos.AutoCompleteSource = AutoCompleteSource.ListItems;
cboDepartamentos.SelectedIndex = -1;
cboDepartamentos.Refresh();
O form está com Keypress = true;
No evento Keypress do combo incluÃ:
private void cboDepartamentos_KeyPress(object sender, KeyPressEventArgs e)
{
//habilitar a abertura automatica da combo.
cboDepartamentos.DroppedDown = true;
}
Problema 1:
Ao digitar um texto no combo, ele é localizado corretamente, porém só é selecionado (carregado para o campo ou setado o item localizado) se for pressionado a tecla TAB. Se pressionar a tecla ENTER ele limpa o controle e não seleciona o item. Como o padrão pro usuário é pressionar sempre ENTER, como faço para ele aceitar o ENTER e selecionar?
Porém se eu desativar o cboDepartamentos.DroppedDown = false; ele aceita o ENTER para selecionar o item, mas não exibe a lista ao usuário e se o usuário abrir a lista pela setinha do controle e digitar o texto, o ENTER já não funciona novamente.
Problema 2:
O Enter não funcionando, também não consigo fazer com que o foco do controle mude de campo após pressionar o ENTER, parece que ele está desativado no Combobox. Fica muito estranho ao usuário, na maioria dos campos usar o ENTER para tabular e no combo ser obrigado a usar o TAB. Com isso também não consigo interceptar o ENTER no evento Keypress para pegar o conteúdo selecionado, exemplo: atualizar outro controle em função do conteúdo selecionado:
private void cboDepartamentos_KeyPress(object sender, KeyPressEventArgs e)
{
//compara tecla com ENTER
if (e.KeyChar == Convert.ToChar(13)) // Se pressionar o ENTER esse evento não é disparado, só com outras teclas.
{
cboDepartamentos.DroppedDown = false;
MessageBox.Show([Ô]ID = [Ô] + cboDepartamentos.SelectedItem + [Ô] - Texto = [Ô] + cboDepartamentos.SelectedText);
}
}
Nota: Já pesquisei na web, e encontrei um monte de perguntas semelhantes, mas nenhuma com resposta que funcione. Será que esse BUG não tem solução?
Boa Noite Luis !
Deve ser algum problema no componente ComboBox quando se coloca AutoCompleteMode no Evento KeyPress . Fiz os mesmos testes e deu os mesmos problemas. Para contornar coloquei no Evento KeyDown e deu certo.
private void cboDepartamentos_KeyDown(object sender, KeyEventArgs e)
{
if (e.KeyCode == Keys.Enter)
{
SendKeys.Send([Ô]{TAB}[Ô]);
}
}
Se você estiver preechendo a Combo com dados List<T> da sua Classe Departamentos. Você pode pegar as informações da sua combo assim:
ClasseDepartamentos departamento = (ClasseDepartamentos)cboDepartamentos.SelectedItem;
departamento.Campo // e por ai.
Desta forma você pode pegar varias informações através da Combo se tiver necessidade.
Deve ser algum problema no componente ComboBox quando se coloca AutoCompleteMode no Evento KeyPress . Fiz os mesmos testes e deu os mesmos problemas. Para contornar coloquei no Evento KeyDown e deu certo.
private void cboDepartamentos_KeyDown(object sender, KeyEventArgs e)
{
if (e.KeyCode == Keys.Enter)
{
SendKeys.Send([Ô]{TAB}[Ô]);
}
}
Se você estiver preechendo a Combo com dados List<T> da sua Classe Departamentos. Você pode pegar as informações da sua combo assim:
ClasseDepartamentos departamento = (ClasseDepartamentos)cboDepartamentos.SelectedItem;
departamento.Campo // e por ai.
Desta forma você pode pegar varias informações através da Combo se tiver necessidade.
Elucimar bom dia. Inicialmente achei que tinha funcionado, mas hoje fazendo novos testes não resolveu, ou seja, está da mesma forma. Se você abre a lista, seja clicando na setinha ou no comando Shift + Setinha para baixo do teclado, com a lista aberto você tem o autocompletar, mas ao pressionar o ENTER apaga tudo e não seleciona o item ou faz tabulação. Tanto no evento Keypress como Keydown não funciona.
Boa dia.
Escrevo para explicar como resolver esse problema, que certamente outros terão, mas como eu não conseguiram encontrar na Web. Assim espero que encontrem essa explicação que resolve e facilmente, o BUG do Combobox do VS 2008, não sei se nas outras versões ocorre o mesmo.
Passo a Passo:
No load do form povoe e Configure o Combobox assim:
SeuCombo.AutoCompleteMode = AutoCompleteMode.SuggestAppend;
SeuCombo.AutoCompleteSource = AutoCompleteSource.ListItems;
SeuCombo.SelectedIndex = -1;
SeuCombo.Refresh();
Inclua os seguintes eventos
private void SeuCombo_KeyDown(object sender, KeyEventArgs e)
{
if (e.KeyCode == Keys.Enter)
{
SendKeys.Send([Ô]{TAB}[Ô]); // Se pressionar ENTER então envia um TAB
}
}
private void SeuCombo_KeyPress(object sender, KeyPressEventArgs e)
{
cboAreaEmitente.DroppedDown = false; // aqui força o fechamento da lista, antes de digitar para evitar o bug
// apesar disso, o combo exibe outra lista menor com apenas os itens que satisfazem o texto digitado até o momento.
}
Escrevo para explicar como resolver esse problema, que certamente outros terão, mas como eu não conseguiram encontrar na Web. Assim espero que encontrem essa explicação que resolve e facilmente, o BUG do Combobox do VS 2008, não sei se nas outras versões ocorre o mesmo.
Passo a Passo:
No load do form povoe e Configure o Combobox assim:
SeuCombo.AutoCompleteMode = AutoCompleteMode.SuggestAppend;
SeuCombo.AutoCompleteSource = AutoCompleteSource.ListItems;
SeuCombo.SelectedIndex = -1;
SeuCombo.Refresh();
Inclua os seguintes eventos
private void SeuCombo_KeyDown(object sender, KeyEventArgs e)
{
if (e.KeyCode == Keys.Enter)
{
SendKeys.Send([Ô]{TAB}[Ô]); // Se pressionar ENTER então envia um TAB
}
}
private void SeuCombo_KeyPress(object sender, KeyPressEventArgs e)
{
cboAreaEmitente.DroppedDown = false; // aqui força o fechamento da lista, antes de digitar para evitar o bug
// apesar disso, o combo exibe outra lista menor com apenas os itens que satisfazem o texto digitado até o momento.
}
Tópico encerrado , respostas não são mais permitidas