none
Fazer cálculo do Saldo com valores dos textBoxes RRS feed

  • Pergunta

  • Boa noite pessoal,

    Estou com um probleminha de conversão, para efetuar cálculos com os textboxes.

    Tenho na tabela todos os campos dos textboxes em "decimal" (18,2).

    Estou querendo efetuar o cálculo do saldo quando houver mudanças nos valores digitados.

    No Form_Load já estou recebendo esta mensagem de Erro: 

    "System.FormatException: 'A cadeia de caracteres de entrada não estava em um formato correto.'

    segue abaixo os códigos dos textboxes. "  Está vindo no acrescimosTextBox_TextChanged *

    Não sei porque está acontecendo isto, pois a tabela está com todos os valores decimais ex.: 789,12.

    Podem me ajudar por favor? segue o código:

     private void valor_TituloTextBox_TextChanged(object sender, EventArgs e)
            {
                decimal valortitulo = 0;
                decimal valorpagoavista = 0;
                decimal acrescimos = 0;
                decimal descontos = 0;
                decimal saldo = 0;
                valortitulo = Convert.ToDecimal(valor_TituloTextBox.Text);
                valorpagoavista = Convert.ToDecimal(valor_Pago_a_VistaTextBox.Text);
                acrescimos = Convert.ToDecimal(acrescimosTextBox.Text);
                descontos = Convert.ToDecimal(descontosTextBox.Text);
                saldo = (valortitulo + acrescimos) - (valorpagoavista + descontos);
                saldoTextBox.Text = saldo.ToString();
            }
    
            private void descontosTextBox_TextChanged(object sender, EventArgs e)
            {
                decimal valortitulo = 0;
                decimal valorpagoavista = 0;
                decimal acrescimos = 0;
                decimal descontos = 0;
                decimal saldo = 0;
                valortitulo = Convert.ToDecimal(valor_TituloTextBox.Text);
                valorpagoavista = Convert.ToDecimal(valor_Pago_a_VistaTextBox.Text);
                acrescimos = Convert.ToDecimal(acrescimosTextBox.Text);
                descontos = Convert.ToDecimal(descontosTextBox.Text);
                saldo = (valortitulo + acrescimos) - (valorpagoavista + descontos);
                saldoTextBox.Text = saldo.ToString();
            }
    
            private void valor_Pago_a_VistaTextBox_TextChanged(object sender, EventArgs e)
            {
                decimal valortitulo = 0;
                decimal valorpagoavista = 0;
                decimal acrescimos = 0;
                decimal descontos = 0;
                decimal saldo = 0;
                valortitulo = Convert.ToDecimal(valor_TituloTextBox.Text);
                valorpagoavista = Convert.ToDecimal(valor_Pago_a_VistaTextBox.Text);
                acrescimos = Convert.ToDecimal(acrescimosTextBox.Text);
                descontos = Convert.ToDecimal(descontosTextBox.Text);
                saldo = (valortitulo + acrescimos) - (valorpagoavista + descontos);
                saldoTextBox.Text = saldo.ToString();
            }
    
            private void acrescimosTextBox_TextChanged(object sender, EventArgs e) 
            {
                decimal valortitulo = 0;
                decimal valorpagoavista = 0;
                decimal acrescimos = 0;
                decimal descontos = 0;
                decimal saldo = 0;
                valortitulo = Convert.ToDecimal(valor_TituloTextBox.Text); // Recebo aqui a mensagem acima *
                valorpagoavista = Convert.ToDecimal(valor_Pago_a_VistaTextBox.Text);
                acrescimos = Convert.ToDecimal(acrescimosTextBox.Text);
                descontos = Convert.ToDecimal(descontosTextBox.Text);
                saldo = (valortitulo + acrescimos) - (valorpagoavista + descontos);
                saldoTextBox.Text = saldo.ToString();
            }

    O código eu copiei e colei nos textbox_changed pois são valores que vão alterar o saldo, caso haja alguma modificação no textbox.

    criei as variáveis para cada textbox, fiz a conversão para decimal e por último fiz a equação.

    O erro acontece em todos os textboxes changed. 

    Obrigado pela atenção.


    sexta-feira, 17 de maio de 2019 03:33

