none
Erro - no loop RRS feed

  • Pergunta

  • Bom pessoal, poderiam me ajudar com esse problema?

    Estou apresentando essa mensagem de erro: "Não é possível adicionar ou inserir o item 'PM 1' em mais de um local. Primeiro você precisa removê-lo do local atual ou cloná-lo.

    Nome do parâmetro: item"

    Estou tentando manipular o select abaixo, na segunda coluna do Listview estou apresentando 14 produtos e na terceira coluna preciso exibir os 14 a mensagem se o produto está habilitado ou não ... tentei utilizar 2 SqlDataReader, porém dava erro e pedi pra fechar um ... vocês poderia me auxiliar nesse erro?

     try
                {
                    conn.Open();
                    SqlCommand comand1 = new SqlCommand("SELECT TOP 1 NUMSetup, CodProd1,CodProd2,CodProd3,CodProd4,CodProd5,CodProd6,CodProd7,CodProd8,CodProd9,CodProd10,CodProd11,CodProd12,CodProd13,CodProd14,Habilita1,Habilita2,Habilita3,Habilita4,Habilita5,Habilita6,Habilita7,Habilita8,Habilita9,Habilita10,Habilita11,Habilita12,Habilita13,Habilita14 FROM ProdutosTeste WITH(NOLOCK) ORDER BY NUMSetup DESC", conn);

                    comand1.CommandType = CommandType.Text;

                    SqlDataReader dr1;
                    dr1 = comand1.ExecuteReader();
                    dr1.Read();
                    for (int i = 1; i < 15; i++)
                    {
                        string Produtos = dr1.GetString(i);

                        ListViewItem item = new ListViewItem("PM " + i);

                        item.SubItems.Add("091110" + Produtos);

                        for (int j = 16; j < 29; j++)
                        {
                            int status = dr1.GetInt32(j);

                            if(status == 0)
                            {
                                Convert.ToString(status);
                                item.SubItems.Add(status.ToString("Habilitado"));
                            }
                            else
                            {
                                Convert.ToString(status);
                                item.SubItems.Add(status.ToString("Desabilitado"));
                            }

                            listView1.Items.Add(item);
                        }
                    }

                    conn.Close();
                }
                catch (Exception ex)
                {
                    MessageBox.Show($"Erro favor informar o administrador\nError Message: {ex.Message}\nStackTrace: {ex.StackTrace}");
                }
            }


    terça-feira, 10 de setembro de 2019 13:20

Respostas

  • Copie esse exemplo abaixo que fiz baseado no seu "case" e faça o teste, primeiro execute da forma que esta e depois comente a linha que funciona e descomente a que gera o  erro.

            public static void Lista()
            {
                try
                {
                    var ListView1 = new ListView();
                    int i = 1;
                    while (i <= 15)
                    {
                        string Produtos = Guid.NewGuid().ToString();
                        ListViewItem item = new ListViewItem(string.Concat("PM ", i.ToString()));

                        int j = 1;
                        while (j < 8)
                        {
                            var r = new Random().Next(0, 1);
                            if (Convert.ToBoolean(r))
                                item.SubItems.Add(string.Concat("091110 - Verdadeiro - ", j));
                            else
                                item.SubItems.Add(string.Concat("091110 - Falso - ", j));
                            j++;
                            //Erro
                            //ListView1.Items.Add(item);
                        }
                        //Funciona
                        ListView1.Items.Add(item);
                        i++;
                    }
                }
                catch (Exception ex)
                {
                    var erro = ex.Message;
                }
            }

    ** Se ajudou marque como solução **

    terça-feira, 10 de setembro de 2019 19:30
  • Luciano,

    Ele servirá para mostrar as informações daquela linha do select (que está acima) na ListView para o operador, porém vai ter alguns produtos que estão no banco de dados que irão ficar indisponível, porem a linha do PM+contador vai estar ativa com uma mensagem de Local Indisponível e o numero do PM e eu vou ter que retirar essa linha para tirar um pouco de informação desnecessária, por exemplo:

    Coluna PM | Coluna Prod

    PM 1          | 091110465445

    PM 2           | Local Indisponível 

    Ao invés de exibir essa linha PM 2, eu teria que remove-la, já utilizei esse comando item.Remove(); porém não funcionou.

    • Marcado como Resposta Gabriel Pina segunda-feira, 28 de outubro de 2019 14:00
    quinta-feira, 12 de setembro de 2019 11:20

