Solucionado (ver solução)
Solucionado
(ver solução)
23
respostas

Aparaceu cadastro de contas vazio

quando Clico em Adicionar Conta , aparece um formulario vazio sem botao e sem nada.

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using JhonescaixaEletronico.Contas;
using JhonescaixaEletronico.Usuarios;
using JhonescaixaEletronico.Operacao;



namespace JhonescaixaEletronico
{
    public partial class Form1 : Form

    {
        private Conta[] contas;
        private int quantidadeDeContas;
        private Conta conta;
        private Conta conta3;
        private Cliente cliente;
        private contaPoupanca conta2;
        private TotalizadorDeContas total;
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {

            this.conta = new ContaCorrente();
            Cliente primeiroCliente = new Cliente("Vitor");
            this.conta.cliente = primeiroCliente;
            this.conta.Deposita(250);
            this.conta.numeroConta = 1;

            // MostrarConta();

            this.conta3 = new ContaCorrente();
            Cliente terceiroCliente = new Cliente("Jhones");
            this.conta3.cliente = terceiroCliente;
            this.conta3.Deposita(850);
            this.conta3.numeroConta = 1;

            this.contas = new Conta[20];
            this.contas[0] = new ContaCorrente();
            this.contas[1] = conta3;

            //foreach(Conta conta in contas )
            //{
            //    comboContas.Items.Add(conta.cliente.nomeTitular);
            //    comboBox1.Items.Add(conta.cliente.nomeTitular);
            //}


        }

        private void textoTitular_TextChanged(object sender, EventArgs e)
        {

        }

        private void textBox1_TextChanged(object sender, EventArgs e)
        {

        }

        private void txtbut_Click(object sender, EventArgs e)
        {
            Conta contaSelecionada = this.BuscaContaSelecionada();
            string textoValorDep = textoValor.Text;
            double valorDeposito = Convert.ToDouble(textoValorDep);
            contaSelecionada.Deposita(valorDeposito);

            this.MostrarConta(contaSelecionada);
        }

        private void MostrarConta(Conta conta)
        {
            Conta contaSelecionada = this.BuscaContaSelecionada();

            textoNumero.Text = Convert.ToString(contaSelecionada.numeroConta);
            textoSaldo.Text = Convert.ToString(contaSelecionada.saldoConta);
            //textoTitular.Text = this.conta.cliente.nomeTitular;

        }

        private void button1_Click(object sender, EventArgs e)
        {
            Conta contaSelecionada = this.BuscaContaSelecionada();

            string textoValorSaq = textoValor.Text;
            double valorSaque = Convert.ToDouble(textoValorSaq);
            try
            {
                contaSelecionada.Saca(valorSaque);
                MessageBox.Show("Saque efetuado");
            }
            catch(SaldoInsuficienteException exception)
            {
                MessageBox.Show("Saldo insulficiente");
            }
            catch(System.ArgumentException exception)
            {
                MessageBox.Show("Valor informado nao permitido");
            }

            this.MostrarConta(contaSelecionada);
        }

        private void button2_Click(object sender, EventArgs e)
        {
            //Cliente jhones = new Cliente("Jhones");
            //jhones.rg = "41.497.732-4";
            //Cliente jhones2 = new Cliente("Jhones");
            //jhones2.rg = "41.497.732-4";

            //jhones.Equals(jhones2);
            //MessageBox.Show("Sao iguais: " + jhones.Equals(jhones2));

            contaPoupanca conta2 = new contaPoupanca();
            Cliente segundoCliente = new Cliente("Jhones");
            conta2.Deposita(1000);

            TotalizadorDeContas adicionar = new TotalizadorDeContas();
            adicionar.Adiciona(conta2);
            adicionar.Adiciona(conta);
            adicionar.Adiciona(conta3);
            MessageBox.Show("o Saldo eh :" + adicionar.ValorTotal);
            MessageBox.Show("O Total de Contas eh: " + ContaCorrente.totalDeContas);

        }


        private void comboContas_SelectedIndexChanged(object sender, EventArgs e)
        {

            Conta contaSelecionada = this.BuscaContaSelecionada();

            this.MostrarConta(contaSelecionada);

        }

        private Conta BuscaContaSelecionada()
        {
            int indice = comboContas.SelectedIndex;
            return this.contas[indice];
        }

