COMBOBOX PROBLEMA TECLA ENTER

LUIS.HERRERA 28/03/2013 09:54:42
#421164
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?
ELUCIMAR 01/04/2013 20:23:38
#421378
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.
LUIS.HERRERA 03/04/2013 09:22:39
#421442
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.
LUIS.HERRERA 04/04/2013 08:49:44
#421497
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.
}
Tópico encerrado , respostas não são mais permitidas