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

Erro no combobox após adicionar nova conta System.IndexOutOfRangeException

Meu combobox é iniciado corretamente, podendo ser trocado para qualquer um dos itens que não ocorre problema, mas após adicionar uma nova conta como requisitado no capítulo 4, ao trocar o item do combobox para um dos novos, ocorre o erro indicado.

     private Conta BuscaContaSelecionada()
        {
            int indiceSelecionado = comboContas.SelectedIndex;
            return this.contas[indiceSelecionado]; //-- Erro indicado nessa linha
        }
5 respostas

Oi Samir,

Este trecho de código comboContas.SelectedIndex está retornando um índice que seu array contas não possui. Coloque o código todo para vermos se tem algum problema no método que adiciona a nova conta?

Abraço!

Entendi qual o erro, só não entendi porque ele ocorre após a o cadastro de novas contas apenas, irei postar o código completo

form1.cs

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 CaixaEletronico
{
    public partial class Form1 : Form
    {
        private Conta[] contas;
        private int quantidadeDeContas;

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

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

            Conta contaDoVictor = new ContaCorrente();
            contaDoVictor.Titular = new Cliente();
            contaDoVictor.Titular.Nome = "Victor";
            contaDoVictor.Nome = contaDoVictor.Titular.Nome;
            contaDoVictor.Numero = 1;
            contas[0] = contaDoVictor;

            Conta contaDoGuilherme = new ContaPoupanca();
            contaDoGuilherme.Titular = new Cliente();
            contaDoGuilherme.Titular.Nome = "Guilherme";
            contaDoGuilherme.Nome = contaDoGuilherme.Titular.Nome;
            contaDoGuilherme.Numero = 2;
            contas[1] = contaDoGuilherme;

            Conta contaDoMauricio = new ContaInvestimento();
            contaDoMauricio.Titular = new Cliente();
            contaDoMauricio.Titular.Nome = "Mauricio";
            contaDoMauricio.Nome = contaDoMauricio.Titular.Nome;
            contaDoMauricio.Numero = 3;
            contas[2] = contaDoMauricio;

            foreach (Conta conta in this.contas)
            {
                comboContas.Items.Add(conta);
                destinoDaTransferencia.Items.Add(conta);
            }

            comboContas.DisplayMember = "Nome";
        }

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

            double valorDeposito = Convert.ToDouble(textoValorSaque);

            int indiceSelecionado = comboContas.SelectedIndex;

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

            this.MostraConta(contaSelecionada);
        }

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

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

            this.MostraConta(contaSelecionada);
        }

        private void MostraConta(Conta conta)
        {
            //textoTitular.Text = conta.Titular.Nome;
            textoTitular.Text = conta.Nome;
            textoSaldo.Text = Convert.ToString(conta.Saldo);
            textoNumero.Text = Convert.ToString(conta.Numero);
        }

        private Conta BuscaContaSelecionada()
        {
            //int indiceSelecionado = comboContas.SelectedIndex;
            int indiceSelecionado = comboContas.SelectedIndex;

            return this.contas[indiceSelecionado];
        }

        private void button3_Click(object sender, EventArgs e)
        {
            Conta c1 = new ContaCorrente();
            c1.Deposita(200.0);
            ContaPoupanca c2 = new ContaPoupanca();
            c2.Deposita(125.0);
            TotalizadorDeContas t = new TotalizadorDeContas();
            t.Soma(c1);
            t.Soma(c2);

            MessageBox.Show("valor total: " + t.ValorTotal);
        }

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

            int indiceDaContaDestino = destinoDaTransferencia.SelectedIndex;

            Conta contaDestino = this.contas[indiceDaContaDestino];

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

            contaSelecionada.TransferePara(contaDestino, valorTransferencia);

            this.MostraConta(contaSelecionada);

        }

        private void button5_Click(object sender, EventArgs e)
        {
            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 button6_Click(object sender, EventArgs e)
        {
            ContaCorrente c = new ContaCorrente();
            MessageBox.Show("A proxima conta corrente será de numero: " + c.ProximaConta());
        }

        private void button7_Click(object sender, EventArgs e)
        {
            CadastroConta formularioDeCadastro = new CadastroConta(this);
            formularioDeCadastro.ShowDialog();
        }

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

    }
}

Cadastro conta.cs

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 CaixaEletronico
{
    public partial class CadastroConta : Form
    {
        private Form1 aplicacaoPrincipal;

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

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

            this.aplicacaoPrincipal.AdicionaConta(novaConta);

        }
    }
}

Cliente.cs

namespace CaixaEletronico
{
        public class Cliente
        {
            public string Nome { get; set; }
            public string rg;
            public string cpf;
            public string endereco;
            public int idade;
            private bool EEmancipado;

            public Cliente(string nome)
            {
                this.Nome = nome;
            }

            public Cliente() { }

            public bool PodeAbrirContaSozinho
            {
                get
                {
                    var maiorDeIdade = this.idade >= 18;
                    var emancipado = (this.EEmancipado);
                    var possuiCPF = !string.IsNullOrEmpty(this.cpf);
                    return (maiorDeIdade || emancipado) && possuiCPF;
                }
            }