        private void ButTrans_Click_1(object sender, EventArgs e)
        {
            Conta contaSelecionada = this.BuscaContaSelecionada();
            int indice = comboBox1.SelectedIndex;
            Conta contaTrans = contas[indice];
            string textoValorTrans = textoValor.Text;
            double Valor = Convert.ToDouble(textoValorTrans);
            contaSelecionada.Transferencia(Valor, contaTrans);

            this.MostrarConta(contaSelecionada);
            textoValor.Text = "";
        }

        private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
        {
            Conta contaSelecionada = this.BuscaContaSelecionada();
        }

        public void AdicionandoConta(Conta conta)
        {
            this.contas[this.quantidadeDeContas] = conta;
            this.quantidadeDeContas++;
            comboContas.Items.Add(conta);
        }

        private void ButAdiconando_Click(object sender, EventArgs e)
        {
            CadastroDeContas cadastro = new CadastroDeContas(this);
            cadastro.ShowDialog();
        }
    }
}
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using JhonescaixaEletronico.Contas;
using JhonescaixaEletronico.Usuarios;

namespace JhonescaixaEletronico
{
    public partial class CadastroDeContas : Form
    {
        public CadastroDeContas()
        {
            InitializeComponent();
        }
        private Form1 aplicacaoPrincipal;

        public CadastroDeContas(Form1 aplicacaoPrincipal)
        {
            this.aplicacaoPrincipal = aplicacaoPrincipal;
        }
        private void button1_Click(object sender, EventArgs e)
        {
            Conta novaConta = new ContaCorrente();
            Cliente novoCliente = new Cliente(textNome.Text);
            novaConta.cliente = novoCliente;
            novaConta.numeroConta = Convert.ToInt32(textNumero);
            this.aplicacaoPrincipal.AdicionandoConta(novaConta);
        }
    }
}
23 respostas

Olá Jhones,

o problema é que o InitializeComponent() não está sendo chamado. No Form1, quando você faz new CadastroDeContas(this) está chamando o construtor que recebe o Form1 como parâmetro:

public CadastroDeContas(Form1 aplicacaoPrincipal)
{
            this.aplicacaoPrincipal = aplicacaoPrincipal;
}

Só que este construtor não chama o InitializeComponent que faz com que a tela seja construída. Por isso os campos e o botão não apareceram.

Como resolvo isso?

Só chamar o método InitializeComponent() no seu construtor que recebe o Form1. Por enquanto, o único construtor que chama este método é o que não tem argumentos que nunca é invocado:

 public CadastroDeContas()
{
            InitializeComponent();
}

estou com outro problema , quando adiciono o cliente no campo nome la na aplicacao aparece JhonescaixaEletronico.Contas.ContaCorrente e nao o nome que escrevi.

O problema é que quando você adiciona a conta no combo de contas

public void AdicionandoConta(Conta conta)
{
        this.contas[this.quantidadeDeContas] = conta;
        this.quantidadeDeContas++;
        comboContas.Items.Add(conta);
}

o combo box usa o retorno do ToString para definir o que ele vai mostrar no seletor da tela. Ou seja, provavelmente você não sobrescreveu o ToString na classe Conta e ele está herdando o comportamento default do ToString de Object que mostra o namespace do objeto. Por isso aparece no combo box o JhonescaixaEletronico.Contas.ContaCorrente.

Para que ele mostre o nome do titular, você precisa sobrescrever na classe Conta o método ToString para que ele retorne o nome do seu titular. Será parecido com o que foi feito na aula de Object com a classe Cliente.

Mais como chamo ela? Convert? ou ToString?

 public override string ToString(Object obj)
  {

  }

tentei assim nao deu certo

Então a assinatura do método está quase toda correta, só falta a lógica dentro deste método que por enquanto não tem nada dentro e tirar o parâmetro object que não faz parte do ToString. No caso você precisa retornar o nome do Titular da conta.

No exemplo da aula olha como ficou para retornar o nome e o rg do cliente:

class Cliente
{
    public string Rg { get; set; }
    public string Nome { get; set; }

    public override string ToString() //não recebe nada como parâmetro
    {
        return "Nome: " + this.Nome + " RG: " + this.Rg;
    }
}

Voce precisa fazer algo parecido para a Conta agora

Agora aprentou esse erro na linha abaixo

