none
SelectedIndex combobox não funcionando como desejado - C# WinForms RRS feed

  • Pergunta

  • Boa noite pessoa, estou com um probleminha na hora de usar o controle Combobox, melhor um componente criado que herda as características do combobox, o que esse componente tem de novo e porém interessante é que o mesmo permite que o usuário realiza busca dos items presente digitando os valores ao qual o combobox vai sugerindo, isso funciona perfeitamente, apenas tem uma pequena validação que eu gostaria de realizar que seria, caso o usuário deletar todo o texto do controle assim que o mesmo perder o foco ele retornar para o primeiro item da minha lista que no caso é apenas um texto amigável (-- Selecione o estado --) no momento o combobox fica vazio.

    O carregamento do combobox está sendo feito através de uma consulta no banco de dados ao qual adiciono o valores em um List<T> para que a minha mensagem apareça antes de colocar os valores retornados do banco de dados eu adiciono um a linha mensagem com o código zero, ao qual ficará no topo da lista.

    Para realizara validação eu tentei:

    private void cbxEstado_Leave(object sender, EventArgs e)
    {
         if(cbxEstado.Text == "")
            cbxEstado.SelectedIndex = 0;
    }

    Porém não funcionou, engraçado se eu coloco por exemplo SelectedIndex = 2 ele seleciona o item 3 da minha lista. Lembrando que minha mensagem é o primeiro da lista.

    PS: Usei como referência esse projeto para criação do auto complete http://www.codeproject.com/Articles/16285/Auto-Complete-ComboBox

    quinta-feira, 10 de dezembro de 2015 00:29

Respostas

  • Bom dia.

    Analisando o código passado pelo link, percebi que o "problema" estava lá.

    No método "AutoComplete", faça isso:

    public void AutoComplete(ComboBox cb, System.Windows.Forms.KeyPressEventArgs e, bool blnLimitToList) { string strFindStr = ""; if (e.KeyChar == (char)8) { if (cb.SelectionStart <= 1) { cb.Text = "-- Selecione o estado --"; cb.SelectionStart = 0; cb.SelectionLength = cb.Text.Length; e.Handled = true; return; } if (cb.SelectionLength == 0) strFindStr = cb.Text.Substring(0, cb.Text.Length - 1); else strFindStr = cb.Text.Substring(0, cb.SelectionStart - 1); }

    // resto do método

    O problema é que antes o método deixava, por padrão, o valor vazio caso o usuário excluísse todo texto.


    Att., Rafael Simor

    • Marcado como Resposta J.AndersonSantos quinta-feira, 10 de dezembro de 2015 14:03
    quinta-feira, 10 de dezembro de 2015 13:08
  • Claro!

    Na verdade é bastante simples:

    if (cb.SelectionStart <= 1)
                    {
                        cb.SelectedIndex = 0;
                        cb.SelectionStart = 0;
                        cb.SelectionLength = cb.Text.Length;
                        e.Handled = true;
                        return;
                    }
    A diferença é que tu precisas adicionar o item no combobox na posição 0.

    Att., Rafael Simor


    • Editado SimorC quinta-feira, 10 de dezembro de 2015 13:48
    • Marcado como Resposta J.AndersonSantos quinta-feira, 10 de dezembro de 2015 14:03
    quinta-feira, 10 de dezembro de 2015 13:48

Todas as Respostas

  • Boa noite.

    Algumas ideias:

    1- Tente com String.IsNullOrEmpty:

    if(String.IsNullOrEmpty(cbxEstado.Text))

    2 - Tente selecionar pelo Value:

    cbxEstado.SelectedValue = 0; // Valor da mensagem padrão

    3 - (Menos provável) tente colocar o index -1:

    cbxEstado.SelectedIndex = -1;

    Att., Rafael Simor

    quinta-feira, 10 de dezembro de 2015 01:19
  • Obrigado pela resposta SimorC porém eu já tinha tentado todas essas opções, debugando o código eu consigo perceber que ele entra na minha instrução depois do if porém parece que quando o usuário deleta todo o texto ele substitui a primeira posição da lista. Porém se eu clico no botão de seleção meu texto está lá normalmente. Também não funcionou tentar selecionar pelo Value. 
    quinta-feira, 10 de dezembro de 2015 08:26
  • Bom dia.

    Analisando o código passado pelo link, percebi que o "problema" estava lá.

    No método "AutoComplete", faça isso:

    public void AutoComplete(ComboBox cb, System.Windows.Forms.KeyPressEventArgs e, bool blnLimitToList) { string strFindStr = ""; if (e.KeyChar == (char)8) { if (cb.SelectionStart <= 1) { cb.Text = "-- Selecione o estado --"; cb.SelectionStart = 0; cb.SelectionLength = cb.Text.Length; e.Handled = true; return; } if (cb.SelectionLength == 0) strFindStr = cb.Text.Substring(0, cb.Text.Length - 1); else strFindStr = cb.Text.Substring(0, cb.SelectionStart - 1); }

    // resto do método

    O problema é que antes o método deixava, por padrão, o valor vazio caso o usuário excluísse todo texto.


    Att., Rafael Simor

    • Marcado como Resposta J.AndersonSantos quinta-feira, 10 de dezembro de 2015 14:03
    quinta-feira, 10 de dezembro de 2015 13:08
  • Rafael Simor, mais uma vez obrigado por sua resposta. Você acha que teria como fazer essa alteração de maneira dinâmica, ou seja, uma maneira que eu possa fazer uso desse controle em outros formulários com outro tipo de informações as quais os textos padrões serão outros?
    quinta-feira, 10 de dezembro de 2015 13:38
  • Claro!

    Na verdade é bastante simples:

    if (cb.SelectionStart <= 1)
                    {
                        cb.SelectedIndex = 0;
                        cb.SelectionStart = 0;
                        cb.SelectionLength = cb.Text.Length;
                        e.Handled = true;
                        return;
                    }
    A diferença é que tu precisas adicionar o item no combobox na posição 0.

    Att., Rafael Simor


    • Editado SimorC quinta-feira, 10 de dezembro de 2015 13:48
    • Marcado como Resposta J.AndersonSantos quinta-feira, 10 de dezembro de 2015 14:03
    quinta-feira, 10 de dezembro de 2015 13:48
  • J.AndersonSantos,

    A resposta do SimorC já satisfaz a pergunta principal/inicial da thread?

    Atenciosamente


    Marcos Roberto de Souza Junior

    Esse conteúdo e fornecido sem garantias de qualquer tipo, seja expressa ou implícita

    MSDN Community Support

    Por favor, lembre-se de Marcar como Resposta as respostas que resolveram o seu problema. Essa e uma maneira comum de reconhecer aqueles que o ajudaram e fazer com que seja mais fácil para os outros visitantes encontrarem a resolução mais tarde.

    quinta-feira, 10 de dezembro de 2015 13:54
  • Muito obrigado Rafael, sua resposta foi de grande auxilio para mim.
    quinta-feira, 10 de dezembro de 2015 14:05