Usuário com melhor resposta
Linha Duplicada Datagridview VB.NET

Pergunta
-
Olá Bom dia a todos,
Tenho uma duvida e não estou conseguindo resolver, tenho um DATAGRIDVIEW que é uma lista de compras, exemplo: através de um Código de produto vai adicionando produtos neste dgv que é a lista de compras, mas o que ocorre é o seguinte:
colunas datagridview atual
*Item / Descricao / Valor Un. / Quant. / Valor Total/ sendo que ITEM é Numeração automática apenas contar os itens na lista
Adicionando Produtos Atualmente:
001 PRODUTO 1 / 1,00 / 1 / 1,00
002 PRODUTO 1 / 1,00 / 1 / 1,00
003 PRODUTO 1 / 1,00 / 1 / 1,00
004 PRODUTO 2 / 2,00 / 2 / 1,00
Gostaria que as linhas repetidas se unificassem, não repetindo, caso adicione 2 linhas iguais apenas adicione os novos valores na linha existente sem gerar uma segunda linha repetida.
001 PRODUTO 1 / 1,00 / 3 / 3,00
002 PRODUTO 2 / 2,00 / 2 / 1,00
Já pesquisei em diversos fóruns, verifiquei as propriedades do dgv, tentei alguns códigos que encontrei mas não cheguei a lugar nenhum, se alguém me der uma dica ou solução ficaria muito grato.
Att,
Will Santos
Respostas
-
Will,
Eu construí um exemplo bem simples para você. Como o seu assunto é algo que logo logo eu terei que mexer, eu fiz esse exemplo "miojo" que vai servir para vc e para mim num futuro próximo!
O arquivo do link abaixo está compactado pelo 7zip. Acredito que o winrar consiga descompactá-lo caso vc não tenha o 7zip instalado.
Att.
Giovani
- Marcado como Resposta Will Santos quinta-feira, 24 de outubro de 2013 11:50
-
Boa noite Will!
Então vc terá que, antes de inserir a linha propriamente dita no datagridview, verificar se o item já existe e aí agrupar.
Outra pergunta: vc utiliza coluna escondida para o índice do produto? Se não utiliza, eu recomendo, pois, do meu ponto de vista, ajuda bastante.
Mas para essa resposta, vou usar somente as informações que vc postou.
- Ao clicar no botão adicionar (estou considerando que vc dispara a inserção da linha através de um botão), vc terá que percorrer linha a linha do seu datagridview testando se a descrição do produto já existe. Ficaria assim:
for iLinha as integer = 0 to datagridview.rowcount-1 if txtDescricaoProduto.text.trim = datagridview.item(1,i).value.tostring.trim then datagridview.value(3,i).value = cdbl(datagridview.value(3,i).value) + cdbl(txtQtde.text) 'Parti do pressuposto que o tipo do seu campo é double. Se não for, basta converter para o tipo numérico que vc utiliza) datagridview.value(4,i).value = cdbl(datagridview.value(4,i).value) + cdbl(txtValorTotal.text) exit for 'Sai do for para não ter que ficar testando até o final end if next
2. Se não existir, vc insere normalmente como já vinha fazendo.
Eu acho que isso resolve o seu problema.
Qualquer dúvida, posta aqui novamente para analisarmos.
Att.
Giovani
- Editado Giovani Rodrigues terça-feira, 22 de outubro de 2013 20:56 Correção
- Marcado como Resposta Will Santos quinta-feira, 24 de outubro de 2013 11:50
Todas as Respostas
-
Will, Bom dia!
Por favor, esclareça-me uma informação antes:
Quando você insere o produto no datagridview, você faz algum insert em alguma tabela do banco de dados? Ou você primeiro transfere a informação para o datagridview sem gravar nada no banco e só ao final do procedimento que você grava no banco?
Pergunto isso, pois, se a cada item inserido, você já gravar em uma tabela, para agrupar da forma que você deseja, basta fazer uma consulta somando os campos qtde e valor, ao mesmo tempo que você agrupa as outras colunas.
Ex:
select Descricao , ValorUn , sum(Quant) , sum(Valor_Total) from lista_de_compras GROUP BY Descricao , ValorUn (eu não coloquei o campo item, pois entendi que ele é a chave da tabela... portanto esse exemplo é meramente ilustrativo, tendo que ser estudado com calma para que funcione corretamente no seu programa)
Se não for esse o caso, por favor avise!
Att.
Giovani
- Editado Giovani Rodrigues terça-feira, 22 de outubro de 2013 13:29
-
Giovani Boa Noite!
agradeço muito sua atenção, É exatamente como você disse "primeiro transfere a informação para o datagridview sem gravar nada no banco e só ao final do procedimento que você grava no banco", (é uma lista de compras, primeiro gero a lista e se o cliente não quiser nada, finaliza/grava no BD.) e por isto não gostaria de duplicidade na lista,
-
Boa noite Will!
Então vc terá que, antes de inserir a linha propriamente dita no datagridview, verificar se o item já existe e aí agrupar.
Outra pergunta: vc utiliza coluna escondida para o índice do produto? Se não utiliza, eu recomendo, pois, do meu ponto de vista, ajuda bastante.
Mas para essa resposta, vou usar somente as informações que vc postou.
- Ao clicar no botão adicionar (estou considerando que vc dispara a inserção da linha através de um botão), vc terá que percorrer linha a linha do seu datagridview testando se a descrição do produto já existe. Ficaria assim:
for iLinha as integer = 0 to datagridview.rowcount-1 if txtDescricaoProduto.text.trim = datagridview.item(1,i).value.tostring.trim then datagridview.value(3,i).value = cdbl(datagridview.value(3,i).value) + cdbl(txtQtde.text) 'Parti do pressuposto que o tipo do seu campo é double. Se não for, basta converter para o tipo numérico que vc utiliza) datagridview.value(4,i).value = cdbl(datagridview.value(4,i).value) + cdbl(txtValorTotal.text) exit for 'Sai do for para não ter que ficar testando até o final end if next
2. Se não existir, vc insere normalmente como já vinha fazendo.
Eu acho que isso resolve o seu problema.
Qualquer dúvida, posta aqui novamente para analisarmos.
Att.
Giovani
- Editado Giovani Rodrigues terça-feira, 22 de outubro de 2013 20:56 Correção
- Marcado como Resposta Will Santos quinta-feira, 24 de outubro de 2013 11:50
-
Giovanni, Bom Dia!
Desculpa pela demora na resposta, mas fiquei sem net no bairro... mas to de volta.
Seu código ficou fenomenal, tive que fazer umas pequenas correções (redundância), ele funciona e faz o que preciso mas não exclui a linha repetida, ex. adicionar dois produtos iguais, ele soma em uma linha que é o que queria, mas mesmo somando os novos valores ele adiciona um nova linha com o mesmo produto. to procurando uma solução aqui, se encontrar postarei aqui como ficou. agradeço muito a sua atenção, você me deu uma luz quando não havia esperança kkk, obrigado mesmo.
Att,
Will Santos
ps. o código ficou assim:
For i As Integer = 0 To DGV_Lista_compras.RowCount - 1
If LBL_Descricao_Produto.Text.Trim = DGV_Lista_compras.Item(1, i).Value.ToString.Trim Then
DGV_Lista_compras(3, i).Value = CDbl(DGV_Lista_compras(3, i).Value) + CDbl(LBL_Quant_Itens.Text) 'Parti do pressuposto que o tipo do seu campo é double. Se não for, basta converter para o tipo numérico que vc utiliza)
DGV_Lista_compras(4, i).Value = CDbl(DGV_Lista_compras(4, i).Value) + CDbl(LBL_Valor_Total_Produtos.Text)
Exit For 'Sai do for para não ter que ficar testando até o final
End If
Nextso retirei os .value que tava repetido.
- Editado Will Santos quinta-feira, 24 de outubro de 2013 10:28
-
Bom dia Wil!
Por favor me diga como você insere a nova linha? Pq o código que postei era apenas um exemplo de como somar os produtos. Agora vc tem que antes de fazer a inserção da nova linha, testar se o produto já existe no datagridview. Por exemplo, no código que fiz, ele testa se já existe a linha e aí soma nela certo? Então vc precisa adaptar para antes de inserir a linha, fazer esse teste e se encontrar, faz a soma, sai do loop e NÃO executa o código de inserção de linha. Caso percorra toda a grid e não ache, aí sim executaria o código.
Existem algumas formas de se fazer isso. Uma forma que utilizo bastante é, se eu encontrar, eu mudo o estado de uma variável booleana para true e depois, quando sair do for, faço o teste nela. Se ela for true, siginifica que fez a soma e não insere nenhuma linha. Se for false, significa que não encontrou, portanto insere uma nova linha.
Se ficou complicado, me avise!
Att.
Giovani
-
Will,
Eu construí um exemplo bem simples para você. Como o seu assunto é algo que logo logo eu terei que mexer, eu fiz esse exemplo "miojo" que vai servir para vc e para mim num futuro próximo!
O arquivo do link abaixo está compactado pelo 7zip. Acredito que o winrar consiga descompactá-lo caso vc não tenha o 7zip instalado.
Att.
Giovani
- Marcado como Resposta Will Santos quinta-feira, 24 de outubro de 2013 11:50
-
Giovani, só tenho a agradecer... na verdade estava quebrando a cabeça com logica que você me deu no post anterior ao exemplo... consegui, não sei se é o correto mas funcionou (confesso que estou em fase de aprendizado)
olha o código como ficou
For LinhaAtual As Integer = 0 To DGV_Lista_compras.Rows.Count - 2
For NovaLinha As Integer = DGV_Lista_compras.Rows.Count - 1 To LinhaAtual + 1 Step -1
If DGV_Lista_compras.Item(1, LinhaAtual).Value = DGV_Lista_compras.Item(1, NovaLinha).Value Then
DGV_Lista_compras.Rows.RemoveAt(NovaLinha)
End If
Next
Nextmas to analisando seu exemplo e vish.... realmente esta muito melhor.
agradeço demais e um dia puder irei retribuir sua ajuda.
Att,
Will Santos
-
Will!
Fica tranquilo pq eu também já passei aperto aqui no fórum!!! Já deixei membros de cabelo branco quando eu comecei! rs Olho o histórico e vejo as barbaridades que eu perguntava! Isso faz parte do aprendizado!
Precisando é só perguntar!
Bons estudos!
Att.
Giovani
-
Não vou dispensar sua boa vontade, pois a melhor parte do aprendizado é quando tem alguém de boa vontade para ensinar, um dia ficarei bom o suficiente para repassar o que aprender para alguém...
PARABÉNS e continue assim!
Att,
Will Santos