Importante

Você está vendo a versão anterior da nova experiência da Alura que estamos preparando para você. Em breve, ela ganha uma identidade visual novinha totalmente pensada em potencializar seus estudos!

10
respostas

4. Mão na Massa - Formulários

Meu codigo está executar sem nenhum erro, o problema é quando adiciono uma conta e vou ver no comboBox da Form1, no lugar do nome do Titular aparece "WindowsFormsApplication3.ContaCorrente" e se seleciono essa opção um erro "Exception thrown: 'System.NullReferenceException' in WindowsFormsApplication3.exe

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

Segue ContaCorrete.cs

public partial class CadastroDeConta : Form
    {
        private Form1 aplicacaoPrincipal;

        public CadastroDeConta(Form1 aplicacaoPrincipal)
        {
            this.aplicacaoPrincipal = aplicacaoPrincipal;
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            Conta novaConta = new ContaCorrente();
            novaConta.Titular = new Cliente();
            novaConta.Titular.Nome = titularConta.Text;
            novaConta.Numero = Convert.ToInt32(numeroDaConta.Text);
            this.aplicacaoPrincipal.AdicionaConta(novaConta);
        }
    }

Form1.cs

public partial class Form1 : Form
    {
        private Conta [] conta;

        public Form1()
        {
            InitializeComponent();
        }

        private void MostraConta(int indice)
        {
              textoTitular1.Text = conta[indice].Titular.Nome;
              textoNumero.Text = Convert.ToString(conta[indice].Numero);
              textoSaldo.Text = Convert.ToString(conta[indice].Saldo);

        }

        private void Form1_Load(object sender, EventArgs e)
        {
            this.conta = new Conta[10];
            this.conta[0] = new Conta();
            this.conta[0].Titular = new Cliente();
            this.conta[0].Titular.Nome = "Victor";
            this.conta[0].Numero = 123;
            this.conta[0].Deposita(200);

            this.conta[1] = new Conta();
            this.conta[1].Titular = new Cliente();
            this.conta[1].Titular.Nome = "João";
            this.conta[1].Numero = 456;
            this.conta[1].Deposita(1000);

            foreach (Conta contas in conta)
            {
                if (contas != null)
                {
                    comboContas.Items.Add(contas.Titular.Nome);
                    destinoDaTransferencia.Items.Add(contas.Titular.Nome);
                }
            }

            GerenciadorDeImposto gerenciador = new GerenciadorDeImposto();
            ContaPoupanca cp = new ContaPoupanca();
            SeguroDeVida sv = new SeguroDeVida();
            gerenciador.Adiciona(cp);
            gerenciador.Adiciona(sv);
            MessageBox.Show("Total: " + gerenciador.Total);
        }

        private void button1_Click(object sender, EventArgs e)
        {
            double valor = Convert.ToDouble(textoValor.Text);
            int indiceSelecionado = comboContas.SelectedIndex;
            this.conta[indiceSelecionado].Deposita(valor);
            this.MostraConta(indiceSelecionado);
        }

        private void button2_Click(object sender, EventArgs e)
        {
            double valor = Convert.ToDouble(textoValor.Text);
            int indiceSelecionado = comboContas.SelectedIndex;
            this.conta[indiceSelecionado].Saca(valor);
            this.MostraConta(indiceSelecionado);
        }

        private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
        {
            int indiceSelecionado = comboContas.SelectedIndex;

            this.MostraConta(indiceSelecionado);

        }

        private void Transferencia_Click(object sender, EventArgs e)
        {
            this.conta[comboContas.SelectedIndex].Saca(50);
            this.conta[destinoDaTransferencia.SelectedIndex].Deposita(50);
            this.MostraConta(comboContas.SelectedIndex);
        }

        private int quantidadeDeContas;

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

        private void button3_Click(object sender, EventArgs e)
        {
            CadastroDeConta formularioDeConta = new CadastroDeConta(this);
            formularioDeConta.ShowDialog();
        }
    }
10 respostas

Beleza Victor?

Seguinte, no método AdicionaConta, essa linha:

comboContas.Items.Add(contas);

Tem que estar assim:

comboContas.Items.Add(contas.Titular.Nome);

Você pode passar qualquer coisa para esse método Add que ele se vira para mostrar um texto. Do jeito que você está fazendo, ele vai chamar o método ToString da classe Conta, e por padrão esse método mostra o nome completo da classe(name+namespace=WindowsFormsApplication3.ContaCorrente). Ao adicionar contas.Titular.Nome o que você adiciona no combo é a string que representa o nome do titular da conta mesmo.

Com relação ao erro, provavelmente o seu método que cria a conta e passa ela como parâmetro para o método AdicionaConta não está criando o Titular. Sempre que você cria uma conta, tem que fazer:

novaConta.Titular = new Cliente();

Veja se te ajudo :)

Bom dia!

O problema do combobox foi resolvido, mais o erro ainda não consegui achar

CadastroDeContas.cs

public partial class CadastroDeConta : Form
    {
        private Form1 aplicacaoPrincipal;

        public CadastroDeConta(Form1 aplicacaoPrincipal)
        {
            this.aplicacaoPrincipal = aplicacaoPrincipal;
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            Conta novaConta = new ContaCorrente();
            novaConta.Titular = new Cliente();
            novaConta.Titular.Nome = titularConta.Text;
            novaConta.Numero = Convert.ToInt32(numeroDaConta.Text);
            this.aplicacaoPrincipal.AdicionaConta(novaConta);
        }
    }

Como você pode ver eu crio o novaConta.Titular = new Cliente();

Manda pra gente um print do erro, Victor.

Segue a print

https://i.imgur.com/cqv2lGD.png

O erro acontece depois que você seleciona qualquer uma das contas do combo ou apenas alguma em específico?

Apenas a conta que acabei de adicionar.

Manda o código do Form1_Load.

Pode ser que o índice 2 não exista ou o Titular esteja nulo.

Não tinha visto o código do form load no inicio do post, mb... :(

Então Victor. No indice 2 não existe nenhuma conta instanciada. Esse é o problema.

Então, não estou achando onde no código está o erro.

Na imagem que você passou o índice é 2 só que não existe nenhum objeto associado a essa posição do array.

Entendeu?