VB .NET - Curso Prático ADO .NET - Módulo de Administração : Outros detalhes usando o EDM - VI


Na aula anterior abordei a implementação das operações CRUD para o cadastramento de Clientes da CiaFilmes. Dessa forma vimos como acessar, localizar, incluir, alterar e excluir informações do banco de dados CiaFilmes usando o Entity Framework através do Entity Data Model.

A implementação das operações CRUD para os cadastros de atores, diretores, vídeos, categorias, produtores, usuários e papéis segue a mesma lógica e o mesmo procedimento por isso não vou repetir as implementações para os formulários frmAtor.vb, frmCategorias.vb, frmDiretor.vb, frmVideo.vb, frmUsuarios.vb, frmDiretor.vb e frmPapel.vb. Para fazer isso basta repetir os passos mostrados no formulário de clientes alterando apenas a entidade que esta sendo tratada e a sua respectiva tabela.

Nesta aula quero mostrar um outro recurso que não foi abordado no cadastramento de clientes e que pode aparecer em outros cadastramentos.

Vejamos o formulário para cadastrar filmes, conforme mostra a imagem abaixo:

Note que neste formulário temos três controles Combobox: cboDiretor, cboProduto e cboCategoria, para exibir as informações respectivo ID do diretor, do produtor e da categoria.

Quando o formulário for aberto teremos que preencher cada combobox com as informações dos diretores, produtores e categorias de forma que ao selecionar um diretor, um produtor ou uma categoria o ID da seleção seja obtido para depois ser incluído ou alterado.

O que desejamos então é exibir o nome dos diretores, produtores e das categorias e quando a seleção for feita que o ID da seleção seja obtido. Poderíamos exibir apenas o ID de cada item mas dessa forma o usuário teria que lembrar o nome correspondente. Vamos tornar então a experiência do usuário mais fácil incluindo o nome do item e quando da seleção obtendo o seu ID.

Preenchendo o controle Combobox

Vejamos então como implementar o preenchimento do controle Combobox com as informações.

Como queremos carregar os controles na carga do formulário vamos usar o evento Load para declarar 3 rotinas que irão preencher os controles.

No evento Load do formulário defina o código abaixo:

 Private Sub frmFilmes_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        carregaComboDiretor()
        carregaComboProdutor()
        carregaComboCategoria()
    End Sub

No código apenas declaramos 3 rotinas para preencher o respectivo combobox.

Abaixo vemos o código da rotina carregaComboDiretor() que irá preencher o controle com o nome dos diretores e selecionar o seu ID.

Private Sub carregaComboDiretor()
        Try
            Using ctxFilmes = New CiaFilmesEntities
                cboDiretor.DataSource = (From _diretor In ctxFilmes.Diretores Select _diretor).ToList
                cboDiretor.DisplayMember = "Nome"
                cboDiretor.ValueMember = "DiretorId"
            End Using
            cboDiretor.SelectedIndex = 0
        Catch ex As Exception
            MessageBox.Show(ex.Message, "Erro", MessageBoxButtons.OK, MessageBoxIcon.Error)
        End Try
    End Sub

Vou explicar o código passo a passo:

Estou usando um bloco Try/Catch de forma a capturar qualquer exceção que ocorra.

A seguir utilizo o bloco Using/End Using para criar e usar uma instância do nosso contexto - CiaFilmesEntities, gerado pelo Entity Data Model e após isso liberar o recurso usado:

Using ctxFilmes = New CiaFilmesEntities
                cboDiretor.DataSource = (From _diretor In ctxFilmes.Diretores Select _diretor).ToList
                cboDiretor.DisplayMember = "Nome"
                cboDiretor.ValueMember = "DiretorId"
End Using

Observe que estou usando a seguir 3 propriedades do controle Combobox: DataSource, DisplayMember e ValueMember

  1. DataSource -  Define a fonte de dados para o controle de lista;
  2. DisplayMember -  Define a propriedade da fonte de dados a ser exibida no controle;
  3. ValueMember -  Define a propriedade da fonte de dados retornada pela propriedade SelectedValue. Pode ser anulada atribuindo uma string vazia ou uma referencia Null.

No código a fonte de dados esta sendo obtida através de uma consulta LINQ:

(From _diretor In ctxFilmes.Diretores Select _diretor).ToList

Esta consulta seleciona todos os diretores cadastrados na tabela Diretores.

A seguir atribuímos à propriedade DisplayMember o campo Nome que exibirá o nome do diretor e à propriedade ValueMember o campo DiretorId que irá obter  o ID do diretor selecionado.

Concluindo definimos o valor da propriedade SelectedIndex como igual a zero para exibir o primeiro item carregado no controle.

A propriedade SelectedIndex representa o índice baseado no valor inicial zero do item atualmente selecionado. (O valor -1 indica que nenhum item esta selecionado.)

Dessa forma o primeiro item possui índice igual a zero.

Aplicamos a mesma lógica para as demais rotinas conforme código a seguir:

1- Combobox comboProdutor

 Private Sub carregaComboProdutor()
        Try
            Using ctxFilmes = New CiaFilmesEntities
                cboProdutor.DataSource = (From _produtor In ctxFilmes.Produtores Select _produtor).ToList
                cboProdutor.DisplayMember = "Nome"
                cboProdutor.ValueMember = "ProdutorId"
            End Using
            cboDiretor.SelectedIndex = 0
        Catch ex As Exception
            MessageBox.Show(ex.Message, "Erro", MessageBoxButtons.OK, MessageBoxIcon.Error)
        End Try
    End Sub

2- Combobox comboCategoria

Private Sub carregaComboCategoria()
        Try
            Using ctxFilmes = New CiaFilmesEntities
                cboCategoria.DataSource = (From _categoria In ctxFilmes.Categorias Select _categoria).ToList
                cboCategoria.DisplayMember = "Nome"
                cboCategoria.ValueMember = "CategoriaId"
            End Using
            cboCategoria.SelectedIndex = 0
        Catch ex As Exception
            MessageBox.Show(ex.Message, "Erro", MessageBoxButtons.OK, MessageBoxIcon.Error)
        End Try
    End Sub

A lógica da implementação vale para qualquer situação onde temos o controle Combobox e desejamos exibir um texto ao usuário e obter o respectivo ID.

Para que isso funcione da forma que foi mostrada a tabela deverá possuir uma chave primária para identificar unicamente cada item e um campo que descreve o respectivo item.

Na próxima aula iremos ver a implementação das consultas dos clientes com mais pedidos , dos filmes mais pedidos e dos pedidos e seus detalhes realizados em um período.

      Gostou ?   Compartilhe no Facebook   Compartilhe no Twitter

 

Referências:


José Carlos Macoratti