Ainda não tem acesso? Estude com a gente! Matricule-se
Ainda não tem acesso? Estude com a gente! Matricule-se

Solucionado (ver solução)

Estou com dúvida no curso de C# e Orientação a Objetos, no exercício 1 do capítulo Mão na Massa - Combo Box.

//meus itens não aparecem no combobox

private Conta[] contas = new Conta[5];

private void Form1_Load(object sender, EventArgs e) {

Conta ContaDoDorfo = new Conta(); ContaDoDorfo.cliente.Nome = "Dorfo"; ContaDoDorfo.Numero = 1; ContaDoDorfo.deposita(100); contas[0] = ContaDoDorfo;

Conta ContaDoGuto = new Conta(); ContaDoGuto.cliente.Nome = "Guto"; ContaDoGuto.Numero = 2; ContaDoGuto.deposita(200); contas[1] = ContaDoGuto;

Conta ContaDoLemao = new Conta(); ContaDoLemao.cliente.Nome = "Lemao"; ContaDoLemao.Numero = 3; ContaDoLemao.deposita(300); contas[2] = ContaDoLemao;

foreach (Conta conta in contas) { comboDeContas.Items.Add(conta.cliente.Nome); }

}

private void MostrarConta() { textTitular.Text = conta.cliente.Nome; textSaldo.Text = Convert.ToString(conta.Saldo); textNumero.Text = Convert.ToString(conta.Numero); }

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

this.MostrarConta(contaSelecionada);

}

12 respostas

Cara, eu acho que você não pode setar um atributo de um atributo do seu objeto dessa forma:

ContaDoDorfo.cliente.Nome = "Dorfo";

Tente fazer assim:

Cliente cliente = new Cliente();

cliente.Nome = "Dorfo";

ContaDoDorfo.cliente = cliente;

Fassa isso para todas as suas atribuições e veja se dá certo! =)

Á proposito, é uma convenção em C# que nomes de variaveis comecem com letras minúsculas e suas proximas "palavras" comecem com maiúsculas. Exemplo:

Conta contaDoDorfo = new Conta();

É convenção declara apenas Métodos e Classes com letras maiúsculas.

Ah, outra coisa.. A próxima vez que for postar uma dúvida, se possível, tente deixar o código identado.. Acredito que esse tenha sido o principal motivo para ninguém ter respondido a sua dúvida até agora.. Da forma que você postou fica muito dificil de ler. Eu tive que copiar todo o conteúdo, colar no notepad++ e identar tudo..

Espero ter ajudado! =)

Abraço!

Ops!!!

*Faça

hehehe

Na verdade, o que eu comentei se refere ao caso de você ter o modificador private em alguns desses atributos. Dessa forma, você pode estar tentando acessar uma informação que não deve. Por isso sugeri daquela forma.

vlw pela ajuda e pelas dicas. Ainda nao resolvi o problema deste combo box, tentei fazer como vc disse e o mesmo erro persiste. Em relacao a identacao, eu sou novo por aqui e ainda nao manjo como fazer certinho, se vc puder me dar dicas de como vc identa seu codigo eu agradeceria.

solução

Opa! Cara, eu vou responder aqui rapidão pq eu to indo embora! Quando eu chegar em casa eu respondo com mais detalhes.

Ó

A principio, eu mantive aquela ideia de fazer uma instancia de cliente.. Em segundo, eu diminui o numero do seu array de contas. Ele estava em 5 e você passava apenas 3. No foreach ele tava passando por todos os 5 Quando chegava em algum que era nulo ele lançava a excessão.

Vê se você entende aí rsrs

Já já coloco mais detalhes:

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

    Conta c0 = new Conta();
    Cliente cliente0 = new Cliente();
    cliente0.Nome = "João";
    c0.Cliente = cliente0;
    contas[0] = c0;

    Conta c1 = new Conta();
    Cliente cliente1 = new Cliente();
    cliente1.Nome = "João";
    c1.Cliente = cliente1;
    contas[1] = c1;

    Conta c2 = new Conta();
    Cliente cliente2 = new Cliente();
    cliente2.Nome = "João";
    c2.Cliente = cliente2;
    contas[2] = c2;

    foreach (Conta conta in contas)
    {
        Cliente cliente = new Cliente();
        cliente = conta.Cliente;
        comboDeContas.Items.Add(cliente.Nome);
    }
}

vlwww cara.. entendi sim o codigo, alias funcionou aqui. Acredito eu que o erro estava ali no foreach aonde eu nao criei o cliente e assim nao conseguia acessar o nome. Muito obrigado amigo, espero poder retruibuir em alguma oportunidade. Ainda aguardo algumas dicas para poder postar meus codigos assim como os teus.

hahaha fico feliz que eu tenha lhe ajudado! =)

Ó, seguem "as dicas" rsrs:

  • É convenção em C# utilizarmos as seguintes regras para nomear itens:
/*
Utilize a primeira letra MINÚSCULA
quando for declarar uma variavel qualquer.
Aquelas que são declaradas dentro dos métodos,
por exemplo. NÃO OS ATRIBUTOS DA CLASSE.
PARA ESSE TEMOS UMA CONVENÇÃO A PARTE.
/*

//Exemplo de como declarar variavel:
String variavelNormalCriadaDentroDeUmMetodo;

======================================================

/*
Utilize a primeira letra MAIÚSCULA
quando for declarar um ATRIBUTO da sua classe.
(utilizar essa convenção quando for encapsular seus
atributos, ou seja, sempre!)
/*

//Exemplo de como declarar um atributo:
public String EuSouUmAtributo { get; set; }

======================================================

/*
Utilize a primeira letra MAIÚSCULA
quando for declarar um MÉTODO da sua classe.
(utilizar essa convenção sempre! Independente do
tipo de retorno, parâmetros ou quantidade de 
parâmetros.)
/*

//Exemplo de como declarar um método:
public void Deposita(double valor)
{
    //Deposita
}

======================================================

/*
Utilize a primeira letra MAIÚSCULA
para dar nome a sua classe.
(utilizar essa convenção sempre!
Independente se a classe herda algo de alguém
ou se implementa alguma
interface.)
/*

//Exemplo de como dar nome a classes:
MinhaClasse.cs

Agora, em relação a identação, não tem segredo. É convenção um TAB ou quatro espaços. O problema é que quando colamos o código aqui no Alura, normalmente, ele não vem com a identação correta =/ Nesses casos, você tem que identar na mão rsrs. É chato, mas ajuda muito quem lê o seu código! :-)

Bom, é isso aí! Por favor, se eu ajudei mesmo, marca a minha resposta como resposta correta!

Valeu!!

Ah, você ja marcou hehe Valeu!!

*Acho que no foreach você pode colocar

comboDeContas.Items.Add(conta.Cliente.Nome);

Se não me engano, pra ler valor, você pode ler assim!

Ah, e comentarios multline começam com

/*

e terminam com

*/

Diferente do que eu fiz que termina com "/*". Eu fiz errado mesmo hehehe É que não da para editar a resposta.. =/

vlw entendi td. Queria saber como vc edita a cor das palavras na hr de postar, pro meu código ficar mais legível e a galera me ajudar com mais rapidez.

hahhaha agora eu entendi aqui.. basta estar dentro das ``` vlw