Usuário com melhor resposta
somar ou subtrair coluna em datagridview C#

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
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
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/ -
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 -
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.
-
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.
-
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.
-
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 -
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?
-
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 -
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;
}
# endregionOne word frees us of all the weight and pain of life: that word is love.
-
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
-
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
-
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
-
Leia o artigo Como Calcular em Número de Dias a Diferença Entre Duas Datas com o C# (CSharp)
http://cavas.com.br/index.php/programacao/como-calcular-em-numero-de-dias-a-diferenca-entre-duas-datas-com-o-c-csharp
Abraços,
Marcelo Pereira Cavalini