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();
}