none
Duplicando valores do CheckBoxList RRS feed

  • Pergunta

  • Bom dia!

    Pessoal eu tenho um método que quando o usuário clica no check ele já salva no banco, mas estou com um problema.

    Por exemplo:

    []Carro

    []Moto

    []Caminhão

    Se eu clico no carro já salva no banco, mas quando eu clico também na moto sendo que o carro já esta selecionado salva novamente o caro, ou seja, vou ter duas vezes o carro no banco sendo que selecionei apenas uma vez.

    O que faço para que eu selecione os 3 salve cada 1 apensas uma vez?

    Consegui explicar?

    Abaixo segue meu code:

     protected void ckProducts_SelectedIndexChanged(object sender, EventArgs e)
            {
                int ComboID = 0;
                if (hfComboID.Value != "")
                    ComboID = int.Parse(hfComboID.Value);
    
                int SchoolID = int.Parse(ddlSchool.SelectedValue);
    
                for (int i = 0; i < ckProducts.Items.Count; i++)
                {
                    int ProductID = Convert.ToInt32(ckProducts.Items[i].Value);
                 
                        if (ckProducts.Items[i].Selected)
                        {
    
                            lista.Add(Convert.ToInt32(ckProducts.Items[i].Value));
                            B.Combo obj = new B.Combo(SchoolID, ComboID, (Convert.ToInt32(ckProducts.Items[i].Value)), txtName.Text, int.Parse(valor.ToString()));
                            B.Combo.Save(obj);
    
                         
                        }
                   
                
                }

    terça-feira, 3 de dezembro de 2013 11:31

Todas as Respostas

  • Na verdade você tem que ver a regra que você precisa usar.....ele realmente tem que salvar no banco assim que o check é marcado?

    Minha sugestão seria que o usuário confirme os checkbox selecionados no clique de um botão, e então aí sim você percorreria o checkboxlist para verificar quais checks foram selecionados, e faria todos os inserts na mesma operação.

    terça-feira, 3 de dezembro de 2013 11:42
  • Então, tem que ser assim mesmo.

    :(

    terça-feira, 3 de dezembro de 2013 12:55
  • Use a vantagem do List ou seja lambda
    if(lista.Exists(i => i.seucampo == Convert.ToInt32(ckproducts.Items[i].Value))
    //ele retorna true se ja existe isso na sua lista
    //ai vc NAO CHAMA o metodo GRAVAR
    else
      //CHAMA METODO GRAVAR

    terça-feira, 3 de dezembro de 2013 13:12
  • Daniel.

    Desculpa a minha ignorância, mas eu não entendi a parte do  seucampo , que campo?É o check, não sei como identificar.

    Tu pode me explicar melhor?

    terça-feira, 3 de dezembro de 2013 13:29
  • Eu tentei e deu esse erro com o i

    Error	5	A local variable named 'i' cannot be declared in this scope because it would give a different meaning to 'i', which is already used in a 'parent or current' scope to denote something else	D:\TFS\IASD.ASCS\IASD.ASCS.WebForm\register\combos\Default.aspx.cs	118	34	IASD.ASCS.WebForm
    

    A linha ficou assim:

    Era isso que eu devia fazer?

    int ProductID = Convert.ToInt32(ckProducts.Items[i].Value);
    
                    if (lista.Exists(i => ProductID == Convert.ToInt32(ckProducts.Items[i].Value))){

    terça-feira, 3 de dezembro de 2013 13:33
  • Não esse seu List<> ou seja sua lista existe quais campos ? esse i.nomeseucampo 

    Seria o campo na sua lista que vc deseja comparar com o campo do checkbox entendeu ?

    axo que ficaria se na sua lista existir o campo ProductID ficaria assim

    if(lista.Exists(i => i.ProductID == ProductID))
    //nao salva
    else
    //salva
    Entende é uma comparação se o id na sua variavel ProductID existe na sua lista.

    • Sugerido como Resposta Guilherme da Luz terça-feira, 3 de dezembro de 2013 14:16
    terça-feira, 3 de dezembro de 2013 13:51
  • Na verdade o List parece ser de int:

    Use:

    if (lista.Exists(i => i== Convert.ToInt32(ckProducts.Items[i].Value))){

    terça-feira, 3 de dezembro de 2013 14:07
  • Daniel,

    Esta dando esse erro.

    Esta falando do i

    Error	9	A local variable named 'i' cannot be declared in this scope because it would give a different meaning to 'i', which is already used in a 'parent or current' scope to denote something else	D:\TFS\IASD.ASCS\IASD.ASCS.WebForm\register\combos\Default.aspx.cs	110	34	IASD.ASCS.WebForm
    

    terça-feira, 3 de dezembro de 2013 16:50
  • Guilherme Obrigada por resposder também, mas o seu esta dando o esmo erro:

    Error	9	A local variable named 'i' cannot be declared in this scope because it would give a different meaning to 'i', which is already used in a 'parent or current' scope to denote something else	D:\TFS\IASD.ASCS\IASD.ASCS.WebForm\register\combos\Default.aspx.cs	110	34	IASD.ASCS.WebForm
    

    terça-feira, 3 de dezembro de 2013 16:51
  • Verdade, já existe uma variável i no seu método, troque para:

    if (lista.Exists(a => a == Convert.ToInt32(ckProducts.Items[i].Value))){


    terça-feira, 3 de dezembro de 2013 16:56
  • Jaque o i é apenas um alias vc pode por o nome que quiser por exemplo

    if(lista.Exists(jaque => jaque == //e apenas um alias para expressao lambda

    terça-feira, 3 de dezembro de 2013 16:58
  • Hum...entendi meninos, ma solha só.

    Quando eu coloco este if não salva nada no banco.

    terça-feira, 3 de dezembro de 2013 18:28
  • Meu code esta assim:

     protected void btnSave_Click1(object sender, ImageClickEventArgs e)
            {
                int ComboID = 0;
                if (hfComboID.Value != "")
                    ComboID = int.Parse(hfComboID.Value);
    
                int SchoolID = int.Parse(ddlSchool.SelectedValue);
    
                for (int i = 0; i < ckProducts.Items.Count; i++)
                {
                    int ProductID = Convert.ToInt32(ckProducts.Items[i].Value);
    
                   if (lista.Exists(check => ProductID == ProductID))
                   {
                        if (ckProducts.Items[i].Selected)
                        {
    
                            lista.Add(Convert.ToInt32(ckProducts.Items[i].Value));
                            
                            
                            string preco = ckProducts.Items[i].Text;
                            string[] separador = new string[] { "R$"};
                            string[] resultado = preco.Split(separador, StringSplitOptions.None);
    
                           string valorPreco = null;
                            if (resultado.Length == 2)
                            {
                                valorPreco = resultado[1];
                            }
                            
    
                            Sum = Sum + float.Parse(valorPreco);
                            B.Combo obj = new B.Combo(SchoolID, ComboID, (Convert.ToInt32(ckProducts.Items[i].Value)), txtName.Text, decimal.Parse(Sum.ToString()));
                            B.Combo.Save(obj);
    
                          
                         
                        }
    
                    }
                         
    
                 }
            }
    

    terça-feira, 3 de dezembro de 2013 18:29
  • Jaque esta sua lista é de qual tipo de uma classe de int mostre o tipo que ela é por ex :

    List<int> lista = new List<int>();

    O que é e se for de uma classe mostre tbm a classe.

    terça-feira, 3 de dezembro de 2013 18:45
  • Ela é global

      List<int> lista = new List<int>();

    terça-feira, 3 de dezembro de 2013 19:27
  • Então na sua linha do if assim :

    if (lista.Exists(check => check == ProductID)){

    Vai funcionar.

    terça-feira, 3 de dezembro de 2013 19:31
  • Não salva no banco quando eu uso este if;

    :(

    quarta-feira, 4 de dezembro de 2013 01:17
  • Jaque o seu if está errado, isso é logica  lembra que te passei que o Exist retorna verdadeiro se o item existe e falso se nao existe entao faz assim :

    if (lista.Exists(check => check != ProductID))

    quarta-feira, 4 de dezembro de 2013 12:54
  • Daniel,

    Eu não estou entendendo o que a linha esta fazendo.

    Esta é a verdade! 

    => (Quem é esse cara?)

    quarta-feira, 4 de dezembro de 2013 18:28
  • Tirei do for e foi resolvido! ;)
    quinta-feira, 5 de dezembro de 2013 15:37
  • Feche o post abraços, só para complementar o => é uma expressão LAMBDA ! Ou seja o nome é apenas um alias uma expressão procure estudar linq e lambda Expression.
    sexta-feira, 6 de dezembro de 2013 09:49