Usuário com melhor resposta
Erro - no loop

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}");
}
}
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 **
- Editado Luciano .NET Developer terça-feira, 10 de setembro de 2019 19:33
- Marcado como Resposta Gabriel Pina quarta-feira, 11 de setembro de 2019 13:48
-
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
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}");
}
}
-
-
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}");
}
}- Editado Luciano .NET Developer terça-feira, 10 de setembro de 2019 19:18 exemplo
-
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 **
- Editado Luciano .NET Developer terça-feira, 10 de setembro de 2019 19:33
- Marcado como Resposta Gabriel Pina quarta-feira, 11 de setembro de 2019 13:48
-
-
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}");
}
} -
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 "". -
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