Inquiridor
Somar parcelas marcadas

Discussão Geral
-
Eu tenho um gridview aonde tem as parcelas de cliente, no grid tem uma coluna CheckBox para marcar as parcelas que sera dado baixa, na tela possui um textbox aonde mostra o valor das parcelas marcadas, conforme vai marcando ele vai somando o valor de cada parcela marcada e apresenta o total marcado no textbox, e se caso desmarcar alguma parcela precisa diminuir o valor da parcela desmarcada, alguém pode me ajudar como fazer isso?
- Tipo Alterado Filipe B CastroModerator quinta-feira, 21 de dezembro de 2017 16:36 how to
Todas as Respostas
-
Boa tarde, Guilherme Walter.
Poderia postar o que já tem do teu código para que pudessemos te ajudar?
Atenciosamente,Filipe B de Castro
Esse conteúdo é fornecido sem garantias de qualquer tipo, seja expressa ou implícita
MSDN Community Support
Por favor, lembre-se de Marcar como Resposta as postagens que resolveram o seu problema. Essa é uma maneira comum de reconhecer aqueles que o ajudaram e fazer com que seja mais fácil para os outros visitantes encontrarem a resolução mais tarde.
-
Na propriedade do Grid CellContentClick inclui isso, porem quando marca o checkbox, a primeira linha não calcula o valor no textbox, eu preciso pular o foco para a linha de baixo pra poder calcular, quando desmarca a linha é a mesma coisa, precisa pular para outra linha o foco para atualizar o valor do textbox.decimal soma = 0; foreach (DataGridViewRow row in GridConsultaRecebimentoAprazo.Rows) { if (Convert.ToBoolean(row.Cells[0].Value)) { GridConsultaRecebimentoAprazo.EndEdit(); soma += Convert.ToDecimal(row.Cells["colValorParcela"].Value); } TxtTotalSelecionado.Text = soma.ToString(); Configuracao.FormatarValorMonetarioSaida(ref TxtTotalSelecionado); }
-
Boa tarde.
Você deve finalizar a edição (troca de valor da célula), conforme exemplo abaixo.
private void dataGridView1_CellContentClick(object sender, DataGridViewCellEventArgs e) { dataGridView1.EndEdit();
decimal Soma = 0; for (int i = 0; i < dataGridView1.Rows.Count - 1; i++) { if (Convert.ToBoolean(dataGridView1.Rows[i].Cells[0].Value) == true) Soma += Convert.ToDecimal (dataGridView1.Rows[i].Cells[1].Value); } txtSoma.Text = Soma.ToString(); }
MARIANO1776
- Editado Mariano1776 sábado, 23 de dezembro de 2017 09:49 Correção de informação
-
Boa tarde.
Você deve finalizar a edição (troca de valor da célula), conforme exemplo abaixo.
private void dataGridView1_CellContentClick(object sender, DataGridViewCellEventArgs e) { dataGridView1.BeginEdit(true); dataGridView1.EndEdit();
decimal Soma = 0; for (int i = 0; i < dataGridView1.Rows.Count - 1; i++) { if (Convert.ToBoolean(dataGridView1.Rows[i].Cells[0].Value) == true) Soma += Convert.ToDecimal (dataGridView1.Rows[i].Cells[1].Value); } txtSoma.Text = Soma.ToString(); }
MARIANO1776
Nesse caso especifico, os dados do grid estão explicitamente sendo usados em Runtime, isso não afetará a manipulação do valor da célula, não precisa do BeginEdit.
Mais isso é sim um solução para o que ele precisa.
Se a resposta for relevante ou tenha resolvido seu problema, marque como útil/resposta!
Rafael Almeida
Senior Developer C#
Development Leader at JAMSOFT Informática
Microsoft Certified Professional
Criador e Mantenedor do EntityFramework Core for Firebird
Contribuidor do EntityFramework Core
Email: ralms@ralms.net
Blog - GitHub - LinkedIn - Twitter- Editado Rafael Almeida - MVPMVP sábado, 23 de dezembro de 2017 01:24 nome
-
-
Ótimo Mariano, deu certo, agora uma outra duvida, a tecla ESPAÇO do teclado marca o check box, porem se quiser desmarcar com a tecla espaço você precisa sair da linha e retornar novamente para desmarcar o check box, ou seja precisa sair do foco e retornar para desmarcar ou marcar com a tecla espaço, você sabe o que pode ser feito nesse caso?
-
Boa noite.
Inclua o código abaixo
private void dataGridView1_CellContentClick(object sender, DataGridViewCellEventArgs e) {
if (Convert.ToBoolean(dataGridView1.CurrentCell.Value) == true)
{
dataGridView1.CurrentCell .Value = false;
}
else
{
dataGridView1.CurrentCell.Value = true;
}dataGridView1.EndEdit();
decimal Soma = 0; for (int i = 0; i < dataGridView1.Rows.Count - 1; i++) { if (Convert.ToBoolean(dataGridView1.Rows[i].Cells[0].Value) == true) Soma += Convert.ToDecimal (dataGridView1.Rows[i].Cells[1].Value); } txtSoma.Text = Soma.ToString(); }
MARIANO1776
-
-
Boa tarde, testei sim, mas não funcionou, ele não somava novamente os valores do que tinha marcado, atualmente esta assim.
try { GridConsultaRecebimentoAprazo.EndEdit(); decimal soma = 0; foreach (DataGridViewRow row in GridConsultaRecebimentoAprazo.Rows) { if (Convert.ToBoolean(row.Cells[0].Value)) { GridConsultaRecebimentoAprazo.EndEdit(); soma += Convert.ToDecimal(row.Cells["colValorParcela"].Value); } TxtTotalSelecionado.Text = soma.ToString(); Configuracao.FormatarValorMonetarioSaida(ref TxtTotalSelecionado); } } catch (Exception ex) { TratamentoErros.Tratar(ex); }
- Editado Guilherme Walter sábado, 30 de dezembro de 2017 18:05 erro lancamento
-
Boa tarde, Guilherme.
Você incluiu as linhas em negrito do código abaixo?
No link abaixo está o projeto para download e teste.
https://mega.nz/#!sxFXka7D!yb8Jnk_tTumJe5dk1RabfZTlZwRH7OuxnZ4I0s7gF5I
Chave: !yb8Jnk_tTumJe5dk1RabfZTlZwRH7OuxnZ4I0s7gF5I
private void dataGridView1_CellContentClick(object sender, DataGridViewCellEventArgs e) { decimal Soma = 0; if (Convert.ToBoolean(dataGridView1.CurrentCell.Value) == true) { dataGridView1.CurrentCell.Value = false; } else { dataGridView1.CurrentCell.Value = true; } dataGridView1.EndEdit(); for (int i = 0; i < dataGridView1.Rows.Count - 1; i++) { if (Convert.ToBoolean(dataGridView1.Rows[i].Cells[0].Value) == true) Soma += Convert.ToDecimal(dataGridView1.Rows[i].Cells[1].Value); } txtSoma.Text = Soma.ToString(); }
MARIANO1776
-
Sim, inclui sim. alem de não somar as parcelas marcadas, se ir marcando e desmarcando chega uma hora que apresenta esse erro.
- Editado Guilherme Walter terça-feira, 2 de janeiro de 2018 13:14 edição
-
Sim, inclui sim. alem de não somar as parcelas marcadas, se ir marcando e desmarcando chega uma hora que apresenta esse erro.
Você está usando click para marcar ou tecla Space/Enter?
Para podermos tentar lhe ajudar com uma solução melhor!
Se a resposta for relevante ou tenha resolvido seu problema, marque como útil/resposta!
Rafael Almeida
Microsoft Developer .NET
Microsoft Certified Professional
Development Leader at JAMSOFT Informática
Email: ralms@ralms.net
Blog - GitHub - LinkedIn - Twitter -
Sim, inclui sim. alem de não somar as parcelas marcadas, se ir marcando e desmarcando chega uma hora que apresenta esse erro.
Você está usando isso?
for (int i = 0; i < dataGridView1.Rows.Count - 1; i++) { if (Convert.ToBoolean(dataGridView1.Rows[i].Cells[0].Value) == true) Soma += Convert.ToDecimal(dataGridView1.Rows[i].Cells[1].Value); }
Por que se estiver sempre irá ficar faltando somar a última linha por causa do Count-1.
Se i for menor que dataGridView1.Rows.Cout já basta!
Se a resposta for relevante ou tenha resolvido seu problema, marque como útil/resposta!
Rafael Almeida
Microsoft Developer .NET
Microsoft Certified Professional
Development Leader at JAMSOFT Informática
Email: ralms@ralms.net
Blog - GitHub - LinkedIn - Twitter -
Boa noite, Guilherme.
Você experimentou baixar o projeto que deixei no link abaixo para comparar/analisar?
https://mega.nz/#!sxFXka7D!yb8Jnk_tTumJe5dk1RabfZTlZwRH7OuxnZ4I0s7gF5I
Chave: !yb8Jnk_tTumJe5dk1RabfZTlZwRH7OuxnZ4I0s7gF5I
MARIANO1776
-
-
Boa noite, Guilherme.
Realmente é estranho, pois comigo funciona com mouse e com tecla espaço.
Tente alterando conforme abaixo em negrito. A mensagem é apenas para exibir o valor que foi coletado, portanto deverá ser removida após o código funcionar corretamente.
Caso não funcione, tente colocar os arquivos do projeto para que possa ser baixado no onedrive, mega ou outro.
private void dataGridView1_CellContentClick(object sender, DataGridViewCellEventArgs e) { MessageBox.Show(dataGridView1.CurrentCell.Value.ToString() ); decimal Soma = 0; if (dataGridView1.CurrentCell.Value.ToString() == "True") { dataGridView1.CurrentCell.Value = false; } else { dataGridView1.CurrentCell.Value = true; } dataGridView1.EndEdit(); for (int i = 0; i < dataGridView1.Rows.Count - 1; i++) { if (Convert.ToBoolean(dataGridView1.Rows[i].Cells[0].Value) == true) Soma += Convert.ToDecimal(dataGridView1.Rows[i].Cells[1].Value); } txtSoma.Text = Soma.ToString(); }
MARIANO1776
- Editado Mariano1776 sexta-feira, 5 de janeiro de 2018 01:17 complemento
-
Troque sua linha amarela por isso:
if(bool.TryParse(GridConsultaRecebimentoAprazo[0,e.RowIndex].Value.ToString(),out bool Ativado) && Ativado)
Assim, forcamos sempre ler os valores da coluna 0, por que o cliente pode clicar em outra coluna e assim, gera esse erro.
Por que o valor está sendo recuperado da coluna clicada e não da coluna onde existe o controle do checkbox!
Se a resposta for relevante ou tenha resolvido seu problema, marque como útil/resposta!
Rafael Almeida
Microsoft Developer .NET
Microsoft Certified Professional
Development Leader at JAMSOFT Informática
Email: ralms@ralms.net
Blog - GitHub - LinkedIn - Twitter -
Agora deu certo, problema era coluna abaixo:
Porem a ultima linha marcada não esta somando, soma da 1 linha até a penúltima.
- Editado Guilherme Walter sexta-feira, 5 de janeiro de 2018 16:31 erro
-
Agora deu certo, problema era coluna abaixo:
Porem a ultima linha marcada não esta somando, soma da 1 linha até a penúltima.
Retire esse Count -1 e deixe somente Count.
Tinha falo sobre isso lá logo acima!
Se a resposta for relevante ou tenha resolvido seu problema, marque como útil/resposta!
Rafael Almeida
Microsoft Developer .NET
Microsoft Certified Professional
Development Leader at JAMSOFT Informática
Email: ralms@ralms.net
Blog - GitHub - LinkedIn - Twitter -
-
Rafael, deu certo mas voltou o erro de conversão, esse linha abaixo que você fez, da erro:
if(bool.TryParse(GridConsultaRecebimentoAprazo[0,e.RowIndex].Value.ToString(),out bool Ativado) && Ativado)
Você deve está usando um versão mais antiga do .NET (C#) que não a suporte para isso.
Você falou que tinha ficando funcionando, só não somava a ultima parcela.
Deixe do jeito que estava, e onde tem:
for (int i = 0; i < dataGridView1.Rows.Count - 1; i++)
Deixa assim:
for (int i = 0; i < dataGridView1.Rows.Count; i++)
Isso resolverá o seu problema de não somar a ultima parcela!
Se não funcionar post aqui seu código de formulário.. e farei as adaptações para você!
Se a resposta for relevante ou tenha resolvido seu problema, marque como útil/resposta!
Rafael Almeida
Microsoft Developer .NET
Microsoft Certified Professional
Development Leader at JAMSOFT Informática
Email: ralms@ralms.net
Blog - GitHub - LinkedIn - Twitter -
Fiz isso mas da esse erro novamente.
- Editado Guilherme Walter sexta-feira, 5 de janeiro de 2018 18:16 erro
-
Eu fiz isso, mas como falei acima da erro de conversão boolen.
Guilherme,
Coloque a função aqui, pra que eu analise e ajuste ela pra você.
Blz!
Se a resposta for relevante ou tenha resolvido seu problema, marque como útil/resposta!
Rafael Almeida
Microsoft Developer .NET
Microsoft Certified Professional
Development Leader at JAMSOFT Informática
Email: ralms@ralms.net
Blog - GitHub - LinkedIn - Twitter -
decimal Soma = 0; if (Convert.ToBoolean(GridConsultaRecebimentoAprazo.CurrentCell.Value) == true) { GridConsultaRecebimentoAprazo.CurrentCell.Value = false; } else { GridConsultaRecebimentoAprazo.CurrentCell.Value = true; } GridConsultaRecebimentoAprazo.EndEdit(); for (int i = 0; i < GridConsultaRecebimentoAprazo.Rows.Count; i++) { if (Convert.ToBoolean(GridConsultaRecebimentoAprazo.Rows[i].Cells[0].Value) == true) Soma += Convert.ToDecimal(GridConsultaRecebimentoAprazo.Rows[i].Cells["colValorParcela"].Value); } TxtTotalSelecionado.Text = Soma.ToString(); Configuracao.FormatarValorMonetarioSaida(ref TxtTotalSelecionado);
-
Tente usar isso:
decimal Soma = 0; bool selecionada; int linhaSelecionada = GridConsultaRecebimentoAprazo.CurrentRow.Index; bool.TryParse(GridConsultaRecebimentoAprazo[0, linhaSelecionada].Value.ToString(), out selecionada); if (selecionada) { GridConsultaRecebimentoAprazo[0, linhaSelecionada].Value = false; } else { GridConsultaRecebimentoAprazo[0, linhaSelecionada].Value = true; } GridConsultaRecebimentoAprazo.EndEdit(); for (int i = 0; i < GridConsultaRecebimentoAprazo.Rows.Count; i++) { bool.TryParse(GridConsultaRecebimentoAprazo[0, i].Value.ToString(), out selecionada); if (selecionada) { Soma += Convert.ToDecimal(GridConsultaRecebimentoAprazo.Rows[i].Cells["colValorParcela"].Value); } } TxtTotalSelecionado.Text = Soma.ToString(); Configuracao.FormatarValorMonetarioSaida(ref TxtTotalSelecionado);
Abraços!
Se a resposta for relevante ou tenha resolvido seu problema, marque como útil/resposta!
Rafael Almeida
Microsoft Developer .NET
Microsoft Certified Professional
Development Leader at JAMSOFT Informática
Email: ralms@ralms.net
Blog - GitHub - LinkedIn - Twitter- Editado Rafael Almeida - MVPMVP sexta-feira, 5 de janeiro de 2018 18:41 ajudar nome grid!
-
Não funcionou.
- Editado Guilherme Walter terça-feira, 9 de janeiro de 2018 16:18 erro
-
-
Prezado Guilherme.
Tente colocar os arquivos do projeto para que possa ser baixado no onedrive, mega ou outro para que possamos analisar, pois entendo que o problema não está nesta parte do código.
Algum outro evento ou rotina está provocando este erro.
Como expus acima, o código é simples e objetivo e testei antes de deixar a solução para baixar e comparar aqui:
https://mega.nz/#!sxFXka7D!yb8Jnk_tTumJe5dk1RabfZTlZwRH7OuxnZ4I0s7gF5I
Chave: !yb8Jnk_tTumJe5dk1RabfZTlZwRH7OuxnZ4I0s7gF5I
MARIANO1776
-
Tem um monte de amarração com classe na tela, isso dificulta postar ela, mas se debugar, o erro acontece na imagem acima então não pode ser em outro lugar. Lembrando que o código testado foi o enviado pelo nosso amigo Rafael Almeida.
- Editado Guilherme Walter terça-feira, 16 de janeiro de 2018 13:49 erro
-
Guilherme, boa tarde!
Fiz um exemplo simples, e está funcionando normal, segue abaixo meu código.
Não sei como estão suas colunas, mas estou utilizando uma DataTable "fixa" com uma coluna do tipo bool e outra decimal.
private void popularGrid() { DataTable table = new DataTable("table"); table.Columns.Add(new DataColumn("colCheck", typeof(bool))); table.Columns.Add(new DataColumn("valorParcela", typeof(decimal))); DataRow row = table.NewRow(); row["colCheck"] = false; row["valorParcela"] = 150; table.Rows.Add(row); row = table.NewRow(); row["colCheck"] = false; row["valorParcela"] = 200; table.Rows.Add(row); row = table.NewRow(); row["colCheck"] = false; row["valorParcela"] = 10; table.Rows.Add(row); row = table.NewRow(); row["colCheck"] = false; row["valorParcela"] = 580; table.Rows.Add(row); row = table.NewRow(); row["colCheck"] = false; row["valorParcela"] = 5; table.Rows.Add(row); dataGridView1.DataSource = table; } private void Form1_Load(object sender, EventArgs e) { popularGrid(); } // private void calcularValores() { dataGridView1.EndEdit(); DataTable table = (DataTable)dataGridView1.DataSource; var total = table.AsEnumerable() .Where(c => Convert.ToBoolean(c["colCheck"])) .Sum(c => Convert.ToDecimal(c["valorParcela"])); label1.Text = total.ToString("N2"); } private void dataGridView1_CellContentClick(object sender, DataGridViewCellEventArgs e) { calcularValores(); }
Faça a adaptação do seu código no meu exemplo, caso tenha dúvidas, estou a disposição.
att.
Felipe
-
-
-
void MontaGridPesquisa() { try { int? id; if (string.IsNullOrEmpty(TxtIdCliente.Text)) id = null; else id = Convert.ToInt32(TxtIdCliente.Text); DateTime dtInicio = DateTimeDataInicial.Value.Date; DateTime dtFim = DateTimeDataFinal.Value.Date; GridConsultaRecebimentoAprazo.DataSource = ParcelasContasReceber.MontaGrid_recebimento(criterioConsulta, id, dtInicio, dtFim); //GridConsultaLancContasReceber.DataSource = ParcelasContasReceber.MontaGrid(); // decimal valor = 0, desconto = 0, acrescimo = 0, juros = 0, multa = 0, recebido = 0, saldo = 0; decimal valor = 0, total_pago =0, desconto = 0, juros = 0, multa = 0; foreach (DataGridViewRow row in GridConsultaRecebimentoAprazo.Rows) //Passar por todas as linhas do grid { decimal arrumavalor; decimal.TryParse(row.Cells["colTotalPago"].Value == null ? "0" : row.Cells["colTotalPago"].Value.ToString(), out arrumavalor); //Converter o valor da coluna para decimal total_pago += arrumavalor; //Somar ao valor já existente decimal.TryParse(row.Cells["colDesconto"].Value == null ? "0" : row.Cells["colDesconto"].Value.ToString(), out arrumavalor); desconto += arrumavalor; decimal.TryParse(row.Cells["colValorParcela"].Value == null ? "0" : row.Cells["colValorParcela"].Value.ToString(), out arrumavalor); valor += arrumavalor; decimal.TryParse(row.Cells["colJuros"].Value == null ? "0" : row.Cells["colJuros"].Value.ToString(), out arrumavalor); juros += arrumavalor; decimal.TryParse(row.Cells["colMulta"].Value == null ? "0" : row.Cells["colMulta"].Value.ToString(), out arrumavalor); multa += arrumavalor; //decimal.TryParse(row.Cells["colRecebido"].Value == null ? "0" : row.Cells["colRecebido"].Value.ToString(), out arrumavalor); //recebido += arrumavalor; //decimal.TryParse(row.Cells["colSaldo"].Value == null ? "0" : row.Cells["colSaldo"].Value.ToString(), out arrumavalor); //saldo += arrumavalor; } TxtTotalPago.Text = total_pago.ToString("n2"); //setar a soma no label TxtDesconto.Text = desconto.ToString("n2"); TxtValorParcela.Text = valor.ToString("n2"); TxtJuros.Text = juros.ToString("n2"); TxtMulta.Text = multa.ToString("n2"); // TxtRecebidoTotal.Text = recebido.ToString("n2"); // TxtSaldoDevedorTotal.Text = saldo.ToString("n2"); GridConsultaRecebimentoAprazo.Focus(); } catch (Exception ex) { TratamentoErros.Tratar(ex); } }
public static BindingSource MontaGrid_recebimento(CriterioConsultaContasReceber criterio, int? IdCliente, DateTime dtInicio, DateTime dtFim) { try { BindingSource bds = new BindingSource(); List<ParcelasContasReceber> parcelas; switch (criterio) { case CriterioConsultaContasReceber.A_Receber: parcelas = ParcelasContasReceber.FindAll().Where(f => f.Situacao.Equals("EM ABERTO", StringComparison.OrdinalIgnoreCase)).ToList(); //Fitrar por as contas com o status A RECEBER break; case CriterioConsultaContasReceber.Canceladas: parcelas = ParcelasContasReceber.FindAll().Where(f => f.Situacao.Equals("CANCELADA", StringComparison.OrdinalIgnoreCase)).ToList(); //Filtrar as contas pelo status CANCELADA break; case CriterioConsultaContasReceber.Recebidas: parcelas = ParcelasContasReceber.FindAll().Where(f => f.Situacao.Equals("RECEBIDA", StringComparison.OrdinalIgnoreCase)).ToList(); //Filtrar as contas pelo status RECEBIDA break; case CriterioConsultaContasReceber.Todas: parcelas = ParcelasContasReceber.FindAll(); //PEGAR TODAS AS CONTAS break; default: throw new IndexOutOfRangeException("O valor de consulta estava fora do intervalo esperado"); } parcelas = parcelas.Where(c => c.DataVencimento >= dtInicio && c.DataVencimento <= dtFim).ToList(); //FILTRAR POR DATA if (parcelas.Count == 0) return null; List<Cliente> clientes = Cliente.FindAll(); //SELECIONAR TODOS OS CLIENTES PARA FAZER O LEFT JOIN COM AS CONTAS List<LancamentoContasReceber> contas = LancamentoContasReceber.FindAll(); using (var conexao = new Conexao()) { bds.DataSource = from r in parcelas //QUERY QUE MONTA O GRID orderby r.DataVencimento ascending join rec in contas on r.IdContasReceber equals rec.Id into _rec from _crec in _rec.DefaultIfEmpty() join c in clientes on _crec.IdCliente equals c.Id into _cr from _cli in _cr.DefaultIfEmpty() where IdCliente == null ? true : _crec.IdCliente == IdCliente select new { r.Id, IdContaReceber = _crec.Id, r.DataVencimento, Dias = (DateTime.Now - r.DataVencimento).Days * -1, r.DataEmissao, NumeroParcela = r.NumeroParcela, Valor = r.ValorParcela, TotalRecebido = r.ValorRecebido, Origem = _crec.Origem, //SaldoDevedor = Math.Round((decimal)r.ValorParcela, 2, MidpointRounding.ToEven), Desconto = r.Desconto, Acrescimo = r.Acrescimo, Juros = r.Juros, Multa = r.Multa, Situacao = r.Situacao, IdCliente = (_cli == null ? 0 : _cli.Id), NomeCliente = (_cli.NomeRazao == null ? "" : _cli.NomeRazao) }; } return bds; } catch (DbEntityValidationException e) { String Error = String.Empty; foreach (var eve in e.EntityValidationErrors) { Error += String.Format("Entity of type \"{0}\" in state \"{1}\" has the following validation errors:", eve.Entry.Entity.GetType().Name, eve.Entry.State); foreach (var ve in eve.ValidationErrors) { Error += String.Format("- Propriedade: \"{0}\", Erro: \"{1}\"", ve.PropertyName, ve.ErrorMessage); } } throw new Exception(string.Format("{0} {1} {2}", Error, e.Message, (string.IsNullOrEmpty(e.InnerException.Message) ? "" : e.InnerException.Message))); } catch (Exception ex) { throw ex; }
-
-
Eu nunca utilizei BindingSource, mas vou tentar te ajudar.
Eu não possuo registros aqui, então faça um teste com um método que eu achei.
Referência:BindingSource to DataTable
Faça essa alteração no método que eu tinha te passado:
private void calcularValores() { dataGridView1.EndEdit(); DataTable table =((BindingSource)dataGridView1.DataSource).Table(); var total = table.AsEnumerable() .Where(c => Convert.ToBoolean(c["colCheck"])) .Sum(c => Convert.ToDecimal(c["valorParcela"])); label1.Text = total.ToString("N2"); }
Crie uma classe estática para utilizar o método de extensão Table(), pode ser dentro do seu form mesmo:
public static class Extension { public static DataTable Table(this BindingSource bs) { var bsFirst = bs; while (bsFirst.DataSource is BindingSource) bsFirst = (BindingSource)bsFirst.DataSource; DataTable dt; if (bsFirst.DataSource is DataSet) dt = ((DataSet)bsFirst.DataSource).Tables[bsFirst.DataMember]; else if (bsFirst.DataSource is DataTable) dt = (DataTable)bsFirst.DataSource; else return null; if (bsFirst != bs) { if (dt.DataSet == null) return null; dt = dt.DataSet.Relations[bs.DataMember].ChildTable; } return dt; } }
Verifique se vai funcionar, como falei, não possuo os dados aqui, então esta retornando "null" o objeto BindingSource.
att.
Felipe
-
-
-
O que aconteceu, erros, não retornou nada?
Zipa seu projeto, e sobe no OneDrive, consegue fazer isso?
É uma coisa simples de se fazer, porém a galera do fórum não esta conseguindo te ajudar por causa disso..
att.
Felipe
Só pra complementar.
Estou passando a acreditar que os valores da coluna 0 estão como DBNull e não com o type(Boolean).
Outra coisa é que não seja a coluna 0 que tem a propriedade boolean
Se a resposta for relevante ou tenha resolvido seu problema, marque como útil/resposta!
Rafael Almeida
Microsoft Developer .NET
Microsoft Certified Professional
Development Leader at JAMSOFT Informática
Email: ralms@ralms.net
Blog - GitHub - LinkedIn - Twitter -
Guilherme, consegui fazer a conversão do seu BindingSource pra DataTable.
Segue abaixo as alterações.
private void calcularValores() { dataGridView1.EndEdit(); BindingSource bs = (BindingSource)dataGridView1.DataSource; DataTable table = ((IEnumerable<object>)bs.DataSource).AnonymousList2DataTable(); var total = table.AsEnumerable() .Where(c => Convert.ToBoolean(c["colCheck"])) .Sum(c => Convert.ToDecimal(c["valorParcela"])); label1.Text = total.ToString("N2"); }
public static class Extension { public static DataTable AnonymousList2DataTable(this IEnumerable<object> anonymousList) { DataTable table = new DataTable("table"); DataRow row = null; foreach (var item in anonymousList) { row = table.NewRow(); //PEGA AS PROPRIEDADES (CAMPOS) QUE ESTÃO NA LISTA (AnonymousList) PropertyInfo[] fi = item.GetType().GetProperties(); foreach (var itemHeader in fi) { if (!table.Columns.Contains(itemHeader.Name.Trim())) { //table.Columns.Add(new DataColumn(itemHeader.Name.Trim(), itemHeader.GetType())); //table.Columns.Add(new DataColumn(itemHeader.Name.Trim(), itemHeader.GetValue(item).GetType())); //DateTime if (itemHeader.GetMethod.ReturnType.IsGenericType && itemHeader.GetMethod.ReturnType.GetGenericTypeDefinition() == typeof(Nullable<>)) { table.Columns.Add(new DataColumn(itemHeader.Name.Trim(), typeof(DateTime))); } else { table.Columns.Add(new DataColumn(itemHeader.Name.Trim(), itemHeader.GetMethod.ReturnType)); } } if (itemHeader.GetValue(item) == null) { row[itemHeader.Name] = DBNull.Value; } else { row[itemHeader.Name] = itemHeader.GetValue(item); } } table.Rows.Add(row); } return table; } }
Agora é pra funcionar, faça os testes fazendo favor.
att.
Felipe
-
-
-
-
-
-
Isso é errado!
Não pode recuperar informações de propriedades de uma Reflection sem o devido mapeamento.
Guilherme Walter faz o seguinte, coloca o código de seu form aqui!
Assim será mais rápido de resolver. (Todo código do Form)
Existe alguma informação que não percebemos aqui.Se a resposta for relevante ou tenha resolvido seu problema, marque como útil/resposta!
Rafael Almeida
Microsoft Developer .NET
Microsoft Certified Professional
Development Leader at JAMSOFT Informática
Email: ralms@ralms.net
Blog - GitHub - LinkedIn - Twitter -
-
Postei .cs do form abaixo:
https://mega.nz/#!Q543hbxb!4u7lo4KbaoEeJziDT7l7gpyGUUQBAI8BPZ_SN_RUGt8
Se a resposta for relevante ou tenha resolvido seu problema, marque como útil/resposta!
Rafael Almeida
Microsoft Developer .NET
Microsoft Certified Professional
Development Leader at JAMSOFT Informática
Email: ralms@ralms.net
Blog - GitHub - LinkedIn - Twitter -
Olá Guilherme Walter
Tudo Joia?!
Bom coloca o código abaixo no evento CellContentClick
decimal soma = 0; GridConsultaRecebimentoAprazo.BeginEdit(true); DataGridViewCell cell = GridConsultaRecebimentoAprazo.CurrentRow.Cells["colCheckBox"]; if (cell.Value != null && (bool)cell.Value) { cell.Value = false; } else { cell.Value = true; } for (int i = 0; i < GridConsultaRecebimentoAprazo.Rows.Count; i++) { bool selecionada; bool.TryParse(GridConsultaRecebimentoAprazo[0, i].Value.ToString(), out selecionada); if (selecionada) { decimal valorTemp = (decimal)(GridConsultaRecebimentoAprazo.Rows[i].Cells["colValorParcela"].Value ?? 0); Soma += valorTemp; } } GridConsultaRecebimentoAprazo.EndEdit(); // Exibir o Valor das Parcelas Marcadas! Text = Soma.ToString("N2");
Existem outras forma de se fazer isso, mais essa é uma forma para você entender melhor o fluxo!
Se com isso não funcionar, existe algum impeditivo, em seu Form, mais só conseguiria perceber se o Designer.cs estive-se disponível.
Só pra reforçar seu código deverá ficar assim:
decimal Soma = 0; private void GridConsultaRecebimentoAprazo_CellContentClick(object sender, DataGridViewCellEventArgs e) { decimal soma = 0; GridConsultaRecebimentoAprazo.BeginEdit(true); DataGridViewCell cell = GridConsultaRecebimentoAprazo.CurrentRow.Cells["colCheckBox"]; if (cell.Value != null && (bool)cell.Value) { cell.Value = false; } else { cell.Value = true; } for (int i = 0; i < GridConsultaRecebimentoAprazo.Rows.Count; i++) { bool selecionada; bool.TryParse(GridConsultaRecebimentoAprazo[0, i].Value.ToString(), out selecionada); if (selecionada) { decimal valorTemp = (decimal)(GridConsultaRecebimentoAprazo.Rows[i].Cells["colValorParcela"].Value ?? 0); Soma += valorTemp; } } GridConsultaRecebimentoAprazo.EndEdit(); // Exibir o Valor das Parcelas Marcadas! Text = Soma.ToString("N2"); }
Espero que funcione agora!
Abraços.
Se a resposta for relevante ou tenha resolvido seu problema, marque como útil/resposta!
Rafael Almeida
Microsoft Developer .NET
Microsoft Certified Professional
Development Leader at JAMSOFT Informática
Email: ralms@ralms.net
Blog - GitHub - LinkedIn - Twitter -
-
Desde de já agradeço ajuda de todos, mas ainda deu um erro:
Nesse link esta os arquivos completo do form:
https://mega.nz/#!F1ox3CxQ!IXc-SG74WuQtZ9tTWwygwQsg5yvDBVB-WBFauxeMT7w
Estamos mais próximo!
Deixa eu mudar aqui uma coisa, espere!
Se a resposta for relevante ou tenha resolvido seu problema, marque como útil/resposta!
Rafael Almeida
Microsoft Developer .NET
Microsoft Certified Professional
Development Leader at JAMSOFT Informática
Email: ralms@ralms.net
Blog - GitHub - LinkedIn - Twitter -
Use isso:
Soma = 0m; GridConsultaRecebimentoAprazo.BeginEdit(true); DataGridViewCell cell = GridConsultaRecebimentoAprazo.CurrentRow.Cells["colCheckBox"]; if (cell.Value != null && (bool)cell.Value) { cell.Value = false; } else { cell.Value = true; } GridConsultaRecebimentoAprazo.EndEdit(); for (int i = 0; i < GridConsultaRecebimentoAprazo.Rows.Count; i++) { cell = GridConsultaRecebimentoAprazo.Rows[i].Cells["colCheckBox"]; if (cell.Value != null && (bool)cell.Value) { decimal valorTemp = (decimal)(GridConsultaRecebimentoAprazo.Rows[i].Cells["colValorParcela"].Value ?? 0); Soma += valorTemp; } } // Exibir o Valor das Parcelas Marcadas! Text = Soma.ToString("N2");
Tudo isso era pra ser muito mais simples!
Se a resposta for relevante ou tenha resolvido seu problema, marque como útil/resposta!
Rafael Almeida
Microsoft Developer .NET
Microsoft Certified Professional
Development Leader at JAMSOFT Informática
Email: ralms@ralms.net
Blog - GitHub - LinkedIn - Twitter -
Obrigado Rafael, agora funcionou sem erro, só queria ver se voce pode ajudar em 2 coisas, quando em clico em qualquer coluna da linha esta marcando e desmarcando o checkbox, só deve marcar e desmarcar com o foco na coluna 0 do checkbox. eu também tenho um foreach para marcar todos checkbox da grid, porem a linha que esta com foco não marca
foreach (DataGridViewRow _row in GridConsultaRecebimentoAprazo.Rows) { (_row.Cells[0] as DataGridViewCheckBoxCell).Value = false; }
Desde de já agradeço ajuda de todos.
-
Olá Guilherme Walter
Estou feliz por isso.
Você pode colocar isso na primeira linha do CellContentCliclk
if (e?.ColumnIndex != 0) return;
Abraços!
Se a resposta for relevante ou tenha resolvido seu problema, marque como útil/resposta!
Rafael Almeida
Microsoft Developer .NET
Microsoft Certified Professional
Development Leader at JAMSOFT Informática
Email: ralms@ralms.net
Blog - GitHub - LinkedIn - Twitter -
-
A questão de clicar na linha já marcar ou desmarcar parou, mas se eu clicar em marcar todos a linha que esta com foco não marca ou demarca igual a imagem acima.
Então o CheckBox não está no índice 0.Se a resposta for relevante ou tenha resolvido seu problema, marque como útil/resposta!
Rafael Almeida
Microsoft Developer .NET
Microsoft Certified Professional
Development Leader at JAMSOFT Informática
Email: ralms@ralms.net
Blog - GitHub - LinkedIn - Twitter -
Ela é a primeira coluna, só se tem algum bug no VS.
Botão Marcar todos executa isso:
foreach (DataGridViewRow _row in GridConsultaRecebimentoAprazo.Rows) { (_row.Cells[0] as DataGridViewCheckBoxCell).Value = false; }
- Editado Guilherme Walter quinta-feira, 18 de janeiro de 2018 13:12 erro
-
-
-
-
Ainda não Mariano, o código abaixo marca tudo, porem a primeira linha não marca o checkbox
foreach (DataGridViewRow _row in GridConsultaRecebimentoAprazo.Rows) { (_row.Cells[0] as DataGridViewCheckBoxCell).Value = true; }
e esse quando eu clico para desmarcar tudo, ele deixa a primeira linha marcada
foreach (DataGridViewRow _row in GridConsultaRecebimentoAprazo.Rows) { (_row.Cells[0] as DataGridViewCheckBoxCell).Value = false; }