none
Como limpar comboBox no c#

    Question

  • Boa tarde pessoal,

    Estou tentando limpar uma comboBox e estou tendo alguns problemas.

    Mando carregar o combo, porém se clicar no combo novamente ele é populado com as informações do BD novamente.

    Como tenho 12 combos na minha aplicação, cada vez que clico em um deles as informações são carregadas novamente conforme o numero de cliques que preciso pra carregar o combo.

    Não sei se entendem, mas se puder me ajudar agradeço.

    Já tentei comboBox1.Items.Clear(); no form load, na classe que carrega o combo, limpa o combo mas não seleciona a opção desejada e continua populando conforme o numero de cliques.


    Andre Luis Gomes da Silva
    Friday, May 06, 2011 8:55 PM

Answers

  • o duplicar depende de como voce atribui a data no teu combobox. se usa add, entao e bem provavel que ele duplique.

    eu estive a ver o teu codigo, cara, voce precisa usar parametros. tens de organizar melhor. quando fazes insertes nao precisas colocar os campos mais sim os valores, fica facil de gerir o codigo.

    estas a usar n-tier, quero dizer camadas?

     


    One word frees us of all the weight and pain of life: that word is love.
    • Proposed as answer by Luiz Estevam Thursday, May 12, 2011 2:20 AM
    • Unproposed as answer by Luiz Estevam Thursday, May 12, 2011 2:20 AM
    • Proposed as answer by Luiz Estevam Thursday, May 12, 2011 2:21 AM
    • Marked as answer by Andre_Luis Thursday, May 12, 2011 12:39 PM
    • Marked as answer by Andre_Luis Thursday, May 12, 2011 12:39 PM
    Thursday, May 12, 2011 12:08 AM
  • André, o Malange já te passou algumas dicas, mas estava olhando seu código e realmente existem coisas erradas.

    No evento Load você faz o carregamento de todos os combos, conforme código abaixo.

    carregar_cliente(); 
    carregar_codprod();
    carregar_nomeprod();
    carregar_nomeprod1();
    carregar_nomeprod2();
    carregar_nomeprod3();
    carregar_nomeprod4();
    carregar_nomeprod5();
    carregar_nomeprod6();
    carregar_nomeprod7();
    carregar_nomeprod8();
    carregar_nomeprod9();
    carregar_nomeprod10();
    carregar_total();
    carregar_total1();
    carregar_total2();
    carregar_total3();
    carregar_total4();
    carregar_total5();
    carregar_total6();
    carregar_total7();
    carregar_total8();
    carregar_total9();
    carregar_total10();
    
    

    Ok, combos estão alimentados, então vamos para seu evento SelectedIndexChange do primeiro combo, veja que no evento primeiramente você pega o nome selecionado, e logo depois já chama novamente o método carregar_cliente() ok? Coloquei junto o método em questão e verá que neste método você novamente adiciona os clientes no mesmo combo, assim multiplicando seus valores, conforme o Malange havia comentado.

    private void cB1_SelectedIndexChanged(object sender, EventArgs e)
    {
    	nome = cB1.SelectedItem.ToString();
    	carregar_cliente();
    
    	foreach (DataRow row in dt.Rows)
    	{
    	nome = (("nome_fan").ToString());
    	}
    }
    
    private void carregar_cliente()
    {
    	SqlCommand cmd = new SqlCommand();
    	cmd.Connection = con;
    	cmd.CommandType = CommandType.Text;
    	cmd.CommandText = "select nome_fan from dbo.TbRecebimento";
    	cmd.CommandTimeout = 10;
    
    	SqlDataReader dr = cmd.ExecuteReader();
    	dt.Clear();
    	dt.Load(dr); 
    
    	for (int i = 0; i < dt.Rows.Count; i++)
    	{
    		cB1.Items.Add(dt.Rows[i]["nome_fan"].ToString());
    	}
    }
    
    
    

    Já no evento do segundo combo, a situação é ainda mais complicada, veja o código de seleção do segundo combo, você recebe o codigo selecionado e em seguida chama 3 métodos, veja também que no foreach você não esta fazendo nada ou foi algum erro na cópia do código.

    private void cB2_SelectedIndexChanged(object sender, EventArgs e)
    {
    	codigo = cB2.SelectedItem.ToString();
    	carregar_codprod();
    	carregar_nomeprod();
    	carregar_total();
    
    	foreach (DataRow row in dt3.Rows)
    	{
    	codigo = (("cod_prod").ToString());
    	}
    
    	label1.Text = dt3.Rows[0]["nome_prod"].ToString();
    	label12.Text = dt4.Rows[0]["total"].ToString();
    }
    

    Método carregar_codprod(), veja que neste método a cada código de produto encontrado no seu select você faz uma inserção no combo2 até o combo12, ou seja, mais uma vez você está multiplicando os registros nestes combos.

    private void carregar_codprod()
    {
    	SqlCommand cmd = new SqlCommand();
    	cmd.Connection = con;
    	cmd.CommandType = CommandType.Text;
    	cmd.CommandText = "select cod_prod from dbo.TbProdutos";
    	cmd.CommandTimeout = 10;
    
    	SqlDataReader dr = cmd.ExecuteReader();
    	dt1.Clear();
    	dt1.Load(dr);
    
    	for (int i = 0; i < dt1.Rows.Count; i++)
    	{
    	cB2.Items.Add(dt1.Rows[i]["cod_prod"].ToString());
    	cB3.Items.Add(dt1.Rows[i]["cod_prod"].ToString());
    	cB4.Items.Add(dt1.Rows[i]["cod_prod"].ToString());
    	cB5.Items.Add(dt1.Rows[i]["cod_prod"].ToString());
    	cB6.Items.Add(dt1.Rows[i]["cod_prod"].ToString());
    	cB7.Items.Add(dt1.Rows[i]["cod_prod"].ToString());
    	cB8.Items.Add(dt1.Rows[i]["cod_prod"].ToString());
    	cB9.Items.Add(dt1.Rows[i]["cod_prod"].ToString());
    	cB10.Items.Add(dt1.Rows[i]["cod_prod"].ToString());
    	cB11.Items.Add(dt1.Rows[i]["cod_prod"].ToString());
    	cB12.Items.Add(dt1.Rows[i]["cod_prod"].ToString());
    	}
    }
    

    Já nos métodos carregar_nomeprod e carregar_total você fez o select porém não os utiliza.
    Já os outros combos, pelo que olhei por cima,  fazem a mesma coisa que o combo2, ou seja, vão multiplicando as inserções nos combos através destes métodos.

    Infelizmente ainda não consegui entender o que realmente precisa fazer. assim como o Malange comentou seria melhor você organizar melhor seu código para que você mesmo não se perca nele em futuras manutenções. No seu primeiro post você diz que o problema realmente é só a multiplicação dos campos, então acho que você esta confundindo, algumas coisa, quando você chama o método "carregar_cliente" no Load do form, você já preenchimento do combo1, o evento "SelectedIndexChanged" serve para você verificar o item selecionado e não para realizar o carregamento do mesmo, então se quiser faça o teste trocando o código abaixo.

    private void cB1_SelectedIndexChanged(object sender, EventArgs e)
    {
    	nome = cB1.SelectedItem.ToString();
    	MessageBox.Show(nome);
    }
    

    Você verá que ele não multiplicará as informações e somente mostrará um alerta com o item selecionado.

    Espero que consiga entender e acertar seu código.

     


    Abraço

    Estevam

    **** Se a reposta foi útil, então não esqueça de marca-lá. ***
    • Marked as answer by Andre_Luis Thursday, May 12, 2011 12:35 PM
    Thursday, May 12, 2011 4:03 AM

