System.IndexOutOfRangeException:'索引超出了数组的范围。但它不是阵列?

时间:2017-01-02 10:41:26

标签: c# arrays

我一直在学习C#并尝试创建一个小型银行系统,存款,取款和创建账户选项。但是当我尝试创建一个帐户而不是默认帐户时我遇到了麻烦(每次我创建一个新帐户时都应该增加)。我一直得到这个:“System.IndexOutOfRangeException:'索引超出了数组的范围。'”甚至在没有数组的行中。你能帮助我吗?以下是您可能需要的所有代码:

编辑:我认为我从注释中获得了数组的问题,但是为什么数组大小不会随着maximocontas而增加,一旦它应该增加一个帐户被创建。因此,如果限制为1,我会创建一个帐户,然后由于maximocontas ++,限制现在应该是2;和contas [maximocontas];,不应该吗?

我的问题在于AbreConta() 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 Banco
{
    public partial class Form1 : Form
    {
        private int maximocontas = 1; //maximo de contas
        private int contascriadas = 0;
        private Conta[] contas;// declara uma variavel tipo conta chamada contas
        public Form1()
        {
            InitializeComponent();
        }
        private void Form1_Load(object sender, EventArgs e)
        {
            this.contas = new Conta[maximocontas];
        }
        public void AbreConta(Conta conta)
        {
            maximocontas++;
            this.contas[this.contascriadas] = conta;
            MessageBox.Show(Convert.ToString(contascriadas));
            contascriadas++;
            ComboContas.Items.Add("titular: " + conta.Titular.Nome);
            DestinoTransfBox.Items.Add("titular:" + conta.Titular.Nome);
        }
        private void BotaoDeposito_Click(object sender, EventArgs e)
        {
            string valorDigitado = TextoValor.Text;
            double valorOperavel = Convert.ToDouble(valorDigitado);
            int busca = ComboContas.SelectedIndex;
            Conta selecionada = contas[busca];
            if (valorOperavel > 0)
            {
                double valor;
                valor = Convert.ToDouble(TextoValor.Text);
                selecionada.Deposita(valor);
                TextoSaldo.Text = Convert.ToString(selecionada.Saldo);
            }
            else
            {
                MessageBox.Show("Valor não depositavel");
            }
        }

        private void BotaoSaque_Click(object sender, EventArgs e)
        {
            string valorDigitado = TextoValor.Text;
            double valorOperavel = Convert.ToDouble(valorDigitado);
            int busca = ComboContas.SelectedIndex;
            Conta selecionada = this.contas[busca];
            if (selecionada.Saldo >= valorOperavel)
            {
                double valor;
                valor = Convert.ToDouble(TextoValor.Text);
                selecionada.Saque(valor);
                TextoSaldo.Text = Convert.ToString(selecionada.Saldo);
            }
            else
            {
                MessageBox.Show("Saldo Indisponivel");
            }
        }

        private void BotaoBuscar_Click(object sender, EventArgs e)
        {
            if(ComboContas.SelectedIndex <= maximocontas-1)
            {
                int busca = ComboContas.SelectedIndex;
                Conta selecionada = this.contas[busca];
                TextoNumero.Text = Convert.ToString(selecionada.Numero);
                TextoSaldo.Text = Convert.ToString(selecionada.Saldo);
                TextoTitular.Text = selecionada.Titular.Nome;
            }
            else
            {
                MessageBox.Show("Essa conta não existe!");
            }
        }

        private void ComboContas_SelectedIndexChanged(object sender, EventArgs e)
        {
            int busca = ComboContas.SelectedIndex;
            Conta selecionada = contas[busca];
            TextoTitular.Text = selecionada.Titular.Nome;
            TextoSaldo.Text = Convert.ToString(selecionada.Saldo);
            TextoNumero.Text = Convert.ToString(selecionada.Numero);
        }

        private void DestinoTransfBox_SelectedIndexChanged(object sender, EventArgs e)
        {
            int busca = DestinoTransfBox.SelectedIndex;
            Conta selecionada = contas[busca];
        }

        private void BotaoTransferir_Click(object sender, EventArgs e)
        {
            int busca = ComboContas.SelectedIndex;
            int dest = DestinoTransfBox.SelectedIndex;
            Conta destino = contas[dest];
            Conta selecionada = contas[busca];
            double valor = Convert.ToDouble(ValorTransferencia.Text);
            if(selecionada.Saldo >= valor)
            {
                Conta.Transferir(valor, selecionada, destino);
                TextoSaldo.Text = Convert.ToString(selecionada.Saldo);
                MessageBox.Show("Operação Concluida");
            }
            else
            {
                MessageBox.Show("Saldo Insuficiente Para a Transferencia");
            }
        }

        private void BotaoNovaAcc_Click(object sender, EventArgs e)
        {
            Form2 formularioDeAbertura = new Form2(this);
            formularioDeAbertura.ShowDialog();
        }
    }
}