Respostas

  • Que ótimo! Só tenha cuidado ao usar o TryParse pois se ele falhar, as variáveis valortitulo, valorpagoavista, acrescimos e descontos terão valor = 0!

    Esse método testa a conversão e, se for possível, retorna True e coloca o resultado na variável do out. Se não for, irá retornar false e a variável do out permanecerá com seu valor anterior!

    Fique atento e boa sorte!

    Att, Wallace


    “First do it, then do it right, then do it better.”

    sábado, 18 de maio de 2019 12:30
  • wallace boa noite,

    Depois de fazer algumas consultas, descobri o problema e já resolvi.

    Segue o código:

     private void valor_TituloTextBox_TextChanged(object sender, EventArgs e)
            {
                decimal valortitulo = 0;
                decimal valorpagoavista = 0;
                decimal acrescimos = 0;
                decimal descontos = 0;
                decimal saldo = 0;
    
                Decimal.TryParse(valor_TituloTextBox.Text, out valortitulo);
                Decimal.TryParse(valor_Pago_a_VistaTextBox.Text, out valorpagoavista);
                Decimal.TryParse(acrescimosTextBox.Text, out acrescimos);
                Decimal.TryParse(descontosTextBox.Text, out descontos);
                saldo = ((valortitulo + acrescimos) - (valorpagoavista + descontos));
                saldoTextBox.Text = saldo.ToString();
            }
    
            private void descontosTextBox_TextChanged(object sender, EventArgs e)
            {
                decimal valortitulo = 0;
                decimal valorpagoavista = 0;
                decimal acrescimos = 0;
                decimal descontos = 0;
                decimal saldo = 0;
                Decimal.TryParse(valor_TituloTextBox.Text,out valortitulo);
                Decimal.TryParse(valor_Pago_a_VistaTextBox.Text, out valorpagoavista);
                Decimal.TryParse(acrescimosTextBox.Text, out acrescimos);
                Decimal.TryParse(descontosTextBox.Text, out descontos);
                saldo = ((valortitulo + acrescimos) - (valorpagoavista + descontos));
                saldoTextBox.Text = saldo.ToString();
            }
    
            private void valor_Pago_a_VistaTextBox_TextChanged(object sender, EventArgs e)
            {
                decimal valortitulo = 0;
                decimal valorpagoavista = 0;
                decimal acrescimos = 0;
                decimal descontos = 0;
                decimal saldo = 0;
                Decimal.TryParse(valor_TituloTextBox.Text, out valortitulo);
                Decimal.TryParse(valor_Pago_a_VistaTextBox.Text, out valorpagoavista);
                Decimal.TryParse(acrescimosTextBox.Text, out acrescimos);
                Decimal.TryParse(descontosTextBox.Text, out descontos);
                saldo = ((valortitulo + acrescimos) - (valorpagoavista + descontos));
                saldoTextBox.Text = saldo.ToString();
            }
    
            private void acrescimosTextBox_TextChanged(object sender, EventArgs e)
            {
                decimal valortitulo = 0;
                decimal valorpagoavista = 0;
                decimal acrescimos = 0;
                decimal descontos = 0;
                decimal saldo = 0;
                Decimal.TryParse(valor_TituloTextBox.Text, out valortitulo);
                Decimal.TryParse(valor_Pago_a_VistaTextBox.Text, out valorpagoavista);
                Decimal.TryParse(acrescimosTextBox.Text, out acrescimos);
                Decimal.TryParse(descontosTextBox.Text, out descontos);
                saldo = ((valortitulo + acrescimos) - (valorpagoavista + descontos));
                saldoTextBox.Text = saldo.ToString();
            }

    Pode testar que está tudo Ok. Serve de referência para pesquisas posteriores.

    Muito Obrigado.

    sexta-feira, 17 de maio de 2019 22:06