Todas as Respostas

  • Pelo erro o que esta acontecendo aparentemente é que essa sua lista listaView1 não permite item repetido e isso vai acontecer  porque o codigo listView1.Items.Add(item); esta dentro do loop do da variavel j e o valor de increment que você esta usando é o i (ListViewItem item = new ListViewItem("PM " + i);).
    Considerando isso, faça o seguinte:
    - Essa lista pode conter itens repetidos?
    - Se SIM, verifique como você esta criando essa lista.
    - Se NÃO, altere a variavel de increment, exemplo abaixo:

                                       

                    dr1.Read();
                    var ItemNumeracao = 1;
    for (int i = 1; i < 15; i++)
                    {
                        string Produtos = dr1.GetString(i);

                        ListViewItem item = new ListViewItem("PM " + ItemNumeracao );

                        item.SubItems.Add("091110" + Produtos);

    for (int j = 16; j < 29; j++)
                        {
                            int status = dr1.GetInt32(j);

                            if(status == 0)
                            {
                                Convert.ToString(status);
                                item.SubItems.Add(status.ToString("Habilitado"));
                            }
                            else
                            {
                                Convert.ToString(status);
                                item.SubItems.Add(status.ToString("Desabilitado"));
                            }

                            listView1.Items.Add(item);
                            ItemNumeracao++;

                        }
                    }

                    conn.Close();
                }
                catch (Exception ex)
                {
                    MessageBox.Show($"Erro favor informar o administrador\nError Message: {ex.Message}\nStackTrace: {ex.StackTrace}");
                }
            }


    terça-feira, 10 de setembro de 2019 13:43
  • Luciano, boa tarde.

    Continua apresentando o mesmo erro e não deve conter números repetidos\dados repetidos, poderia me auxiliar?

    terça-feira, 10 de setembro de 2019 17:08
  • Fiz o teste e deu  o mesmo erro, pois o item se repete sim, ja que o seu comando listView1.Items.Add(item); para adicionar o item esta dentro do segundo loop, mas testando com o codigo de add do item no primeiro for conforme abaixo não da erro.

    ** Apenas para complementar, o fato do subitem dos itens serem diferente não muda nada para essa validação do nome do item.

    Exemplo:
    Item: PM 1 -> SubItem: 0911101 / 0911102 / 0911103 
    Item: PM 1 -> SubItem: 0911104 / 0911105 / 0911106

    A inclusão desses Itens provocaria o mesmo erro, mesmo tendo subitens diferentes.

    try
                {
                    conn.Open();
                    SqlCommand comand1 = new SqlCommand("SELECT TOP 1 NUMSetup, CodProd1,CodProd2,CodProd3,CodProd4,CodProd5,CodProd6,CodProd7,CodProd8,CodProd9,CodProd10,CodProd11,CodProd12,CodProd13,CodProd14,Habilita1,Habilita2,Habilita3,Habilita4,Habilita5,Habilita6,Habilita7,Habilita8,Habilita9,Habilita10,Habilita11,Habilita12,Habilita13,Habilita14 FROM ProdutosTeste WITH(NOLOCK) ORDER BY NUMSetup DESC", conn);

                    comand1.CommandType = CommandType.Text;

                    SqlDataReader dr1;
                    dr1 = comand1.ExecuteReader();
                    dr1.Read();
                    for (int i = 1; i < 15; i++)
                    {
                        string Produtos = dr1.GetString(i);
                        ListViewItem item = new ListViewItem("PM " + i);
                        item.SubItems.Add("091110" + Produtos);
                        for (int j = 16; j < 29; j++)
                        {
                            int status = dr1.GetInt32(j);
                            if(status == 0)
                            {
                                Convert.ToString(status);
                                item.SubItems.Add(status.ToString("Habilitado"));
                            }
                            else
                            {
                                Convert.ToString(status);
                                item.SubItems.Add(status.ToString("Desabilitado"));
                            }
                        }
                        listView1.Items.Add(item);
                    }
                    conn.Close();
                }
                catch (Exception ex)
                {
                    MessageBox.Show($"Erro favor informar o administrador\nError Message: {ex.Message}\nStackTrace: {ex.StackTrace}");
                }
            }


    terça-feira, 10 de setembro de 2019 19:11
  • Copie esse exemplo abaixo que fiz baseado no seu "case" e faça o teste, primeiro execute da forma que esta e depois comente a linha que funciona e descomente a que gera o  erro.

            public static void Lista()
            {
                try
                {
                    var ListView1 = new ListView();
                    int i = 1;
                    while (i <= 15)
                    {
                        string Produtos = Guid.NewGuid().ToString();
                        ListViewItem item = new ListViewItem(string.Concat("PM ", i.ToString()));

                        int j = 1;
                        while (j < 8)
                        {
                            var r = new Random().Next(0, 1);
                            if (Convert.ToBoolean(r))
                                item.SubItems.Add(string.Concat("091110 - Verdadeiro - ", j));
                            else
                                item.SubItems.Add(string.Concat("091110 - Falso - ", j));
                            j++;
                            //Erro
                            //ListView1.Items.Add(item);
                        }
                        //Funciona
                        ListView1.Items.Add(item);
                        i++;
                    }
                }
                catch (Exception ex)
                {
                    var erro = ex.Message;
                }
            }

    ** Se ajudou marque como solução **

    terça-feira, 10 de setembro de 2019 19:30
  • Luciano, bom dia.

    Poderia me explicar como funciona esse código?

    Como eu iria imprimir as informações vindo do banco de dados?

    quarta-feira, 11 de setembro de 2019 11:17
  • Luciano, acabamos optando por não exibir o Habilita, pra não ocorrer os erros que esta apresentando ... porém agora é o seguinte, ao invés de trocar de cor vermelha e escrever "Local Indisponível" os lugares que estão recebendo " "(verifica no IF) temos que REMOVER essas linhas, já usei o método Remove(), assim: item.Remove(); porém não está removendo essas linhas que estão em vermelho.

    public void Produto()
            {
                try
                {
                    conn.Open();

                   SqlCommand comand1 = new SqlCommand("SELECT TOP 1 NUMSetup, CodProd1,CodProd2,CodProd3,CodProd4,CodProd5,CodProd6,CodProd7,CodProd8,CodProd9,CodProd10,CodProd11,CodProd12,CodProd13,CodProd14 FROM ProdutosTeste WITH(NOLOCK) ORDER BY NUMSetup DESC", conn);

                    comand1.CommandType = CommandType.Text;

                    SqlDataReader dr1;
                    dr1 = comand1.ExecuteReader();
                    dr1.Read();

                    for (int i = 1; i < 15; i++)
                    {
                        string Produtos = dr1.GetString(i);

                        ListViewItem item = new ListViewItem("PM " + i);

                        if (Produtos == "")
                        {
                            item.SubItems.Add("Local Indisponível");
                            item.ForeColor = Color.Red;

                        }
                        else
                        {
                            item.SubItems.Add("091110" + Produtos);
                        }

                        listView1.Items.Add(item);
                    }
                    conn.Close();
                }
                catch (Exception ex)
                {
                    MessageBox.Show($"Erro favor informar o administrador\nError Message: {ex.Message}\nStackTrace: {ex.StackTrace}");
                }

            }

                            
    quarta-feira, 11 de setembro de 2019 13:57
  • Gabriel,

    Pode me explicar o que esse codigo deveria fazer?
    Por que analisando o trecho que postou, vi que seu if vc esta usando =="" para comparar mas você disse que o valor que esta usando é " " com espaço, como se trata de uma string não vai entrar nessa condição, aconselho o string.isEmptyOrNull(Produtos.Trim()) para fazer essa comparação ou utilize (Produtos.Trim() == ""), dessa forma você não corre risco de comparar o valor " " com "".

    quarta-feira, 11 de setembro de 2019 15:26
  • Luciano,

    Ele servirá para mostrar as informações daquela linha do select (que está acima) na ListView para o operador, porém vai ter alguns produtos que estão no banco de dados que irão ficar indisponível, porem a linha do PM+contador vai estar ativa com uma mensagem de Local Indisponível e o numero do PM e eu vou ter que retirar essa linha para tirar um pouco de informação desnecessária, por exemplo:

    Coluna PM | Coluna Prod

    PM 1          | 091110465445

    PM 2           | Local Indisponível 

    Ao invés de exibir essa linha PM 2, eu teria que remove-la, já utilizei esse comando item.Remove(); porém não funcionou.

    • Marcado como Resposta Gabriel Pina segunda-feira, 28 de outubro de 2019 14:00
    quinta-feira, 12 de setembro de 2019 11:20