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

Problema utilizando Forms nas aulas

Olá! Estou fazendo o curso utilizando Windows Forms, até aí sem problema nenhum. Criei 3 formulários para usuário, produto e categoria. Eu carrego na ComboBox os usuários já criados utilizando o código:

    private EntidadesContext contexto;
....
    var listaUsuarios = contexto.Usuarios.ToList();
    srcUsuario = new BindingList<Usuario>(listaUsuarios);
    cmbUsuarios.DataSource = srcUsuario;
    cmbUsuarios.DisplayMember = "Nome";

Porém eu encontro o mesmo problema que eu tinha no projeto do curso de C# (aqui) e mesmo utilizando uma BindingList, o conteúdo da ComboBox não atualiza junto com o Banco. Imagino que seja algo em relação a lista do contexto ter que ser passada para dentro do BindingList e ela não atualiza. Eu tentei extrair essas atribuições para um método e chamá-lo toda vez que cadastro ou excluo um usuário, e funcionou! Só que não me parece ser uma boa prática fazer isso. Alguém pode me ajudar?

5 respostas

Olá Hudson,

a dificuldade é justamente pelo fato que você tem dois objetos que listam os usuários, o contexto.Usuarios e o srcUsuarios que é passado no DataSource comboBox. E o problema como os tipos são incompatíveis, dado que o contexto.Usuarios é um DbSet enquanto o DataSource precisa receber um IList ou um Array, não tem como usar uma referência comum para os dois.

Acho que a solução mais justa neste sentido é realmente extrair para um método responsável por adicionar usuário. Você poderia inclusive criar uma classe a parte que é responsável pelos usuários do sistema, sendo que dentro desta classe você tem um método adiciona e um remove, que atualiza tanto o ComboBox quanto o banco.

Oi Lucas! Mas se os usuários estão contidos dentro de um DbSet na classe Contexto, como eu faria nessa classe para que eles entre em uma IList e não volte a dar esse problema?

Então o grande problema é que pela incompatibilidade dos tipos (um é DbSet e o outro IList), para manter a consistência você terá que adicionar o novo usuário nas duas coisas. Então você precisa de algum método que faz algo parecido com:

contexto.Usuarios.Add(usuario);
comboBox.Items.Add(usuario);

Entendi! E quando eu iniciar o Form e precisar carregar os usuários já cadastrados no banco para a ComboBox, eu continuo fazendo da mesma maneira que está atualmente?

solução!

Isso pode ser feito até no construtor do Form. Inclusive, se você for criar a classe a parte que fará o trabalho de gerenciar a lista de usuário (banco e combobox), ela pode ser criara no construtor recebendo tanto o DBContext quando o ComboBox como parâmetros.

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software