An unhandled exception of type 'System.OutOfMemoryException' occurred in System.Windows.Forms.dll

Additional information: Número excessivo de itens na caixa de combinação.

comboContas.Items.Add(conta);

Estranho, parece que ele entrou em um loop infinito para adicionar o elemento no combo box. Me manda o código das classes Conta, CadastroDeContas e Form1 atual para eu dar uma olhada.

Form1

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using JhonescaixaEletronico.Contas;
using JhonescaixaEletronico.Usuarios;
using JhonescaixaEletronico.Operacao;



namespace JhonescaixaEletronico
{
    public partial class Form1 : Form

    {
        private Conta[] contas;
        private int quantidadeDeContas;
        private Conta conta;
        private Conta conta3;
        private Cliente cliente;
        private contaPoupanca conta2;
        private TotalizadorDeContas total;
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {

            this.conta = new ContaCorrente();
            Cliente primeiroCliente = new Cliente("Vitor");
            this.conta.cliente = primeiroCliente;
            this.conta.Deposita(250);
            this.conta.numeroConta = 1;

            // MostrarConta();

            this.conta3 = new ContaCorrente();
            Cliente terceiroCliente = new Cliente("Jhones");
            this.conta3.cliente = terceiroCliente;
            this.conta3.Deposita(850);
            this.conta3.numeroConta = 1;

            this.contas = new Conta[10];
            this.contas[0] = new ContaCorrente();
            this.contas[1] = conta3;

            //foreach(Conta conta in contas )
            //{
            //    comboContas.Items.Add(conta.cliente.nomeTitular);
            //    comboBox1.Items.Add(conta.cliente.nomeTitular);
            //}


        }

        private void textoTitular_TextChanged(object sender, EventArgs e)
        {

        }

        private void textBox1_TextChanged(object sender, EventArgs e)
        {

        }

        private void txtbut_Click(object sender, EventArgs e)
        {
            Conta contaSelecionada = this.BuscaContaSelecionada();
            string textoValorDep = textoValor.Text;
            double valorDeposito = Convert.ToDouble(textoValorDep);
            contaSelecionada.Deposita(valorDeposito);

            this.MostrarConta(contaSelecionada);
        }

        private void MostrarConta(Conta conta)
        {
            Conta contaSelecionada = this.BuscaContaSelecionada();

            textoNumero.Text = Convert.ToString(contaSelecionada.numeroConta);
            textoSaldo.Text = Convert.ToString(contaSelecionada.saldoConta);
            //textoTitular.Text = this.conta.cliente.nomeTitular;

        }

        private void button1_Click(object sender, EventArgs e)
        {
            Conta contaSelecionada = this.BuscaContaSelecionada();

            string textoValorSaq = textoValor.Text;
            double valorSaque = Convert.ToDouble(textoValorSaq);
            try
            {
                contaSelecionada.Saca(valorSaque);
                MessageBox.Show("Saque efetuado");
            }
            catch(SaldoInsuficienteException exception)
            {
                MessageBox.Show("Saldo insulficiente");
            }
            catch(System.ArgumentException exception)
            {
                MessageBox.Show("Valor informado nao permitido");
            }

            this.MostrarConta(contaSelecionada);
        }

        private void button2_Click(object sender, EventArgs e)
        {
            //Cliente jhones = new Cliente("Jhones");
            //jhones.rg = "41.497.732-4";
            //Cliente jhones2 = new Cliente("Jhones");
            //jhones2.rg = "41.497.732-4";

            //jhones.Equals(jhones2);
            //MessageBox.Show("Sao iguais: " + jhones.Equals(jhones2));

            contaPoupanca conta2 = new contaPoupanca();
            Cliente segundoCliente = new Cliente("Jhones");
            conta2.Deposita(1000);

            TotalizadorDeContas adicionar = new TotalizadorDeContas();
            adicionar.Adiciona(conta2);
            adicionar.Adiciona(conta);
            adicionar.Adiciona(conta3);
            MessageBox.Show("o Saldo eh :" + adicionar.ValorTotal);
            MessageBox.Show("O Total de Contas eh: " + ContaCorrente.totalDeContas);

        }


        private void comboContas_SelectedIndexChanged(object sender, EventArgs e)
        {

            Conta contaSelecionada = this.BuscaContaSelecionada();

            this.MostrarConta(contaSelecionada);

        }