All replies

  • Realmente esta dificil de entender o seu cenario.

    Se eu entendi voce tem 12 combos no seu form. Verifique o que dispara o preenchimento de dados na combo (imagino que vc deva estar carregando-os manualmente e nao usando o databind)

     

    Eu sempre coloco a limpeza da combo junto com a rotina de preencimento, exemplo:

     

    lstEstados.Items.Clear();

     

     

    foreach(DataRow orow in Estados.Rows)

     

     

    lstEstados.Add(Items.Add(new ListItem() { Value = Convert.ToString(dr["EstadoID"]), Text = Convert.ToString(dr["Nome"]) });

     

     

    Att


    William John Adam Trindade
    Analyste-programmeur
    ----------------------------------------------------------

    SOGI INFORMATIQUE LTÉE (http://www.sogi.com)
    Saturday, May 07, 2011 1:49 AM
  • Andre, conforme o William já passou para você para limpar o combobox é só utilizar o combobox.Items.Clear().

    Quando ao seu problema, como você que ao clicar (ao selecionar um valor) os dados são multiplicados dentro da combox, provavelmente você habilitou o "AutoPostBack" dos combobox, e no evento Page_Load da página, que provavelmente é aonde faz o carregamento dos combos, você não colocou a criação dos combos dentro. !Page.IsPostBack, ou seja, teria que ficar ais ou menos assim:

    protected void Page_Load(object sender, EventArgs e)
    {
         if ( !Page.IsPostBack )
         {
                // Carregar Combos
         }

    }

     


    Abraço

    Estevam

    **** Se a reposta foi útil, então não esqueça de marca-lá. ***
    Saturday, May 07, 2011 4:04 AM
  • Bom dia,

    Vou tentar explicar de outra forma:

    Criei uma classe pra popular o combo com as informações do BD:

    private void carregar_campo()

    {

          SqlCommand cmd = new SqlCommand();

          cmd.Connection = con; //faz a conexão com BD

          cmd.CommandType = CommandType.Text;

          cmd.CommandText = "select nome_do_campo from TableToDB where cod_campo like "+" "'%"+comboBox1.Text+" "%'";

          cmd.CommandTimeout = 10;

     

         SqlDataReader dr = cmd.ExecuteReader();

         dt.Clear();

         dt.Load(dr);

    }

    Bom depois chamo o combo pra carregar as informações:

    private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)

    {

         codigo = comboBox1.SelectedItem.ToString();

         carregar_campo();

         foreach (DataRow row in dt.Rows)

         {

              codigo = (("nome_do_campo").ToString());

         }

    }

    Aí executo o programa, clico no combo e seleciono um item que foi carregado. É aí que aparece o problema, se eu quiser usar outro campo, o combo popula com as informações do campo duplicados. Se eu selecionar algum campo, e clicar de novo no combo ele vai popular triplicado e assim por diante, ele só apaga se eu fechar o combo e reiniciar o programa.

    Não sei se deu pra entender, se eu mandar limpar depois do foreach ele mantém o combo vazio, se mando antes do foreach ele não tem efeito. Se coloco junto com o foreach ele limpa os campos porém é visivel que mesmo sem informações no campo ele duplicou.

    O interessante é que os outros combos vão duplicando sucessivamente. Por exemplo, preciso carregar 11 combos com codigo de produto.

    O primeiro carrega normal, o segundo duplica, o terceiro triplica, e assim por diante, no 11º combo tenho um combo carregado com as informações do BD 10 vezes! como isso?


    Andre Luis Gomes da Silva
    Saturday, May 07, 2011 2:36 PM
  • Andre, sua duvida ou sua aplicação esta confusa, se você já tem o comboBox1 com os valores listados, porque ao selecionar um valor você quer limpa-lo e incluir os valores novamente?

    Pelo o que entendi o que você gostaria de fazer é selecionar um valor no comboBox1 e incluir os valores no comboBox2 certo?

    Bom de qualquer forma tente o código abaixo:

    private void carregar_campo(string texto, ComboBox cb)
    {
      SqlCommand cmd = new SqlCommand();
      cmd.Connection = con;
      cmd.CommandType = CommandType.Text;
      cmd.CommandText = "select nome_do_campo from TableToDB where cod_campo like @campo_texto";
    	cmd.Paramters.Add("@campo_texto","'%" + texto + "%'");
    
      SqlDataReader dr = cmd.ExecuteReader();
      dt.Clear();
      dt.Load(dr);
    	
    	cb.DataSource = dt;
    	cb.DataTextField = "nome_do_campo";
    	cb.DataBind();
    }
    
    private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
    {
      codigo = comboBox1.SelectedItem.ToString();
    	carregar_campo(codigo, comboBox2);
    }
    


    Abraço

    Estevam

    **** Se a reposta foi útil, então não esqueça de marca-lá. ***
    Saturday, May 07, 2011 5:58 PM
  • Boa tarde, Estevam.

    Não, o problema que ocorre é meio estranho e nem sei explicar direito.

    Não tenho problema com minha select pois ela carrega informações de outro combo facilmente, sofri um pouco pra fazer isso mas beleza consegui, o que acontece é diferente veja só.

    Mando o combo carregar como no exemplo acima, executo o programa e ele carrega perfeitamente, seleciono um item dentro do combo beleza, também funciona.

    Agora vou tentar explicar de novo.

    Vamos supor que quero carregar o primeiro combo com o nome do cliente. No combo aparece o nome de todos os clientes cadastrados no BD, exemplo:

    André

    Luiz

    José

    Neste caso, seleciono André.

    É a partir daí que está o problema, no outro combo quando vou selecionar o nome do cliente aparece assim:

    André

    Luiz

    José

    André

    Luiz

    José

    Seleciono qualquer nome. Quando eu clicar no próximo combo, vai aparecer assim:

    André

    Luiz

    José

    André

    Luiz

    José

    André

    Luiz

    José

    E assim vai acontecer até ao 12º combo, conforme vou selecionando os nomes ele vai duplicando, por que?

    Esse é o problema.

     


    Andre Luis Gomes da Silva
    Monday, May 09, 2011 7:56 PM
  • Andre, realmente esta estranho e ficar chutando o que esta ocorrendo não vai adiantar, se possível envie os códigos do utlizandos para verificarmos, se for Asp.net envie também o código asp.net.

     


    Abraço

    Estevam

    **** Se a reposta foi útil, então não esqueça de marca-lá. ***
    Monday, May 09, 2011 9:36 PM
  • Não estou conseguindo carregar o codigo. Se vc tiver um email pra que eu possa te enviar, agradeço.

    Aparece mensagem de erro inesperado.


    Andre Luis Gomes da Silva

    Tuesday, May 10, 2011 7:50 PM
  • Como eu iniciante eu faço de um jeito não muito complicado pra mim

     

    eu crio

     

    private void LimparCampos()

    { //Limpo o campo 1

    texbox1.Text= "";

    texbox2.Text="";

    //e assim por diante }

     

    }

    //depois chamo o metodo LimparCampos(); logo apos o metodo inserir, pra mim ta funcionado blz marca como util ai.

     


    Tuesday, May 10, 2011 8:25 PM
  • Tuesday, May 10, 2011 8:56 PM
  • Só que neste caso é melhor usar

    comboBox1.Items.Clear();

    Vai fazer a mesma coisa que criar uma classe pra limpar o combo.

    E não é esse meu problema. Não quero simplesmente limpar o combo, pois isso ele já faz quando chamo

    Dt.Clear();

    O que quero é que ele pare de duplicar durante a execução do programa.


    Andre Luis Gomes da Silva
    Tuesday, May 10, 2011 9:38 PM
  • André, se puder coloque os arquivos em um zip e coloque em um site de compartilhamento ou ftp e envie que faço o download.

     


    Abraço

    Estevam

    **** Se a reposta foi útil, então não esqueça de marca-lá. ***
    Wednesday, May 11, 2011 1:13 AM
  • Boa noite, Luiz.

    Bom estou no trabalho então não será possivel enviar por ftp.

    Mas postei no meu blog(que nem sei pra fiz aquilo, kkkk).

    Dá uma olhada lá.

    http://andre-missoesmonterrey.blogspot.com/2011/05/codigo-c.html

    Abraços.


    Andre Luis Gomes da Silva
    Wednesday, May 11, 2011 11:45 PM
  • o duplicar depende de como voce atribui a data no teu combobox. se usa add, entao e bem provavel que ele duplique.

    eu estive a ver o teu codigo, cara, voce precisa usar parametros. tens de organizar melhor. quando fazes insertes nao precisas colocar os campos mais sim os valores, fica facil de gerir o codigo.

    estas a usar n-tier, quero dizer camadas?

     


    One word frees us of all the weight and pain of life: that word is love.
    • Proposed as answer by Luiz Estevam Thursday, May 12, 2011 2:20 AM
    • Unproposed as answer by Luiz Estevam Thursday, May 12, 2011 2:20 AM
    • Proposed as answer by Luiz Estevam Thursday, May 12, 2011 2:21 AM
    • Marked as answer by Andre_Luis Thursday, May 12, 2011 12:39 PM
    • Marked as answer by Andre_Luis Thursday, May 12, 2011 12:39 PM
    Thursday, May 12, 2011 12:08 AM
  • André, o Malange já te passou algumas dicas, mas estava olhando seu código e realmente existem coisas erradas.

    No evento Load você faz o carregamento de todos os combos, conforme código abaixo.

    carregar_cliente(); 
    carregar_codprod();
    carregar_nomeprod();
    carregar_nomeprod1();
    carregar_nomeprod2();
    carregar_nomeprod3();
    carregar_nomeprod4();
    carregar_nomeprod5();
    carregar_nomeprod6();
    carregar_nomeprod7();
    carregar_nomeprod8();
    carregar_nomeprod9();
    carregar_nomeprod10();
    carregar_total();
    carregar_total1();
    carregar_total2();
    carregar_total3();
    carregar_total4();
    carregar_total5();
    carregar_total6();
    carregar_total7();
    carregar_total8();
    carregar_total9();
    carregar_total10();
    
    

    Ok, combos estão alimentados, então vamos para seu evento SelectedIndexChange do primeiro combo, veja que no evento primeiramente você pega o nome selecionado, e logo depois já chama novamente o método carregar_cliente() ok? Coloquei junto o método em questão e verá que neste método você novamente adiciona os clientes no mesmo combo, assim multiplicando seus valores, conforme o Malange havia comentado.

    private void cB1_SelectedIndexChanged(object sender, EventArgs e)
    {
    	nome = cB1.SelectedItem.ToString();
    	carregar_cliente();
    
    	foreach (DataRow row in dt.Rows)
    	{
    	nome = (("nome_fan").ToString());
    	}
    }
    
    private void carregar_cliente()
    {
    	SqlCommand cmd = new SqlCommand();
    	cmd.Connection = con;
    	cmd.CommandType = CommandType.Text;
    	cmd.CommandText = "select nome_fan from dbo.TbRecebimento";
    	cmd.CommandTimeout = 10;
    
    	SqlDataReader dr = cmd.ExecuteReader();
    	dt.Clear();
    	dt.Load(dr); 
    
    	for (int i = 0; i < dt.Rows.Count; i++)
    	{
    		cB1.Items.Add(dt.Rows[i]["nome_fan"].ToString());
    	}
    }
    
    
    

    Já no evento do segundo combo, a situação é ainda mais complicada, veja o código de seleção do segundo combo, você recebe o codigo selecionado e em seguida chama 3 métodos, veja também que no foreach você não esta fazendo nada ou foi algum erro na cópia do código.

    private void cB2_SelectedIndexChanged(object sender, EventArgs e)
    {
    	codigo = cB2.SelectedItem.ToString();
    	carregar_codprod();
    	carregar_nomeprod();
    	carregar_total();
    
    	foreach (DataRow row in dt3.Rows)
    	{
    	codigo = (("cod_prod").ToString());
    	}
    
    	label1.Text = dt3.Rows[0]["nome_prod"].ToString();
    	label12.Text = dt4.Rows[0]["total"].ToString();
    }
    

    Método carregar_codprod(), veja que neste método a cada código de produto encontrado no seu select você faz uma inserção no combo2 até o combo12, ou seja, mais uma vez você está multiplicando os registros nestes combos.

    private void carregar_codprod()
    {
    	SqlCommand cmd = new SqlCommand();
    	cmd.Connection = con;
    	cmd.CommandType = CommandType.Text;
    	cmd.CommandText = "select cod_prod from dbo.TbProdutos";
    	cmd.CommandTimeout = 10;
    
    	SqlDataReader dr = cmd.ExecuteReader();
    	dt1.Clear();
    	dt1.Load(dr);
    
    	for (int i = 0; i < dt1.Rows.Count; i++)
    	{
    	cB2.Items.Add(dt1.Rows[i]["cod_prod"].ToString());
    	cB3.Items.Add(dt1.Rows[i]["cod_prod"].ToString());
    	cB4.Items.Add(dt1.Rows[i]["cod_prod"].ToString());
    	cB5.Items.Add(dt1.Rows[i]["cod_prod"].ToString());
    	cB6.Items.Add(dt1.Rows[i]["cod_prod"].ToString());
    	cB7.Items.Add(dt1.Rows[i]["cod_prod"].ToString());
    	cB8.Items.Add(dt1.Rows[i]["cod_prod"].ToString());
    	cB9.Items.Add(dt1.Rows[i]["cod_prod"].ToString());
    	cB10.Items.Add(dt1.Rows[i]["cod_prod"].ToString());
    	cB11.Items.Add(dt1.Rows[i]["cod_prod"].ToString());
    	cB12.Items.Add(dt1.Rows[i]["cod_prod"].ToString());
    	}
    }
    

    Já nos métodos carregar_nomeprod e carregar_total você fez o select porém não os utiliza.
    Já os outros combos, pelo que olhei por cima,  fazem a mesma coisa que o combo2, ou seja, vão multiplicando as inserções nos combos através destes métodos.

    Infelizmente ainda não consegui entender o que realmente precisa fazer. assim como o Malange comentou seria melhor você organizar melhor seu código para que você mesmo não se perca nele em futuras manutenções. No seu primeiro post você diz que o problema realmente é só a multiplicação dos campos, então acho que você esta confundindo, algumas coisa, quando você chama o método "carregar_cliente" no Load do form, você já preenchimento do combo1, o evento "SelectedIndexChanged" serve para você verificar o item selecionado e não para realizar o carregamento do mesmo, então se quiser faça o teste trocando o código abaixo.

    private void cB1_SelectedIndexChanged(object sender, EventArgs e)
    {
    	nome = cB1.SelectedItem.ToString();
    	MessageBox.Show(nome);
    }
    

    Você verá que ele não multiplicará as informações e somente mostrará um alerta com o item selecionado.

    Espero que consiga entender e acertar seu código.

     


    Abraço

    Estevam

    **** Se a reposta foi útil, então não esqueça de marca-lá. ***
    • Marked as answer by Andre_Luis Thursday, May 12, 2011 12:35 PM
    Thursday, May 12, 2011 4:03 AM
  • Meu irmão, show!

    Sozinho eu não iria entender essa bagunça que fiz, valeu mesmo.

    Tenho certeza que ainda vão me ajudar bastante neste negócio, pois estou iniciando em c# e ainda não compreendo todos os conceitos.

    E Malange, não aprendi a programar usando n-tier.

    Como vc pode ver uso a mesma linha de código para todos os forms, acho que deveria criar classes e não métodos para implementar o código,

    só que estou sem tempo para pesquisar isso no momento. O cliente quer o codigo do jeito que está, futuramente pretendo atualizar o sistema então certamente vou ter que aprender. Por hora, agradeço a atenção de vcs, até uma próxima vez. Abraço!


    Andre Luis Gomes da Silva
    Thursday, May 12, 2011 12:35 PM
  • Pois é, gostaria muito de saber como se faz isso, meu professor me ensinou desta forma o resto a gente tem que se virar como pode. Pra se ter uma ideia ainda preciso fazer um form pra receber as informações dos outros forms e imprimir essas informações.

    Abraço.


    Andre Luis Gomes da Silva
    Thursday, May 12, 2011 12:39 PM