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

C#II - CadastroDeContas

Quando eu adiciono uma nova conta o nome do Titular não aparece no combobox mas sim "CaixaEletronico11.ContaCorrente", ou o tipo de conta que foi criada.

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;

namespace CaixaEletronico11
{
    public partial class Form1 : Form
    {
        Conta[] contas;
        private int quantidadeDeContas;

        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            contas = new Conta[20];

            Conta contaDoVitor = new ContaCorrente();
            contaDoVitor.Titular = new Cliente();
            contaDoVitor.Agencia = 123;
            contaDoVitor.Numero = 111;
            contaDoVitor.Deposita(1000);
            contaDoVitor.Titular.Nome = "Victor";
            contas[0] = contaDoVitor;

            Conta contaDoMarcos = new ContaPoupanca();
            contaDoMarcos.Titular = new Cliente();
            contaDoMarcos.Agencia = 124;
            contaDoMarcos.Numero = 121;
            contaDoMarcos.Deposita(1000);
            contaDoMarcos.Titular.Nome = "Marcos";
            contas[1] = contaDoMarcos;

            this.quantidadeDeContas = 2;

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

        private void comboContas_SelectedIndexChanged(object sender, EventArgs e)
        {
            string titularSelecionado = comboContas.Text;
            Conta contaSelecionada = this.BuscaContaSelecionada();

            this.MostraConta(contaSelecionada);
        }

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

        private void MostraConta(Conta conta)
        {
            textTitular.Text = conta.Titular.Nome;
            textAgencia.Text = Convert.ToString(conta.Agencia);
            textNumero.Text = Convert.ToString(conta.Numero);
            textSaldo.Text = Convert.ToString(conta.Saldo);
            textValor.Text = " ";
        }

        private void btnDeposito_Click(object sender, EventArgs e)
        {
            double valor = Convert.ToDouble(textValor.Text);
            int indiceSelecionado = comboContas.SelectedIndex;

            Conta contaSelecionada = this.contas[indiceSelecionado];
            contaSelecionada.Deposita(valor);

            MostraConta(contaSelecionada);
        }

        private void btnSaque_Click(object sender, EventArgs e)
        {
            string textoValorSaque = textValor.Text;

            double valorSaque = Convert.ToDouble(textoValorSaque);
            Conta contaSelecionada = this.BuscaContaSelecionada();

            try
            {
                contaSelecionada.Saca(valorSaque);
                MessageBox.Show("Dinheiro Liberado");
            }
            catch (SaldoInsuficienteException a)
            {
                MessageBox.Show("Saldo insuficiente. " + a.Message);
            }
            catch (ArgumentException a)
            {
                MessageBox.Show("Não é possível sacar um valor negativo. " + a.Message);
            }

            this.MostraConta(contaSelecionada);
        }

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

            int indiceDaContaDestino = comboDestinoTransf.SelectedIndex;

            Conta contaDestino = this.contas[indiceDaContaDestino];

            string textoValor = textValor.Text;
            double valorTransferencia = Convert.ToDouble(textoValor);

            contaSelecionada.Transferencia(contaDestino, valorTransferencia);

            this.MostraConta(contaSelecionada);
        }

        public void AdicionarConta(Conta conta)
        {
            if(this.quantidadeDeContas == this.contas.Length)
            {
                Conta[] novo = new Conta[this.contas.Length * 2];
                for (int i = 0; i < this.quantidadeDeContas; i++)
                {
                    novo[i] = this.contas[i];
                }
                this.contas = novo;
            }

            this.contas[this.quantidadeDeContas] = conta;
            this.quantidadeDeContas++;

            comboContas.Items.Add(conta);
        }

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

        private void btnRemoveConta_Click(object sender, EventArgs e)
        {
            Conta conta = BuscaContaSelecionada();
            this.RemoveConta(conta);
        }

