Array
(
)

Somatoria de valores de um datagridview

Frostlost
   - 13 nov 2008

Bom dia a todos. Possuo uma aplicação utilizando Windows Forms, feita em Visual Studio 2005, em C#. O modelo utilizado é o desconectado, com dataset tipado. Nesta aplicação possuo uma venda, nesta venda possuo um datagridview com os seguintes campos da tabela ITENS: IDPRODUTO, DESCRICAO, QTDE, VALOR, SUBTOTAL. O campo SUBTOTALnasce da QTDE X PRECO.
Abaixo deste datagridview possuo um textbox TOTAL ligado a tabela VENDA, este textbox deve receber o valor da somatória do SUBTOTAL dos ITENS toda vez que eu mudar de linha, e caso eu exclua alguma linha estes valores serão recalculados. Só que não consigo totalizar este campo.

Alguém sabe a resposta para isso?

Obrigado.

Claudio Stein Junior

Codename.v
   - 16 nov 2008

O que você está utlizando como ´data source´ neste controle DataGridView de intens da venda???

O correto é você ter um objeto do tipo List por exemplo para preencher esse controle DataGridView e trabalhar em cima deste List utilizando o DataGridView apenas para exibir os dados.
Sendo assim, você teria uma variável local total que guardaria a soma de todos dados do campo subtotal do List cada vez que um novo item for inserido.
Para isso você poderia utilizar um foreach...

Exemplo:

#Código
List<Iten> itens = new List<Iten>();

decimal total = 0;

private void AdicionaItem()
{
Iten i = new Iten();
i.Codigo = 1;
i.Nome = "Nome do Produto";
i.Quantidade = 2;
i.Valor = 10;
i.SubTotal = i.Quantidade * i.Valor;

itens.Add(i);

foreach(Iten iten in itens)
{
total += iten.SubTotal;
}

dataGridView1.DataSource = itens;

textBoxTotal.Text = total.ToString();
}


Frostlost
   - 17 nov 2008

Valeu, funcionou e consegui desse jeito tb:

#Código

private void itensVendaDataGridView_CellValidated(object sender, DataGridViewCellEventArgs e)
{
string preco;
double subtotal;

// a celula 0 é o nrvenda - com visible false
// a celula 1 é o idproduto, a 2 o preco, a 3 a quantidade,
// a 4 o subtotal

if ((itensVendaDataGridView.CurrentCell.ColumnIndex == 1))
{
itensVendaDataGridView.CurrentRow.Cells[2].Value = "0";
itensVendaDataGridView.CurrentRow.Cells[3].Value = "1";
this.produto1TableAdapter.Fill(this.vendaVideoDataSet.Produto1, Convert.ToInt32(itensVendaDataGridView.CurrentRow.Cells[1].Value));
foreach (DataRow dr in vendaVideoDataSet.Tables[4].Rows)
{
preco = dr[1].ToString();
itensVendaDataGridView.CurrentRow.Cells[2].Value = preco;
}
}

if ((itensVendaDataGridView.CurrentCell.ColumnIndex == 2) || (itensVendaDataGridView.CurrentCell.ColumnIndex == 3))
{
double n1 = Convert.ToDouble(itensVendaDataGridView.CurrentRow.Cells[2].Value);
double n2 = Convert.ToDouble(itensVendaDataGridView.CurrentRow.Cells[3].Value);
subtotal = n1 * n2;
itensVendaDataGridView.CurrentRow.Cells[4].Value = subtotal;

double total;
total = 0;
foreach (DataGridViewRow data in itensVendaDataGridView.Rows)
{
total = total + Convert.ToDouble(data.Cells[4].Value);
}
totalTextBox.Text = total.ToString();

}

}


Abraços

Citação:
O que você está utlizando como ´data source´ neste controle DataGridView de intens da venda???

O correto é você ter um objeto do tipo List por exemplo para preencher esse controle DataGridView e trabalhar em cima deste List utilizando o DataGridView apenas para exibir os dados.
Sendo assim, você teria uma variável local total que guardaria a soma de todos dados do campo subtotal do List cada vez que um novo item for inserido.
Para isso você poderia utilizar um foreach...

Exemplo:

#Código
List<Iten> itens = new List<Iten>();

decimal total = 0;

private void AdicionaItem()
{
Iten i = new Iten();
i.Codigo = 1;
i.Nome = "Nome do Produto";
i.Quantidade = 2;
i.Valor = 10;
i.SubTotal = i.Quantidade * i.Valor;

itens.Add(i);

foreach(Iten iten in itens)
{
total += iten.SubTotal;
}

dataGridView1.DataSource = itens;

textBoxTotal.Text = total.ToString();
}