        private Conta BuscaContaSelecionada()
        {
            int indice = comboContas.SelectedIndex;
            return this.contas[indice];
        }

        private void ButTrans_Click_1(object sender, EventArgs e)
        {
            Conta contaSelecionada = this.BuscaContaSelecionada();
            int indice = comboBox1.SelectedIndex;
            Conta contaTrans = contas[indice];
            string textoValorTrans = textoValor.Text;
            double Valor = Convert.ToDouble(textoValorTrans);
            contaSelecionada.Transferencia(Valor, contaTrans);

            this.MostrarConta(contaSelecionada);
            textoValor.Text = "";
        }

        private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
        {
            Conta contaSelecionada = this.BuscaContaSelecionada();
        }

        public void AdicionandoConta(Conta conta)
        {
            this.contas[this.quantidadeDeContas] = conta;
            this.quantidadeDeContas++;
            comboContas.Items.Add(conta);
        }

        private void ButAdiconando_Click(object sender, EventArgs e)
        {
            CadastroDeContas  cadastro = new CadastroDeContas(this);
            cadastro.ShowDialog();
        }
    }
}

CadastroDeContas

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using JhonescaixaEletronico.Contas;
using JhonescaixaEletronico.Usuarios;

namespace JhonescaixaEletronico
{
    public partial class CadastroDeContas : Form
    {
        public CadastroDeContas()
        {
            InitializeComponent();
        }
        private Form1 aplicacaoPrincipal;

        public CadastroDeContas(Form1 aplicacaoPrincipal)
        {
            this.aplicacaoPrincipal = aplicacaoPrincipal;
            InitializeComponent();
        }
        private void button1_Click(object sender, EventArgs e)
        {
            Conta novaConta = new ContaCorrente();
            Cliente novoCliente = new Cliente(textNome.Text);
            novaConta.cliente = novoCliente;
            novaConta.numeroConta = Convert.ToInt32(textNumero.Text);
            this.aplicacaoPrincipal.AdicionandoConta(novaConta);
        }
    }
}

Conta

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using JhonescaixaEletronico.Usuarios;

namespace JhonescaixaEletronico.Contas
{
    public  abstract class Conta
    {
        public int numeroConta;
        public int agConta;
        public double saldoConta {  get; protected set; }
        public string titularConta;


        public Cliente cliente;
        public virtual void Deposita(double valor)
        {
            saldoConta += valor; 
        }

        public abstract void Saca(double valor);


        public void Transferencia(double valor, Conta recebedor)
        {
            this.Saca(valor);
            recebedor.Deposita(valor);
        }
        public override string ToString()
        {
            return titularConta;
        }
        //public bool PodeAbrirConta()
        //{

        //        var maiorDeIdade = this.idade >= 18;
        //        var emanicipado = this.documentos.contains("emanicipacao");
        //        var possuiCPF = !string.IsNullOrEmpty(this.cpf);
        //        return (maiorDeIdade || emanicipado) && possuiCPF;

        //}


    }
}

Olá Jhones,

Então o problema da Exception provavelmente é porque ele não consegue encontrar o nome do titular da conta. Repare que no CadastroDeContas, no comportamento do botão você inicializa a conta da seguinte forma:

private void button1_Click(object sender, EventArgs e)
{
        Conta novaConta = new ContaCorrente();
        Cliente novoCliente = new Cliente(textNome.Text);
        novaConta.cliente = novoCliente;
        novaConta.numeroConta = Convert.ToInt32(textNumero.Text);
        this.aplicacaoPrincipal.AdicionandoConta(novaConta);
}

Note que para ter o dono desta conta você criou um novoCliente, passando pelo o construtor o nome digitado no formulário. Depois, você atribuiu o novoCliente como o cliente da novaConta: novaConta.cliente = novoCliente. Até aqui está totalmente certo.

Ai você chamou o seu método AdicionandoConta, que vai tentar adicionar esta nova conta no combo box justamente naquela linha comboContas.Items.Add(conta). Como comentei antes, este método de Add usa o ToString da Conta para saber que nome ele vai usar para mostrar no seletor. Só que no Vamos olhar sua classe Conta como ela está:

