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

Dúvida no Ex. 3 da Aula 7 - Mão na Massa - Combo Box

Eu gostaria de saber se está certo o que eu fiz. Na resposta do curso está dizendo que eu deveria criar os componentes e alterar as propriedades e após isso feito só precisaria criar o código dentro do evento click do botão criado.

No caso eu criei também o SelectedIndexChanged do novo comboBox.

Era necessário ter feito o que eu fiz ou tinha outra saída? Obrigado

5 respostas

Depende do que você colocou no SelectedIndexChanged. O problema de colocar a lógica de transferência no SelectedIndexChanged é que as chances de você transferir para uma conta errada são enormes.

Colocar o código para transferência num botão que recupera a conta selecionada como destino é mais seguro, pois você tem a chance de ver se tudo está certo antes de apertar o botão para fazer a transferência.

Conseguiu entender?

Na verdade a lógica de transferência não está no SelectedIndexChanged. A única coisa que eu fiz no SelectedIndexChanged, foi carregar os dados da conta selecionadaDestino (assim como os dados da conta remetente foram carregados no comboContas). Eu perguntei isso por causa da resposta do exercício que não faz nenhuma modificação no SelectedIndexChanged, e por isso eu não sei como seria carregado o segundo combo box sem nenhuma alteração dentro. Segue o trecho do código para você entender a dúvida:

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

            this.MostraConta(contaSelecionada);
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            Conta c1 = new Conta();
            c1.Titular = new Cliente("Paulo Abreu");
            c1.Numero = 1;
            c1.Deposita(250);

            Conta c2 = new ContaPoupanca();
            c2.Titular = new Cliente("José Aldo");
            c2.Numero = 2;
            c2.Deposita(500);

            this.contas = new Conta[2];
            this.contas[0] = c1;
            this.contas[1] = c2;

            foreach (Conta conta in contas)
            {
                comboContas.Items.Add(conta.Titular.Nome);
            }

            foreach (Conta conta in contas)
            {
                cmbDestinoDaTransferencia.Items.Add(conta.Titular.Nome);
            }
        }

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

            contaSelecionada.Deposita(Convert.ToDouble(txtValor.Text));
            this.MostraConta(contaSelecionada);
        }

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

            contaSelecionada.Saca(Convert.ToDouble(txtValor.Text));
            this.MostraConta(contaSelecionada);
        }

        private void MostraConta(Conta contaSelecionada)
        {
            txtTitular.Text = contaSelecionada.Titular.Nome;
            txtNumero.Text = contaSelecionada.Numero.ToString();
            txtSaldo.Text = contaSelecionada.Saldo.ToString();
        }

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

        private void btnTransferir_Click(object sender, EventArgs e)
        {
            Conta conta1 = BuscaContaSelecionada();
            int indiceSelecionado = cmbDestinoDaTransferencia.SelectedIndex;
            Conta conta2 = this.contas[indiceSelecionado];

            conta1.Transfere(Convert.ToDouble(txtValor.Text), conta2);

            this.MostraConta(conta1);

            txtTitular2.Text = conta2.Titular.Nome;
            txtNumero2.Text = conta2.Numero.ToString();
            txtSaldo2.Text = conta2.Saldo.ToString();
        }

        private void cmbDestinoDaTransferencia_SelectedIndexChanged(object sender, EventArgs e)
        {
            int indiceSelecionado = cmbDestinoDaTransferencia.SelectedIndex;
            Conta contaSelecionada = this.contas[indiceSelecionado];

            txtTitular2.Text = contaSelecionada.Titular.Nome;
            txtNumero2.Text = contaSelecionada.Numero.ToString();
            txtSaldo2.Text = contaSelecionada.Saldo.ToString();
        }

Estou enviando de novo para tentar formatar direito o código.

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

            this.MostraConta(contaSelecionada);
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            Conta c1 = new Conta();
            c1.Titular = new Cliente("Paulo Abreu");
            c1.Numero = 1;
            c1.Deposita(250);

            Conta c2 = new ContaPoupanca();
            c2.Titular = new Cliente("José Aldo");
            c2.Numero = 2;
            c2.Deposita(500);

            this.contas = new Conta[2];
            this.contas[0] = c1;
            this.contas[1] = c2;

            foreach (Conta conta in contas)
            {
                comboContas.Items.Add(conta.Titular.Nome);
            }

            foreach (Conta conta in contas)
            {
                cmbDestinoDaTransferencia.Items.Add(conta.Titular.Nome);
            }
        }

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

            contaSelecionada.Deposita(Convert.ToDouble(txtValor.Text));
            this.MostraConta(contaSelecionada);
        }

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

            contaSelecionada.Saca(Convert.ToDouble(txtValor.Text));
            this.MostraConta(contaSelecionada);
        }

        private void MostraConta(Conta contaSelecionada)
        {
            txtTitular.Text = contaSelecionada.Titular.Nome;
            txtNumero.Text = contaSelecionada.Numero.ToString();
            txtSaldo.Text = contaSelecionada.Saldo.ToString();
        }

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

        private void btnTransferir_Click(object sender, EventArgs e)
        {
            Conta conta1 = BuscaContaSelecionada();
            int indiceSelecionado = cmbDestinoDaTransferencia.SelectedIndex;
            Conta conta2 = this.contas[indiceSelecionado];

            conta1.Transfere(Convert.ToDouble(txtValor.Text), conta2);

            this.MostraConta(conta1);

            txtTitular2.Text = conta2.Titular.Nome;
            txtNumero2.Text = conta2.Numero.ToString();
            txtSaldo2.Text = conta2.Saldo.ToString();
        }

        private void cmbDestinoDaTransferencia_SelectedIndexChanged(object sender, EventArgs e)
        {
            int indiceSelecionado = cmbDestinoDaTransferencia.SelectedIndex;
            Conta contaSelecionada = this.contas[indiceSelecionado];

            txtTitular2.Text = contaSelecionada.Titular.Nome;
            txtNumero2.Text = contaSelecionada.Numero.ToString();
            txtSaldo2.Text = contaSelecionada.Saldo.ToString();
        }
solução!

Era só editar seu post com a formatação :)

E você não precisaria mostrar as informações da conta de destino. Basta você colocar na combo de destino o nome do titular da conta, assim você vai saber para quem está transferindo.

Quando você faz uma transferência no banco, você não precisa saber o saldo da conta destino, precisa? Na verdade, nem deveria!!! Por isso não há a necessidade de exibir as informações da conta de destino. Basta recuperar o índice selecionado e fazer a transferência.

Entende?

Olá Paulo,
Olá Arthur,

Tenho tido imensos erros com os códigos do C#II e como o Paulo tem um código bem limpo e estruturado, copiei este, porém continuo a ter um erro com a mesmo metodo de antes...


private void MostraConta(Conta contaSelecionada)

"O tipo 'Titular' já contém uma definicao para 'MostraConta'"

Agradeco pelo apoio :)