Todas as Respostas

  • Olá, F.oliveirarocha!

    Se a exceção é disparada logo no form_load, teria como postar o código dele aqui? Ao que parece, pode ser que a valor_TituloTextBox esteja preenchida com algum caractere não aceito quando seu form é carregado!


    “First do it, then do it right, then do it better.”

    sexta-feira, 17 de maio de 2019 16:11
  • Wallace, segue o código do Form_Load, porém acho que não é isso. 

    Deve ser as questões de fazer o Parse, TryParse e etc. que não domino muito bem.

    Não entendo porque destas mensagens, pois os campos estão em decimal na tabela, conferido um a um.

    Converti os textboxes para decimal, com as variáveis em decimal. Portanto é erro de código, tendo que colocar o Parse. 

    Coloquei o comentário nas linhas que estavam dando erro, para me permitir abrir o forumulário. 

    Segue o código.

        private void CadastroTitulosaPagar_Load(object sender, EventArgs e)
            {     
        //      Colocar Foco no Form_Load
                Cod_FornecedorTextbox.Focus();
       //       Desabilitar os botões no Form_Load
                btn_salvar.Enabled = false;
                btn_atualizar.Enabled = false;
                btn_deletar.Enabled = false;
                btn_AdicionarParcela.Enabled = false;
                btn_atualizarParcela.Enabled = false;
                btn_InserirParcela.Enabled = false;
                btn_fechar.Enabled = true;
    
       //       Desabilitar campos - Textboxes - do Título
                cod_Entr_Tit_a_Pagartextbox.Enabled = false;
                Cod_FornecedorTextbox.Enabled = false;
                textBox_Fornecedor.Enabled = false;
                TextBox_Cod_CentroCustos.Enabled = false;
                TexBoxNome_CentroCustos.Enabled = false;
                cod_Status_TituloTextBox.Enabled = false;
                Status_Titulo_Textbox.Enabled = false;
                cod_DespesaTextBox.Enabled = false;
                descricao_Despesa_textBox.Enabled = false;
                Numero_Titulo.Enabled = false;
                DataDocumentodateTimePicker1.Enabled = false;
                datavencimento.Enabled = false;
                DataDocumentodateTimePicker1.CustomFormat = null;
                datavencimento.CustomFormat = null;
                numero_ParcelasTextBox.Enabled = false;
                observacaoTextBox.Enabled = false;
                valor_TituloTextBox.Enabled = false;
                valor_Pago_a_VistaTextBox.Enabled = false;
                acrescimosTextBox.Enabled = false;            
                descontosTextBox.Enabled = false;
                saldoTextBox.Enabled = false;
                historico_TituloTextBox.Enabled = false;
                data_logintxtbox.Enabled = false;
                login_NameTextBox.Enabled = false;
          //    Desabilitar campos - Textboxes - da Parcela
                cod_Entrada_Titulos_a_PagarTextBox2.Enabled = false;
                numero_ParcelaTextBox1.Enabled = false;
                dateTimePickerParcela.Enabled = false;
                dateTimePickerParcela.CustomFormat = null;
                valor_ParcelaTextBox1.Enabled = false;
                cod_Status_TituloTextBox2.Enabled = false;
                historicoTextBox1.Enabled = false;
    
                // TODO: This line of code loads data into the 'entradaTitulosaPagarDGV.Entrada_Titulos_a_Pagar' table. You can move, or remove it, as needed.
                this.entrada_Titulos_a_PagarTableAdapter.Fill(this.entradaTitulosaPagarDGV.Entrada_Titulos_a_Pagar);
                this.numero_Parcelas_a_PagarBindingSource.DataSource = DataContextFactory.DataContext.Numero_Parcelas_a_Pagars;
                ExibirDadosTitulo();
                ExibirDadosParcela();
                string constr = @"Data Source=DESKTOP-3O98051;Initial Catalog=SGFRenaissance;Integrated Security=True";
                using (SqlConnection conn = new SqlConnection(constr))
                {
                    SqlDataAdapter sda = new SqlDataAdapter("Select * From Entrada_Titulos_a_Pagar", conn);
                    DataSet Ds = new DataSet();
                    sda.Fill(Ds, "T1");
                    DataGridViewTitulo.DataSource = Ds.Tables["T1"];
                }
                // Bind the "SelectionChanged" here
                DataGridViewTitulo.SelectionChanged += DataGridViewTitulo_SelectionChanged;
                GetDetails();
                
            }
    
    // Carregando a tabela Detalhe (Pai x Filho) 
     void GetDetails()
            {
                string constr = @"Data Source=DESKTOP-3O98051;Initial Catalog=SGFRenaissance;Integrated Security=True";
                int currentId;
                int index = DataGridViewTitulo.CurrentCell.RowIndex;
                currentId = Convert.ToInt32(DataGridViewTitulo.Rows[index].Cells["Cod_Id"].Value);
                using (SqlConnection conn = new SqlConnection(constr))
                {
                    var select = "Select * From Numero_Parcelas_a_Pagar Where Cod_Entrada_Titulos_a_Pagar=" + currentId;
                    SqlDataAdapter sda = new SqlDataAdapter(select, conn);
                    DataSet Ds = new DataSet();
                    sda.Fill(Ds, "T2");
                    DataGridViewParcela.DataSource = Ds.Tables["T2"];
                }
            }
    
      private void ExibirDadosTitulo()
            {
                try
                {
                    conn.Open();
                    DataTable Dt = new DataTable();
                    adapt = new SqlDataAdapter("Select * from Entrada_Titulos_a_Pagar", conn);
                    adapt.Fill(Dt);
                    DataGridViewTitulo.DataSource = Dt;
                    DataGridViewTitulo.DataSource = entradaTitulosaPagarBindingSource;
                }
                catch (Exception Ex)
                {
                    MessageBox.Show("Erro! " + Ex.Message);
                }
                finally
                {
                    conn.Close();
                }
            }
    
            private void ExibirDadosParcela()
            {
                try
                {
                    conn.Open();
                    DataTable Dt = new DataTable();
                    adapt = new SqlDataAdapter("Select * from Numero_Parcelas_a_Pagar", conn);
                    adapt.Fill(Dt);
                    DataGridViewParcela.DataSource = Dt;
                    DataGridViewParcela.DataSource = numero_Parcelas_a_PagarBindingSource;
                }
                catch (Exception Ex)
                {
                    MessageBox.Show("Erro! " + Ex.Message);
                }
                finally
                {
                    conn.Close();
                }
            }
    

    Será que é a configuração no DataGridView? possuo dois DataGridView, que passam os valores para os Textboxes. Será que tenho que tratá-los para enviar aos textboxes? isto é fazer a conversão?

    Uma dúvida, os dados são carregados da tabela que vem do Banco, em decimal. Logo, o form recebe no formato decimal, será que deve ter que receber em string? que é o tal do Parse?

    Me explica isso Wallace por favor. 

    Grande abraço e obrigado pela atenção.

    sexta-feira, 17 de maio de 2019 20:23
  • wallace boa noite,

    Depois de fazer algumas consultas, descobri o problema e já resolvi.

    Segue o código:

     private void valor_TituloTextBox_TextChanged(object sender, EventArgs e)
            {
                decimal valortitulo = 0;
                decimal valorpagoavista = 0;
                decimal acrescimos = 0;
                decimal descontos = 0;
                decimal saldo = 0;
    
                Decimal.TryParse(valor_TituloTextBox.Text, out valortitulo);
                Decimal.TryParse(valor_Pago_a_VistaTextBox.Text, out valorpagoavista);
                Decimal.TryParse(acrescimosTextBox.Text, out acrescimos);
                Decimal.TryParse(descontosTextBox.Text, out descontos);
                saldo = ((valortitulo + acrescimos) - (valorpagoavista + descontos));
                saldoTextBox.Text = saldo.ToString();
            }
    
            private void descontosTextBox_TextChanged(object sender, EventArgs e)
            {
                decimal valortitulo = 0;
                decimal valorpagoavista = 0;
                decimal acrescimos = 0;
                decimal descontos = 0;
                decimal saldo = 0;
                Decimal.TryParse(valor_TituloTextBox.Text,out valortitulo);
                Decimal.TryParse(valor_Pago_a_VistaTextBox.Text, out valorpagoavista);
                Decimal.TryParse(acrescimosTextBox.Text, out acrescimos);
                Decimal.TryParse(descontosTextBox.Text, out descontos);
                saldo = ((valortitulo + acrescimos) - (valorpagoavista + descontos));
                saldoTextBox.Text = saldo.ToString();
            }
    
            private void valor_Pago_a_VistaTextBox_TextChanged(object sender, EventArgs e)
            {
                decimal valortitulo = 0;
                decimal valorpagoavista = 0;
                decimal acrescimos = 0;
                decimal descontos = 0;
                decimal saldo = 0;
                Decimal.TryParse(valor_TituloTextBox.Text, out valortitulo);
                Decimal.TryParse(valor_Pago_a_VistaTextBox.Text, out valorpagoavista);
                Decimal.TryParse(acrescimosTextBox.Text, out acrescimos);
                Decimal.TryParse(descontosTextBox.Text, out descontos);
                saldo = ((valortitulo + acrescimos) - (valorpagoavista + descontos));
                saldoTextBox.Text = saldo.ToString();
            }
    
            private void acrescimosTextBox_TextChanged(object sender, EventArgs e)
            {
                decimal valortitulo = 0;
                decimal valorpagoavista = 0;
                decimal acrescimos = 0;
                decimal descontos = 0;
                decimal saldo = 0;
                Decimal.TryParse(valor_TituloTextBox.Text, out valortitulo);
                Decimal.TryParse(valor_Pago_a_VistaTextBox.Text, out valorpagoavista);
                Decimal.TryParse(acrescimosTextBox.Text, out acrescimos);
                Decimal.TryParse(descontosTextBox.Text, out descontos);
                saldo = ((valortitulo + acrescimos) - (valorpagoavista + descontos));
                saldoTextBox.Text = saldo.ToString();
            }

    Pode testar que está tudo Ok. Serve de referência para pesquisas posteriores.

    Muito Obrigado.

    sexta-feira, 17 de maio de 2019 22:06
  • Que ótimo! Só tenha cuidado ao usar o TryParse pois se ele falhar, as variáveis valortitulo, valorpagoavista, acrescimos e descontos terão valor = 0!

    Esse método testa a conversão e, se for possível, retorna True e coloca o resultado na variável do out. Se não for, irá retornar false e a variável do out permanecerá com seu valor anterior!

    Fique atento e boa sorte!

    Att, Wallace


    “First do it, then do it right, then do it better.”

    sábado, 18 de maio de 2019 12:30
  • Wallace, OK entendi.

    Porém como está tudo em decimal, no banco também, acho que não terei problemas.

    Somente se o compilador falhar.

    Está tudo funcionando. Grande abraço e obrigado.

    domingo, 19 de maio de 2019 14:58