none
Somar parcelas marcadas RRS feed

  • 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?
    quarta-feira, 20 de dezembro de 2017 17:44

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.

    quinta-feira, 21 de dezembro de 2017 16:05
    Moderador

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

    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.
    quinta-feira, 21 de dezembro de 2017 16:26
  • 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
    sexta-feira, 22 de dezembro de 2017 17:28
  • 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


    sábado, 23 de dezembro de 2017 01:23
  • Bom dia.

    Concordo, o BeginEdit é reduntante para este caso.

    Editei a informação anterior.


    MARIANO1776

    sábado, 23 de dezembro de 2017 09:51
  • Ó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?
    terça-feira, 26 de dezembro de 2017 17:47
  • 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

    quarta-feira, 27 de dezembro de 2017 01:16
  • Boa noite.

    Testou a alteração que fiz referente à tecla espaço?


    MARIANO1776

    sexta-feira, 29 de dezembro de 2017 00:21
  • 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
    sábado, 30 de dezembro de 2017 17:59
  • 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

    sábado, 30 de dezembro de 2017 18:28
  • Sim, inclui sim. alem de não somar as parcelas marcadas, se ir marcando e desmarcando chega uma hora que apresenta esse erro.

    terça-feira, 2 de janeiro de 2018 13:09
  • 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

    terça-feira, 2 de janeiro de 2018 14:23
  • 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

    terça-feira, 2 de janeiro de 2018 14:27
  • 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

    quarta-feira, 3 de janeiro de 2018 00:33
  • Baixei, ele funciona normal né, no meu esta dando isso.

    quinta-feira, 4 de janeiro de 2018 20:35
  • 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
    sexta-feira, 5 de janeiro de 2018 00:01
  • 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

    sexta-feira, 5 de janeiro de 2018 00:22
  • Agora deu certo, problema era coluna abaixo:

    

    Porem a ultima linha marcada não esta somando, soma da 1 linha até a penúltima.

    sexta-feira, 5 de janeiro de 2018 16:06
  • 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

    sexta-feira, 5 de janeiro de 2018 17:04
  • 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)
    sexta-feira, 5 de janeiro de 2018 17:15
  • 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

    sexta-feira, 5 de janeiro de 2018 17:28

  • Fiz isso mas da esse erro novamente.

    sexta-feira, 5 de janeiro de 2018 18:12
  • 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

    sexta-feira, 5 de janeiro de 2018 18:16
  •  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);

    sexta-feira, 5 de janeiro de 2018 18:17
  • 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


    sexta-feira, 5 de janeiro de 2018 18:24
  • Não funcionou.

    segunda-feira, 8 de janeiro de 2018 19:02
  • Alguma solução ?
    quarta-feira, 10 de janeiro de 2018 16:22
  • 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

    quarta-feira, 10 de janeiro de 2018 17:11
  • 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.

    terça-feira, 16 de janeiro de 2018 13:30
  • 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

    terça-feira, 16 de janeiro de 2018 15:51
  • Obrigado pela ajuda felipe, deu esse erro abaixo:

    terça-feira, 16 de janeiro de 2018 16:14
  • Como você esta populando seu grid?

    att.

    Felipe

    terça-feira, 16 de janeiro de 2018 16:15
  • 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;
                }

    terça-feira, 16 de janeiro de 2018 16:44
  • Certo!

    Vou fazer uns testes aqui, já te dou um retorno.

    att.

    Felipe

    terça-feira, 16 de janeiro de 2018 17:05
  • 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

    terça-feira, 16 de janeiro de 2018 17:21
  • Infelizmente não funcionou, tem outro método posso usar?
    terça-feira, 16 de janeiro de 2018 17:33
  • 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

    terça-feira, 16 de janeiro de 2018 17:35
  • 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

    terça-feira, 16 de janeiro de 2018 17:43
  • 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

    terça-feira, 16 de janeiro de 2018 18:39
  • public static class Extension

    COLOCO DENTRO DO FORM?

    terça-feira, 16 de janeiro de 2018 18:44
  • Coloca la em cima, antes do "public partial class..."

    att.

    Felipe

    terça-feira, 16 de janeiro de 2018 18:47
  • terça-feira, 16 de janeiro de 2018 19:03
  • Cara, desculpa, falei besteira.

    Vai dar problema se colocar no form, crie uma classe estatica no seu projeto, e coloque esse código que te passei.

    att.

    Felipe

    terça-feira, 16 de janeiro de 2018 19:05
  • terça-feira, 16 de janeiro de 2018 19:41
  • 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

    terça-feira, 16 de janeiro de 2018 19:48
  • Postei .cs do form abaixo:

    https://mega.nz/#!Q543hbxb!4u7lo4KbaoEeJziDT7l7gpyGUUQBAI8BPZ_SN_RUGt8

    terça-feira, 16 de janeiro de 2018 20:09
  • Postei .cs do form abaixo:

    https://mega.nz/#!Q543hbxb!4u7lo4KbaoEeJziDT7l7gpyGUUQBAI8BPZ_SN_RUGt8

    Agora irá ser melhor de analisar.. assim que chegar em casa irei olhar!

    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

    terça-feira, 16 de janeiro de 2018 20:50
  • 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

    quarta-feira, 17 de janeiro de 2018 01:55
  • 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

    quarta-feira, 17 de janeiro de 2018 12:40
  • 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

    quarta-feira, 17 de janeiro de 2018 13:02
  • 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

    quarta-feira, 17 de janeiro de 2018 13:12
  • 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.

    quinta-feira, 18 de janeiro de 2018 11:51
  • 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

    quinta-feira, 18 de janeiro de 2018 12:09
  • 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.
    quinta-feira, 18 de janeiro de 2018 12:24
  • 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

    quinta-feira, 18 de janeiro de 2018 12:41
  • 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;
                        }

    quinta-feira, 18 de janeiro de 2018 13:11
  • Alguma sugestão Rafael?
    segunda-feira, 29 de janeiro de 2018 17:12
  • Alguém?
    quarta-feira, 7 de fevereiro de 2018 11:37
  • Boa noite.

    Conseguiu algum avanço?


    MARIANO1776

    sexta-feira, 16 de março de 2018 22:29
  • 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;
                        }

    terça-feira, 24 de abril de 2018 14:41