            public bool EhMaiorDeIdade()
            {
                return this.idade >= 18;
            }
        }
}

Acredito que o problema esteja aqui:

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

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

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

            Conta contaDoVictor = new ContaCorrente();
            contaDoVictor.Titular = new Cliente();
            contaDoVictor.Titular.Nome = "Victor";
            contaDoVictor.Nome = contaDoVictor.Titular.Nome;
            contaDoVictor.Numero = 1;
            contas[0] = contaDoVictor;

            Conta contaDoGuilherme = new ContaPoupanca();
            contaDoGuilherme.Titular = new Cliente();
            contaDoGuilherme.Titular.Nome = "Guilherme";
            contaDoGuilherme.Nome = contaDoGuilherme.Titular.Nome;
            contaDoGuilherme.Numero = 2;
            contas[1] = contaDoGuilherme;

            Conta contaDoMauricio = new ContaInvestimento();
            contaDoMauricio.Titular = new Cliente();
            contaDoMauricio.Titular.Nome = "Mauricio";
            contaDoMauricio.Nome = contaDoMauricio.Titular.Nome;
            contaDoMauricio.Numero = 3;
            contas[2] = contaDoMauricio;

            foreach (Conta conta in this.contas)
            {
                comboContas.Items.Add(conta);
                destinoDaTransferencia.Items.Add(conta);
            }

            comboContas.DisplayMember = "Nome";
        }

Criamos um contador para controlar quantas contas temos no nosso sistema, perfeito! e no método AdicionaConta incrementamos toda vez que uma conta nova é criada:

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

Mas, no formLoad não foi incrementado no contador as contas ja criadas:

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

            Conta contaDoVictor = new ContaCorrente(); // criamos a primeira conta
            contaDoVictor.Titular = new Cliente();
            contaDoVictor.Titular.Nome = "Victor";
            contaDoVictor.Nome = contaDoVictor.Titular.Nome;
            contaDoVictor.Numero = 1;
            contas[0] = contaDoVictor;

            Conta contaDoGuilherme = new ContaPoupanca(); // criamos a segunda conta
            contaDoGuilherme.Titular = new Cliente();
            contaDoGuilherme.Titular.Nome = "Guilherme";
            contaDoGuilherme.Nome = contaDoGuilherme.Titular.Nome;
            contaDoGuilherme.Numero = 2;
            contas[1] = contaDoGuilherme;

            Conta contaDoMauricio = new ContaInvestimento(); // criamos a teceira conta
            contaDoMauricio.Titular = new Cliente();
            contaDoMauricio.Titular.Nome = "Mauricio";
            contaDoMauricio.Nome = contaDoMauricio.Titular.Nome;
            contaDoMauricio.Numero = 3;
            contas[2] = contaDoMauricio;

            foreach (Conta conta in this.contas)
            {
                comboContas.Items.Add(conta);
                destinoDaTransferencia.Items.Add(conta);
            }

            comboContas.DisplayMember = "Nome";
        }

Nesse momento nosso array ja tem as posições 0,1 e 2 ocupadas! Precisamos falar isso pro nosso contador:

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

            Conta contaDoVictor = new ContaCorrente();
            contaDoVictor.Titular = new Cliente();
            contaDoVictor.Titular.Nome = "Victor";
            contaDoVictor.Nome = contaDoVictor.Titular.Nome;
            contaDoVictor.Numero = 1;
            contas[0] = contaDoVictor;

            Conta contaDoGuilherme = new ContaPoupanca();
            contaDoGuilherme.Titular = new Cliente();
            contaDoGuilherme.Titular.Nome = "Guilherme";
            contaDoGuilherme.Nome = contaDoGuilherme.Titular.Nome;
            contaDoGuilherme.Numero = 2;
            contas[1] = contaDoGuilherme;

            Conta contaDoMauricio = new ContaInvestimento();
            contaDoMauricio.Titular = new Cliente();
            contaDoMauricio.Titular.Nome = "Mauricio";
            contaDoMauricio.Nome = contaDoMauricio.Titular.Nome;
            contaDoMauricio.Numero = 3;
            contas[2] = contaDoMauricio;

            quantidadeDeContas = 3; // inicializa a quantidade de contas

            foreach (Conta conta in this.contas)
            {
                comboContas.Items.Add(conta);
                destinoDaTransferencia.Items.Add(conta);
            }
            comboContas.DisplayMember = "Nome";
        }

Agora ao carregar o form, criamos 3 contas e ja dizemos que a quantidade de contas começa em 3 =)

Qualquer dificuldade, compartilha com a gente! bons estudos =)

solução!

Resolvi assim:

            foreach (Conta conta in this.contas)
            {
                comboContas.Items.Add(conta);
                destinoDaTransferencia.Items.Add(conta);
                this.quantidadeDeContas++;//-- Assim independente de quantas contas tenha iniciado, vai estar de acordo
            }