none
somar ou subtrair coluna em datagridview C# RRS feed

  • Pergunta

  • ola pessoal.

    estou com um problema.

    tenho um datagridview onde tenho o seguinte código para somar:

    decimal soma = 0;

                foreach (DataGridViewRow  dr in dataGridView1.Rows)
                    soma +=  Convert.ToDecimal (dr.Cells[5].Value);
                txtPesquisa1.Text = Convert.ToString(soma);

    até ai Ok, funcionando certinho.

    o que preciso nesta mesma coluna é fazer o contrario, ou seja, subtrair os valores.

    já estou ha dias pesquisando de tudo e nao encontrei nada até agora.

    alguem me ajude por favor

    sexta-feira, 30 de março de 2012 21:19

Respostas

  • Olá Marcos,

    Veja se lhe ajuda:

    bool ehPrimeiro = true;
    decimal valorAtual = 0;
    decimal diferenca = 0;
    decimal menorValor = 0;
    decimal maiorValor = 0;
    foreach (DataGridViewRow  dr in dataGridView1.Rows){
    
    	if (ehPrimeiro)
    	{
    		menorValor = maiorValor = Convert.ToDecimal(dr.Cells[5].Value);
    		ehPrimeiro = false;
    	}	
    	else
    	{
    		valorAtual = Convert.ToDecimal(dr.Cells[5].Value);
    		if (menorValor > valorAtual)
    			menorValor = valorAtual;
    		if (maiorValor < valorAtual)
    			maiorValor = valorAtual;
    	}
    }
    diferenca = maiorValor - menorValor;
    txtPesquisa1.Text = Convert.ToString(diferenca);

    []s!

    Fernando Henrique Inocêncio Borba Ferreira
    while(alive){ this.WriteCode(); }
    Blog: http://ferhenriquef.com/
    Twitter: @ferhenrique

    fernando

    olha só.

    funciona desta forma.

    retorna o valor subtraido do maior para o menor.

    ficou bom.

    mas deu outro bug...

    na simulação anterior eu conseguia pegar a diferença da ultima para penultima km informado e agora n consegui mais adaptar esta ideia.

    tentei dessa forma, mas retorna sempre o diferença do maior para o menor  e nao da ultima para a penultima.

    precisa mais 1 if e else?

                bool ehPrimeiro = true;
                decimal valorAtual = 0;
                decimal diferenca = 0;
                decimal menorValor = 0;
                decimal maiorValor = 0;
                decimal valorAnterior = 0;
                decimal diferencaAtual = 0;
                foreach (DataGridViewRow dr in dataGridView1.Rows)
                {


                    if (ehPrimeiro)
                    {
                        valorAnterior = Convert.ToDecimal(dr.Cells[5].Value);
                        menorValor = maiorValor = Convert.ToDecimal(dr.Cells[5].Value);
                        ehPrimeiro = false;
                    
                    }
                    else
                    {


                        valorAtual = Convert.ToDecimal(dr.Cells[5].Value);
                        if (menorValor > valorAtual)
                            menorValor = valorAtual;
                        if (maiorValor < valorAtual)
                            maiorValor = valorAtual;


                    }
                }
                diferenca = maiorValor - menorValor;
                txtTotalKm.Text = Convert.ToString(diferenca);
                diferencaAtual = maiorValor - valorAnterior;
                valorAnterior = maiorValor;
                txtKmRodados.Text = diferencaAtual.ToString();

    pessoal

    consegui desta forma:

    bool ehPrimeiro = true;
                decimal valorAtual = 0;
                decimal diferenca = 0;
                decimal menorValor = 0;
                decimal maiorValor = 0;
                decimal valorAnterior = 0;
                foreach (DataGridViewRow dr in dataGridView1.Rows)
                {
                    if (ehPrimeiro)
                    {
                        menorValor = maiorValor = Convert.ToDecimal(dr.Cells[5].Value);
                        ehPrimeiro = false;
                    }
                    else
                    {
                        valorAtual = Convert.ToDecimal(dr.Cells[5].Value);
                        if (menorValor > valorAtual)
                            menorValor = valorAtual;
                        if (maiorValor < valorAtual)
                            maiorValor = valorAtual;
                    }
                    if (ehPrimeiro)
                    {
                        valorAnterior = Convert.ToDecimal(dr.Cells[5].Value);
                        ehPrimeiro = false;
                    }
                    else
                    {
                        valorAtual = Convert.ToDecimal(dr.Cells[5].Value);
                        diferenca = valorAtual - valorAnterior;
                        valorAnterior = valorAtual;
                        txtKmRodados.Text = valorAtual.ToString();
                        txtKmRodados.Text = diferenca.ToString();
                        diferenca = maiorValor - menorValor;
                        txtTotalKm.Text = Convert.ToString(diferenca);
                      

    talvez tenha uma maneira mais simples, porem pra mim vale o funcional que é este acima.

    obrigado ha todos pela ajuda.

    para quem está iniciando é mt importante a opiniao e sugestao dos mais experientes.

    • Marcado como Resposta Marcos_Roberto sábado, 31 de março de 2012 16:54
    sábado, 31 de março de 2012 16:54

Todas as Respostas

  • Marcos quando a pessoa apagar a linha ou alterar o valor da mesma ??

    Vitor Mendes | Seu feedback é muito importante para todos!
    Visite o meu site: http://www.vitormendes.com.br/

    sábado, 31 de março de 2012 00:08
  • Olá Marcos,

    Tudo beleza?

    Vc deseja apenas subtrair os valores?

    O comportamento não seria algo como:

    decimal soma = 0;
    foreach (DataGridViewRow  dr in dataGridView1.Rows)
    soma -=  Convert.ToDecimal (dr.Cells[5].Value);
    txtPesquisa1.Text = Convert.ToString(soma);
    

    ou algo como:

    decimal soma = 0;
    foreach (DataGridViewRow  dr in dataGridView1.Rows)
    soma +=  Convert.ToDecimal (dr.Cells[5].Value);
    soma *= -1;
    txtPesquisa1.Text = Convert.ToString(soma);
    

    []s!

    Fernando Henrique Inocêncio Borba Ferreira
    while(alive){ this.WriteCode(); }
    Blog: http://ferhenriquef.com/
    Twitter: @ferhenrique

    sábado, 31 de março de 2012 02:36
    Moderador
  • ola fernandro.

    mudei conforme sua sugestão e apresenta o mesmo problema das demais tentativas que ja apliquei, ou seja, neste caso continua somando e retorna o numero negativo.

    isto ja acontecia quando eu alterava o soma+= por um soma -=.

    esta foi a primeira logica que usei.

    sábado, 31 de março de 2012 09:53
  • ola Vitor

    o usuário aplica um filtro e muda os dados do datagridview.

    a ideia inicial do projeto é um controle de frota e este regra seria para saber quanto km o veiculo rodou entre as manutenções, pela logica eu sempre terei km maior sendo informado, então preciso saber qual a diferença entre ambos.

    acho q não é tao difícil fazer subtrair, mas eu sou novo nesta arte de programar e encontro bastante dificuldades ainda.

    se puderes dar a sua opinião lhe agradeço.

    sábado, 31 de março de 2012 09:58
  • pessoal

    olhem só.

    encontrei a forma com este código:

     decimal soma = 0;

                foreach (DataGridViewRow col in dataGridView1.Rows)
                {
                    soma = - soma + Convert.ToDecimal(col.Cells[5].Value);
                }
                txtPesquisa1.Text = Convert.ToString(soma);

    parece bom, mas não foi.

    na verdade desta forma eu vou subtrair um a um e no final me dará um resultado negativo.

    minha tabela está assim:

    km manutenção (seria a Cells 5)

    15268 (1ª manutenção)

    15368(2ª manutenção)

    15468(3ª manutenção)

    como será informado o km do veiculo em cada manutenção, desta forma irei subtrair todos os dados da coluna eu terei um resultado negativo.

    este código funciona se eu foi subtrair duas linhas somente.

    então no meu caso eu terei 5 ou 10 linhas informando o km que obviamente estará em ordem crescente.

    penso que necessito fazer o seguinte.

    encontrar o maior valor e o menor valor da coluna e subtrair os dois somente, desta forma teria o km rodado pelo veiculo.

    tentei algumas coisas.

    deta forma abaixo ele me retorna o valor na primeira linha (queé o menor), mas se eu colocar um valor menor na segunda linha ele continua mostrando o valor da primeira linha.... então o codigo ainda nao está totalmente correto.

    depois que encontrar o menor valor eu preciso tb encontrar o maior valor e quando isto acontecer fica facil subtrair os resultados do textbox.

    for (int i = 0; i < dataGridView1.Rows.Count - 1; i++)
                txtMenor.Text = (Convert.ToString(dataGridView1.Rows[i].Cells[5].Value).ToString());

    desculpem a confusao.

    me ajudem por favor.

    sábado, 31 de março de 2012 11:41
  • Olá Marcos,

    Acredito que com o código abaixo vc conseguirá obter a diferença entre as duas kilometragens, resta saber onde/como vc irá apresentar essa diferença... se é em outra coluna do Grid, ou criar uma somatória... mas se observar, verá que a variável "diferenca" guarda a diferença entre as kilometragens...

    []s!

    bool ehPrimeiro = true;
    decimal valorAtual = 0;
    decimal valorAnterior = 0;
    decimal diferenca = 0;
    decimal soma = 0;
    foreach (DataGridViewRow  dr in dataGridView1.Rows){
    
    	if (ehPrimeiro)
    	{
    		valorAnterior = Convert.ToDecimal(dr.Cells[5].Value);
    		ehPrimeiro = false;
    	}	
    	else
    	{
    		valorAtual = Convert.ToDecimal(dr.Cells[5].Value);
    		diferenca = valorAnterior - valorAtual;
    		valorAnterior = valorAtual;
    	}
    }
    


    Fernando Henrique Inocêncio Borba Ferreira
    while(alive){ this.WriteCode(); }
    Blog: http://ferhenriquef.com/
    Twitter: @ferhenrique

    sábado, 31 de março de 2012 12:05
    Moderador
  • Olá Marcos,

    Acredito que com o código abaixo vc conseguirá obter a diferença entre as duas kilometragens, resta saber onde/como vc irá apresentar essa diferença... se é em outra coluna do Grid, ou criar uma somatória... mas se observar, verá que a variável "diferenca" guarda a diferença entre as kilometragens...

    []s!

    bool ehPrimeiro = true;
    decimal valorAtual = 0;
    decimal valorAnterior = 0;
    decimal diferenca = 0;
    decimal soma = 0;
    foreach (DataGridViewRow  dr in dataGridView1.Rows){
    
    	if (ehPrimeiro)
    	{
    		valorAnterior = Convert.ToDecimal(dr.Cells[5].Value);
    		ehPrimeiro = false;
    	}	
    	else
    	{
    		valorAtual = Convert.ToDecimal(dr.Cells[5].Value);
    		diferenca = valorAnterior - valorAtual;
    		valorAnterior = valorAtual;
    	}
    }


    Fernando Henrique Inocêncio Borba Ferreira
    while(alive){ this.WriteCode(); }
    Blog: http://ferhenriquef.com/
    Twitter: @ferhenrique

    fernado

    é quase isso.... estamos  chegando mt perto.

    com o valor atual eu recebo o ultimo valor digitado, ou seja, o maior valor.

    a diferenca me retorna o km rodado entre a ultime e a penúltima troca e isso eu tb precisava, entao já está OK.... obrigado.

    agora só preciso conseguir pegar o menor valor de todos os digitados e assim subtrair ele do valor atual e desta forma eu teria o total de KM rodados e por consequencia uma media geral.

    mudei alguma coisas e voltei a esbarrar na pergunta inicail que refere-se a subtrair o maior valor do menor valor.

    veja como ficou:

    bool ehPrimeiro = true;
                decimal valorAtual = 0;
                decimal valorAnterior = 0;
                decimal diferenca = 0;
                decimal soma = 0;
                decimal menorValor = 0;
                decimal diferencaTotal = 0;
                foreach (DataGridViewRow dr in dataGridView1.Rows)
                {
                    if (ehPrimeiro)
                    {
                        valorAnterior = Convert.ToDecimal(dr.Cells[5].Value);
                        ehPrimeiro = false;
                    }
                    else
                    {
                        valorAtual = Convert.ToDecimal(dr.Cells[5].Value);
                        diferenca = valorAtual - valorAnterior;
                        soma += Convert.ToDecimal(dr.Cells[5].Value);
                        menorValor -= Convert.ToDecimal(dr.Cells[5].Value);
                        diferencaTotal = soma - menorValor;
                        valorAnterior = valorAtual;
                        txtPesquisa1.Text = valorAtual.ToString();
                        txtDifere.Text = diferenca.ToString();
                        txtMenor.Text = diferencaTotal.ToString();

     como poderia fazer?

    sábado, 31 de março de 2012 13:25
  • Olá Marcos,

    Veja se lhe ajuda:

    bool ehPrimeiro = true;
    decimal valorAtual = 0;
    decimal diferenca = 0;
    decimal menorValor = 0;
    decimal maiorValor = 0;
    foreach (DataGridViewRow  dr in dataGridView1.Rows){
    
    	if (ehPrimeiro)
    	{
    		menorValor = maiorValor = Convert.ToDecimal(dr.Cells[5].Value);
    		ehPrimeiro = false;
    	}	
    	else
    	{
    		valorAtual = Convert.ToDecimal(dr.Cells[5].Value);
    		if (menorValor > valorAtual)
    			menorValor = valorAtual;
    		if (maiorValor < valorAtual)
    			maiorValor = valorAtual;
    	}
    }
    diferenca = maiorValor - menorValor;
    txtPesquisa1.Text = Convert.ToString(diferenca);

    []s!

    Fernando Henrique Inocêncio Borba Ferreira
    while(alive){ this.WriteCode(); }
    Blog: http://ferhenriquef.com/
    Twitter: @ferhenrique

    sábado, 31 de março de 2012 13:41
    Moderador
  • Faz desta forma, apenas tens de adaptar, menos ou mais, ou devidir, depende de ti:

            # region Calcular Data Grid

            private void Cacular()
            {
                if (this.dataGridView1.Rows.Count > 0)
                    this.dataGridView1.Rows[0].Cells["Column1"].Value = Total().ToString("c");
            }

            private double Total()
            {
                double tot = 0;
                int i = 0;
                for (i = 0; i < dataGridView1.Rows.Count; i++)
                {
                    tot = tot + Convert.ToDouble(dataGridView1.Rows[i].Cells["Numero"].Value);
                }
                return tot;
            }
            # endregion


    One word frees us of all the weight and pain of life: that word is love.

    sábado, 31 de março de 2012 15:36
  • Olá Marcos,

    Veja se lhe ajuda:

    bool ehPrimeiro = true;
    decimal valorAtual = 0;
    decimal diferenca = 0;
    decimal menorValor = 0;
    decimal maiorValor = 0;
    foreach (DataGridViewRow  dr in dataGridView1.Rows){
    
    	if (ehPrimeiro)
    	{
    		menorValor = maiorValor = Convert.ToDecimal(dr.Cells[5].Value);
    		ehPrimeiro = false;
    	}	
    	else
    	{
    		valorAtual = Convert.ToDecimal(dr.Cells[5].Value);
    		if (menorValor > valorAtual)
    			menorValor = valorAtual;
    		if (maiorValor < valorAtual)
    			maiorValor = valorAtual;
    	}
    }
    diferenca = maiorValor - menorValor;
    txtPesquisa1.Text = Convert.ToString(diferenca);

    []s!

    Fernando Henrique Inocêncio Borba Ferreira
    while(alive){ this.WriteCode(); }
    Blog: http://ferhenriquef.com/
    Twitter: @ferhenrique

    fernando

    olha só.

    funciona desta forma.

    retorna o valor subtraido do maior para o menor.

    ficou bom.

    mas deu outro bug...

    na simulação anterior eu conseguia pegar a diferença da ultima para penultima km informado e agora n consegui mais adaptar esta ideia.

    tentei dessa forma, mas retorna sempre o diferença do maior para o menor  e nao da ultima para a penultima.

    precisa mais 1 if e else?

                bool ehPrimeiro = true;
                decimal valorAtual = 0;
                decimal diferenca = 0;
                decimal menorValor = 0;
                decimal maiorValor = 0;
                decimal valorAnterior = 0;
                decimal diferencaAtual = 0;
                foreach (DataGridViewRow dr in dataGridView1.Rows)
                {


                    if (ehPrimeiro)
                    {
                        valorAnterior = Convert.ToDecimal(dr.Cells[5].Value);
                        menorValor = maiorValor = Convert.ToDecimal(dr.Cells[5].Value);
                        ehPrimeiro = false;
                    
                    }
                    else
                    {


                        valorAtual = Convert.ToDecimal(dr.Cells[5].Value);
                        if (menorValor > valorAtual)
                            menorValor = valorAtual;
                        if (maiorValor < valorAtual)
                            maiorValor = valorAtual;


                    }
                }
                diferenca = maiorValor - menorValor;
                txtTotalKm.Text = Convert.ToString(diferenca);
                diferencaAtual = maiorValor - valorAnterior;
                valorAnterior = maiorValor;
                txtKmRodados.Text = diferencaAtual.ToString();

    • Marcado como Resposta Marcos_Roberto sábado, 31 de março de 2012 16:52
    • Não Marcado como Resposta Marcos_Roberto sábado, 31 de março de 2012 16:54
    sábado, 31 de março de 2012 15:57
  • Olá Marcos,

    Veja se lhe ajuda:

    bool ehPrimeiro = true;
    decimal valorAtual = 0;
    decimal diferenca = 0;
    decimal menorValor = 0;
    decimal maiorValor = 0;
    foreach (DataGridViewRow  dr in dataGridView1.Rows){
    
    	if (ehPrimeiro)
    	{
    		menorValor = maiorValor = Convert.ToDecimal(dr.Cells[5].Value);
    		ehPrimeiro = false;
    	}	
    	else
    	{
    		valorAtual = Convert.ToDecimal(dr.Cells[5].Value);
    		if (menorValor > valorAtual)
    			menorValor = valorAtual;
    		if (maiorValor < valorAtual)
    			maiorValor = valorAtual;
    	}
    }
    diferenca = maiorValor - menorValor;
    txtPesquisa1.Text = Convert.ToString(diferenca);

    []s!

    Fernando Henrique Inocêncio Borba Ferreira
    while(alive){ this.WriteCode(); }
    Blog: http://ferhenriquef.com/
    Twitter: @ferhenrique

    fernando

    olha só.

    funciona desta forma.

    retorna o valor subtraido do maior para o menor.

    ficou bom.

    mas deu outro bug...

    na simulação anterior eu conseguia pegar a diferença da ultima para penultima km informado e agora n consegui mais adaptar esta ideia.

    tentei dessa forma, mas retorna sempre o diferença do maior para o menor  e nao da ultima para a penultima.

    precisa mais 1 if e else?

                bool ehPrimeiro = true;
                decimal valorAtual = 0;
                decimal diferenca = 0;
                decimal menorValor = 0;
                decimal maiorValor = 0;
                decimal valorAnterior = 0;
                decimal diferencaAtual = 0;
                foreach (DataGridViewRow dr in dataGridView1.Rows)
                {


                    if (ehPrimeiro)
                    {
                        valorAnterior = Convert.ToDecimal(dr.Cells[5].Value);
                        menorValor = maiorValor = Convert.ToDecimal(dr.Cells[5].Value);
                        ehPrimeiro = false;
                    
                    }
                    else
                    {


                        valorAtual = Convert.ToDecimal(dr.Cells[5].Value);
                        if (menorValor > valorAtual)
                            menorValor = valorAtual;
                        if (maiorValor < valorAtual)
                            maiorValor = valorAtual;


                    }
                }
                diferenca = maiorValor - menorValor;
                txtTotalKm.Text = Convert.ToString(diferenca);
                diferencaAtual = maiorValor - valorAnterior;
                valorAnterior = maiorValor;
                txtKmRodados.Text = diferencaAtual.ToString();

    pessoal

    consegui desta forma:

    bool ehPrimeiro = true;
                decimal valorAtual = 0;
                decimal diferenca = 0;
                decimal menorValor = 0;
                decimal maiorValor = 0;
                decimal valorAnterior = 0;
                foreach (DataGridViewRow dr in dataGridView1.Rows)
                {
                    if (ehPrimeiro)
                    {
                        menorValor = maiorValor = Convert.ToDecimal(dr.Cells[5].Value);
                        ehPrimeiro = false;
                    }
                    else
                    {
                        valorAtual = Convert.ToDecimal(dr.Cells[5].Value);
                        if (menorValor > valorAtual)
                            menorValor = valorAtual;
                        if (maiorValor < valorAtual)
                            maiorValor = valorAtual;
                    }
                    if (ehPrimeiro)
                    {
                        valorAnterior = Convert.ToDecimal(dr.Cells[5].Value);
                        ehPrimeiro = false;
                    }
                    else
                    {
                        valorAtual = Convert.ToDecimal(dr.Cells[5].Value);
                        diferenca = valorAtual - valorAnterior;
                        valorAnterior = valorAtual;
                        txtKmRodados.Text = valorAtual.ToString();
                        txtKmRodados.Text = diferenca.ToString();
                        diferenca = maiorValor - menorValor;
                        txtTotalKm.Text = Convert.ToString(diferenca);
                      

    talvez tenha uma maneira mais simples, porem pra mim vale o funcional que é este acima.

    obrigado ha todos pela ajuda.

    para quem está iniciando é mt importante a opiniao e sugestao dos mais experientes.

    • Marcado como Resposta Marcos_Roberto sábado, 31 de março de 2012 16:54
    sábado, 31 de março de 2012 16:54
  • Faz desta forma, apenas tens de adaptar, menos ou mais, ou devidir, depende de ti:

            # region Calcular Data Grid

            private void Cacular()
            {
                if (this.dataGridView1.Rows.Count > 0)
                    this.dataGridView1.Rows[0].Cells["Column1"].Value = Total().ToString("c");
            }

            private double Total()
            {
                double tot = 0;
                int i = 0;
                for (i = 0; i < dataGridView1.Rows.Count; i++)
                {
                    tot = tot + Convert.ToDouble(dataGridView1.Rows[i].Cells["Numero"].Value);
                }
                return tot;
            }
            # endregion


    One word frees us of all the weight and pain of life: that word is love.

    obrigado amigo.

    depois de muito bater cabeça eu consegui graças a ajuda do pessoal aqui.

     sds

    sábado, 31 de março de 2012 16:57