none
Linha Duplicada Datagridview VB.NET RRS feed

  • 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

    terça-feira, 22 de outubro de 2013 10:41

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.

    Exemplo

    Att.

    Giovani

    • Marcado como Resposta Will Santos quinta-feira, 24 de outubro de 2013 11:50
    quinta-feira, 24 de outubro de 2013 11:41
  • 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. 

    1. 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
    terça-feira, 22 de outubro de 2013 20:54

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


    terça-feira, 22 de outubro de 2013 13:26
  • 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, 


    terça-feira, 22 de outubro de 2013 20:34
  • 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. 

    1. 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
    terça-feira, 22 de outubro de 2013 20:54
  • 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
            Next

    so retirei os .value que tava repetido.

    • Editado Will Santos quinta-feira, 24 de outubro de 2013 10:28
    quinta-feira, 24 de outubro de 2013 10:25
  • 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

    quinta-feira, 24 de outubro de 2013 10:34
  • 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.

    Exemplo

    Att.

    Giovani

    • Marcado como Resposta Will Santos quinta-feira, 24 de outubro de 2013 11:50
    quinta-feira, 24 de outubro de 2013 11:41
  • 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
            Next

    mas to analisando seu exemplo e vish.... realmente esta muito melhor.

    agradeço demais e um dia puder irei retribuir sua ajuda.

    Att,

    Will Santos

    quinta-feira, 24 de outubro de 2013 11:49
  • 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

    quinta-feira, 24 de outubro de 2013 11:56
  • 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

    quinta-feira, 24 de outubro de 2013 12:00