        private void RemoveConta(Conta conta)
        {
            comboContas.Items.Remove(conta);

            int i;

            for(i=0; i < this.quantidadeDeContas; i++)
            {
                if(this.contas[i] == conta)
                {
                    break;
                }
                while(i + 1 < this.quantidadeDeContas)
                {
                    this.contas[i] = this.contas[i + 1];
                    i++;
                }
            }

            textNumero.Text = " ";
            textAgencia.Text = " ";
            textSaldo.Text = " ";
            textTitular.Text = " ";
            textSaldo.Text = " ";
        }
    }
}

CadastroDeContascs

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;

namespace CaixaEletronico11
{
    public partial class CadastroDeContascs : Form
    {
        private Form1 aplicacaoPrincipal;
        public CadastroDeContascs(Form1 aplicacaoPrincipal)
        {
            this.aplicacaoPrincipal = aplicacaoPrincipal;
            InitializeComponent();
        }

        private void btnCadastrar_Click(object sender, EventArgs e)
        {
            Conta c;

            if(comboCadastro.Text.Equals("Conta Corrente"))
            {
                c = new ContaCorrente();
            }
            else if(comboCadastro.Text.Equals("Conta Poupança"))
            {
                c = new ContaPoupanca();
            }
            else
            {
                c = new ContaInvestimento();
            }

            string titular = textTitularCad.Text;
            int agencia = Convert.ToInt32(textAgenciaCad.Text);

            c.Agencia = agencia;
            c.Numero = Convert.ToInt32(textNumeroCad.Text);
            c.Titular = new Cliente();
            c.Titular.Nome = titular;

            this.aplicacaoPrincipal.AdicionarConta(c);
        }

        private void comboCadastro_SelectedIndexChanged(object sender, EventArgs e)
        {

        }

        private void CadastroDeContascs_Load(object sender, EventArgs e)
        {
            this.comboCadastro.Items.Add("Conta Corrente");
            this.comboCadastro.Items.Add("Conta Poupança");
            this.comboCadastro.Items.Add("Conta Investimento");
        }
    }
}
3 respostas

Não sei se entendi direito, mas neste seu techo do código:

private void MostraConta(Conta conta)
 {
        textTitular.Text = conta.Titular.Nome;
        textAgencia.Text = Convert.ToString(conta.Agencia);
        textNumero.Text = Convert.ToString(conta.Numero);
        textSaldo.Text = Convert.ToString(conta.Saldo);
        textValor.Text = " ";
}

O conta.Titular.Nome não deveria estar dentro do método Convert.ToString() assim como todos os outros?

Teste isso e diga se funcionou. Seu método MostraConta ficaria assim:

private void MostraConta(Conta conta)
 {
        textTitular.Text = Convert.ToString(conta.Titular.Nome);
        textAgencia.Text = Convert.ToString(conta.Agencia);
        textNumero.Text = Convert.ToString(conta.Numero);
        textSaldo.Text = Convert.ToString(conta.Saldo);
        textValor.Text = " ";
}
solução!

Washington,

Pelo que percebi o seu método AdicionarConta está adicionando no combo a referência da conta. O que acontece, quando você passa um objeto para o combo ele usa o método ToString desse objeto. No seu caso ele fica como você informou na pergunta "CaixaEletronico11.ContaCorrente". O que você pode fazer para corrigir isso.

Primeira opção é adicionar o nome do titular ali no combo, conforme método abaixo

public void AdicionarConta(Conta conta)
        {
            if(this.quantidadeDeContas == this.contas.Length)
            {
                Conta[] novo = new Conta[this.contas.Length * 2];
                for (int i = 0; i < this.quantidadeDeContas; i++)
                {
                    novo[i] = this.contas[i];
                }
                this.contas = novo;
            }

            this.contas[this.quantidadeDeContas] = conta;
            this.quantidadeDeContas++;


            comboContas.Items.Add(conta.Titular.Nome); // Altera Aqui
        }

Outra opção é sobrescrever o método ToString da sua classe Conta, que ficaria mais ou menos assim:

public override string ToString()
{
    return Titular.Nome;
}

Nesse case não seria necessário pegar o nome do titular para adicionar no combo, poderia jogar diretamente a classe conta.

Espero que isso te ajude, Abraço.

Subscrevi o método ToString e funcionou. Obrigado