Ir para o conteúdo
  • Revista PROGRAMAR: Já está disponível a edição #60 da revista programar. Faz já o download aqui!

samesdavis

[Resolvido] Verificar duplicidade em DataGridView e remover linhas

Mensagens Recomendadas

samesdavis

Tenho um código como esse:

		DataGridView1.ColumnCount = 3
	DataGridView1.Columns(0).Name = "Product ID"
	DataGridView1.Columns(1).Name = "Product Name"
	DataGridView1.Columns(2).Name = "Product_Price"

	Dim row As String() = New String() {"1", "Product 1", "1000"}
	DataGridView1.Rows.Add(row)
	row = New String() {"2", "Product 2", "2000"}
	DataGridView1.Rows.Add(row)
	row = New String() {"3", "Product 3", "3000"}
	DataGridView1.Rows.Add(row)
	row = New String() {"4", "Product 4", "4000"}
	DataGridView1.Rows.Add(row)

Eu quero que quando eu entrar com uma nova linha na gridview que tenha o mesmo código, que ele SOME com a quantidade já existente.

Por exemplo, se eu usar essa linha:

row = New String() {"4", "Product 4", "6000"}

DataGridView1.Rows.Add(row)

Ele deverá somar esses 6000 com os 4000 que já existiam, e toda vez que eu incluir uma linha na grid, ele tem que fazer essa checagem e somar. Como faço isso?

Aproveitando a postagem, como faço para REMOVER a linha inteira selecionada da datagridview?

e

Editado por Caça
GeSHi

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Caça

Cria uma classe com as respectivas propriedades e uma lista, preenche a lista com os dados.

Depois disso faz o agrupamento dessa lista com Linq e define-a como DataSource da Grid.


Pedro Martins

Não respondo a duvidas por PM

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Caça

É mais ou menos isto(não testei)

Crias uma classe Produto

Public Class Produto

  Public Property ProductID as Integer
  Public Property ProductName as String
  Public Property ProductPrice as Double

End Class

Depois crias uma lista para armazenar os produtos

Dim ListaProdutos as New List(Of Produto)

Preenches a lista

ListaProdutos.Add(New Produto With {.ProductID = 1, .ProductName = "Product 1", .ProductPrice = 1000})
ListaProdutos.Add(New Produto With {.ProductID = 2, .ProductName = "Product 2", .ProductPrice = 2000})
ListaProdutos.Add(New Produto With {.ProductID = 3, .ProductName = "Product 3", .ProductPrice = 3000})
ListaProdutos.Add(New Produto With {.ProductID = 4, .ProductName = "Product 4", .ProductPrice = 4000})
ListaProdutos.Add(New Produto With {.ProductID = 4, .ProductName = "Product 4", .ProductPrice = 6000})

E defines como fonte de dados da Grid

Dim Aux = (From A In ListaProdutos Group By A.ProductID, A.ProductName Into Sum(A.ProductPrice))
DataGridView1.DataSource = Aux

Editado por Caça

Pedro Martins

Não respondo a duvidas por PM

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
samesdavis

Acho que não me expressei direito na hora de postar, o que eu quero dizer é que tenho a grid VAZIA.

e a medida que vou clicando no botão para adicionar os dados na grid, ele tem que verificar a duplicidade e agrupar a quantidade

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Caça

E esse código faz isso, vai adicionando os registos a lista e corre sempre o código que preenche o DataSource da grid


Pedro Martins

Não respondo a duvidas por PM

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
psantos10

Boas,

Já fiz algo parecido, mas foi em C#. Abaixo deixo o trecho do código:

private void txtQuantidade_KeyDown(object sender, KeyEventArgs e)
 {
	 if (e.KeyValue == 13)
	 {
		 if (!ClassPlugins.IsNumber(txtQuantidade.Text.Trim()))
		 {
			 MessageBox.Show("Quantidade inválida. Tente Novamente.", "SiSGym Manager", MessageBoxButtons.OK, MessageBoxIcon.Warning);
			 txtQuantidade.Text = string.Empty;
			 txtQuantidade.Focus();
			 return;
		 }

		 // Adicionar Produto na DataGridView...
		 string armOrigem = ((ComboBoxItem)cBoxArmazemOrigem.SelectedItem).HiddenValue;
		 string armDestino = ((ComboBoxItem)cBoxArmazemDestino.SelectedItem).HiddenValue;
		 for (int i = 0; i < dgvMovimentos.Rows.Count; i++)
		 {
			 if ((string)dgvMovimentos.Rows[i].Cells[0].Value == txtReferencia.Text.Trim())
			 {
				 int novaQtd = Convert.ToInt32(dgvMovimentos.Rows[i].Cells[2].Value) + Convert.ToInt32(txtQuantidade.Text.Trim());
				 dgvMovimentos.Rows.RemoveAt(i);
				 string[] linha = new string[] { txtReferencia.Text.Trim().ToUpper(), txtDescricao.Text.Trim(), novaQtd.ToString(), armOrigem, armDestino };
				 dgvMovimentos.Rows.Add(linha);
				 // Linha adicionada... recomeçar o processo...
				 txtReferencia.Text = string.Empty;
				 txtDescricao.Text = string.Empty;
				 txtQuantidade.Text = string.Empty;
				 txtReferencia.Focus();
				 return;
			 }
		 }

		 string[] linha2 = new string[] { txtReferencia.Text.Trim().ToUpper(), txtDescricao.Text.Trim(), txtQuantidade.Text.Trim(), armOrigem, armDestino};
		 dgvMovimentos.Rows.Add(linha2);		
		 // Linha adicionada... recomeçar o processo...
		 txtReferencia.Text = string.Empty;
		 txtDescricao.Text = string.Empty;
		 txtQuantidade.Text = string.Empty;
		 txtReferencia.Focus();
	 }
 }

Note que não modifiquei nada no código... veio direito do meu código fonte... se não entender uma linha, basta dizer... que eu explico

Espero que ajuda...

Cumps

PS

Editado por Caça
GeSHi

-------Assinatura?

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
samesdavis

Obrigado a todos que me ajudaram, consegui desenvolver essa solução:

 Private Sub AddProd()
	'verifica se o código do produto foi informado
	If Me.txtCOD.Text  Nothing Then
		Frm_MenuPrincipal.Cursor = Cursors.WaitCursor
		Dim Duplicidade As Boolean = False
		Dim nQuant As Decimal = 0
		'verifica duplicidade a partir do segundo item da grid.
		If GridReceber.Rows.Count > 0 Then
			For i = 0 To GridReceber.Rows.Count - 1
				'posiciona na coluna 0 da grid e na linha corrente
				Me.GridReceber.CurrentCell = Me.GridReceber(0, i)
				'verifica se o código informado é o mesmo da grid
				If GridReceber.CurrentCell.Value = Me.txtCOD.Text Then
					Duplicidade = True
					'posiciona na coluna 4 da grid que tem a quantidade
					Me.GridReceber.CurrentCell = Me.GridReceber(4, i)
					Exit For
				End If
			Next
		End If
		If Duplicidade Then
			'soma a quantidade da grid com a quantidade informada
			nQuant = CDec(Me.txtQTD.Text) + CDec(GridReceber.CurrentCell.Value)
			'remove a linha da grid que tem o mesmo código informado
			GridReceber.Rows.Remove(GridReceber.CurrentRow)
			'calcula o valor total dos produtos
			vlTotal = nQuant * CDec(Me.txtPRÇUNIT.Text)
			'adiciona a linha na grid com a quantidade somada
			row = New String() {Me.txtCOD.Text, Me.txtDESC.Text, strFabr, Me.txtPRÇUNIT.Text, nQuant, vlTotal}
			GridReceber.Rows.Add(row)
		Else
			'calcula o valor total dos produtos
			vlTotal = Int(Me.txtQTD.Value) * CDec(Me.txtPRÇUNIT.Text)
			'adiciona a linha na grid com a quantidade informada
			row = New String() {Me.txtCOD.Text, Me.txtDESC.Text, strFabr, Me.txtPRÇUNIT.Text, Me.txtQTD.Text, vlTotal}
			GridReceber.Rows.Add(row)
		End If
		Call CalculaValores()
		Frm_MenuPrincipal.Cursor = Cursors.Default
	Else
		MsgBox("Entre com o código do produto", MsgBoxStyle.Exclamation, "Atenção")
	End If
	Call LimpaCampos()
End Sub

Editado por apocsantos
geshi

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!

Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.

Entrar Agora

×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informações visite esta página.