public  abstract class Conta
{
    public int numeroConta;
    public int agConta;
    public double saldoConta {  get; protected set; }
    public string titularConta;
    public Cliente cliente;
    ....
    public override string ToString()
    {
        return titularConta;
    }

Note que no seu ToString você retorna a propriedade string titularConta. Só que este valor está null dado que ele não foi preenchido no botão do formulário de cadastro. Quem tem o nome do titular da conta agora é o Cliente cliente. Tente fazer o ToString retornar o nome que está dentro de cliente que ai o combo box deve funcionar.

Boa funcionou, muito obrigado.. porem agora estou com um problema que nao consegui resolver desde que montei, eu consigo adicionar, porem como eu exibo as contas cadastradas que ja tinha no meu programa pela linha de codigo?

Entao eu tenho um esse foreach porem qdo eu tiro o comentario dele da um erro na linha comboContas.Items.Add(conta.cliente.nomeTitular);

com o seguinte erro An unhandled exception of type 'System.NullReferenceException' occurred in caixaEletronico.exe

Additional information: Referência de objeto não definida para uma instância de um objeto.

foreach(Conta conta in contas )
            {
                comboContas.Items.Add(conta.cliente.nomeTitular);
                comboBox1.Items.Add(conta.cliente.nomeTitular);
            }

No caso você precisa no seu foreach chamar o método AdicionandoConta ao invés de tentar adicionar na mão. Além disso, note que na posição 0 do array de contas é colocado uma conta sem nenhuma informação this.contas[0] = new ContaCorrente(). Lembre que ele precisa de pelo menos o nome do cliente quando você for chamar o método AdicionandoConta por conta do ToString.

isso?

  foreach(Conta AdicionandoConta in contas)
            {
                comboContas.Items.Add(conta.cliente.nomeTitular);
                comboBox1.Items.Add(conta.cliente.nomeTitular);
            }

Queria resolver isso o mais rapido possivel para concluir o curso

Olá Jhones,

cuidado que neste for você não chamou o método AdicionandoConta, você deu o nome da variável de AdicionandoConta. A estrutura do foreach estava certinha, a ideia na verdade é apagar aquelas duas linhas e chamar o método AdicionandoConta que já faz esse trabalho de adicionar uma conta no combo box:

foreach(Conta conta in contas )
{
    //chamar o método AdicionandoConta aqui para adicionar a variável conta 
}

Note que este foreach está mesma classe classe onde foi declarado o seu método AdicionandoConta. Para tentar ver como chamar o método, uma dica é que vai ser a mesma ideia do método Transfere da classe Conta usando o Saca.

Nao to conseguindo entender.

seria isso?

 foreach(Conta conta in contas)
            {
                AdicionandoConta(this.conta);
                //comboBox1.Items.Add(conta.cliente.nomeTitular);
            }

Está quase certo, você fez o foreach que varre todas as contas e conseguiu fazer a chamada para o método AdicionandoConta, Agora só precisa apagar este this., porque no fundo você tem adicionar a conta que está iterando no seu foreach foreach(Conta conta in contas).

colocando so conta da um erro no metodo adicionar conta

erro: An unhandled exception of type 'System.ArgumentNullException' occurred in System.Windows.Forms.dll

Additional information: Valor não pode ser nulo.

public void AdicionandoConta(Conta conta)
        {
            this.contas[this.quantidadeDeContas] = conta;
            this.quantidadeDeContas++;
            comboContas.Items.Add(conta);
        }

na linha

            comboContas.Items.Add(conta);

coloquei o projeto no mega pra vc da uma olhada

https://mega.nz/#!LwgkETAZ!hfgUtiOLzXIQpRGYWqmy1RLxLr1LQyjNYl9k__8SsHQ

solução!

Note que o erro é de NullReferenceException, ou seja, o seu código está trabalhando com algum campo cujo o valor está null. Note que você cria o array de contas com 20 posições, mas preenche apenas 2 delas:

            this.contas = new Conta[20];
            this.contas[0] = conta;
            this.contas[1] = conta3;

Dessa forma, tem 18 posições que estão com valor null. Só que quando você executa o foreach, ele acaba passando por todas as 20 posições. Ou seja, ele adiciona as 2 primeira contas e na próxima posição ele acaba chamando o AdicionandoConta passando null. Você pode fazer um if dentro desse foreach que verifica se a conta está diferente de null para quando for chamar o AdicionandoConta.