4
respostas

Recuperando um objeto e nao o indice selecionado.

Boa tarde, Eu fiz um comboBox no curso anterior de C#, e recuperei o indice selecionado mas como como boa pratica é melhor recuperar o objetc, tentei fazer desta forma e está dando problema onde eu não estou conseguindo resolver. Poderiam me ajudar?

Forma antiga:

int indiceSelecionado = comboContas.SelectedIndex;
 Conta contaSelecionada = contas[indiceSelecionado];

textoTitular2.Text = contaSelecionada.Titular.Nome;
textoNumero2.Text = Convert.ToString(contaSelecionada.Numero);
textoSaldo2.Text = Convert.ToString(contaSelecionada.Saldo);

Forma nova:

object itemSelecionado = comboContas.SelectedItem;
Conta c = (Conta)itemSelecionado;

textoTitular2.Text = c.Titular.Nome;
textoNumero2.Text = Convert.ToString(c.Numero);
 textoSaldo2.Text = Convert.ToString(c.Saldo);

Debugando até a parte da Conta c, ele acha o objeto correto mas fala que:

Não é possível converter um objeto do tipo 'System.String' no tipo 'Alura.CaixaEletronico.Contas.Conta'.

4 respostas

Olá Étori,

pelo erro ele está informando que o SelectedItem que ele guardou é do tipo String ao invés de Conta. Veja se na hora de fazer o Add no ComboBox ( comboContas.Items.Add(...) ) se adicionou uma conta ou o Numero da conta, que é do tipo String. Para o SelectedItem retornar uma conta agora o Add precisa ser dos objetos conta inteiro mesmo.

Resolveu grande parte, consegui recuperar o object "conta", só que quando eu aperto na setinha do meu comboBox, ele não aparece o Nome do titular como aparecia antes. Aparece: Alura.CaixaEletronico.ContaCorrente por exemplo. mas esta funcionando.

Antes eu add no comboBox assim: comboContas.Items.Add(conta.Titular.Nome);

Agora: comboContas.Items.Add(conta);

Tentei utilizar: comboContas.DisplayMember = "conta.Titular.Nome"; comboContas.DisplayMember = conta.Titular.Nome;

mesmo assim não adiantou.

Não precisa passar o DisplayMember. Basta sobrescrever o método ToString() na classe Conta de forma que ele retorne o Nome do Titular que o ComboBox vai imprimir na esta informação na tela quando receber um objeto Conta.

Étori, boa noite,

Se você tiver na Classe Conta a propriedade Titular assim:

public string Titular { get; set; }

Basta ter no final:

comboContas.DisplayMember = "Titular";

Dessa forma funciona, vai por mim. Eu testei e funcionou.