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?