Form2(帐户创建表单)

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 Banco
{
    public partial class Form2 : Form
    {
        private Form1 formPrincipal;
        public Form2(Form1 formPrincipal)
        {
            this.formPrincipal = formPrincipal;
            InitializeComponent();
        }

        private void Form2_Load(object sender, EventArgs e)
        {

        }

        private void BotaoCriar_Click(object sender, EventArgs e)
        {
            Conta novaConta = new ContaCorrente();
            novaConta.Titular = new Cliente(TextNovoNome.Text);
            novaConta.Numero = Convert.ToInt32(TextNovoNumero.Text);
            this.formPrincipal.AbreConta(novaConta);
        }
    }
}

Conta.cs(与所有与帐户相关的事物)

namespace Banco
{
    public class Conta
    {
        public int Numero { get ; set; }
        public double Saldo { get; protected set; } // set/gets privados não podem ser lidas por quem esta fora nem pelos herdeiros, os protected podem ser lidos pelos herdeiros mas nao por quem esta fora
        public Cliente Titular { get; set; }
        public virtual void Deposita(double valor)
        {
            this.Saldo += valor;
        }
        public virtual void Saque(double valor)
        {
            this.Saldo -= valor;
        }
        public static void Transferir(double value, Conta origem, Conta destino)
        {
            origem.Saldo -= value;
            destino.Saldo += value;
        }
    }
    public class ContaPoupanca : Conta //lê-se CountaPoupanca herda Conta, ela herdara todos os atributos, metodos e etc da class Conta
    {
        public override void Deposita(double valor) // o override pode ser feito tanto assim
        {
            this.Saldo += valor - 0.10;
        }
        public override void Saque(double valor) //como assim
        {
            base.Saque(valor + 0.10);
        }
        //A palavra base chama o comportamento que queremos reaproveitar, chama o metodo saca e passa como parametro valor + 0.10
    }
    public class ContaCorrente : Conta
    {
        public override void Deposita(double valor)
        {
            base.Deposita(valor - 0.10);
        }
        public override void Saque(double valor)
        {
            base.Saque(valor + 0.5);
        }
    }
    public class TotalizadorDeContas
    {
        public double ValorTotal { get; private set; }
        public void Soma(Conta conta)
        {
            ValorTotal += conta.Saldo;
        }
    }
}

Cliente.cs(使用Cliente [客户]类)

namespace Banco
{
    public class Cliente
    {
        private string documentos;
        public string Nome { get; set; }
        public string Documentos{ get { return this.documentos; } set { this.documentos = value; } }
        public Cliente(string nome)
        {
            this.Nome = nome;
        }
    }
}

在这里您可以找到Form1 Designer:http://pastebin.com/4L944Dxd 在这里您可以找到Form2 Designer:http://pastebin.com/KYaRyeUv

0 个答案:

没有答案