VB.NET 2008 - Cadastro de Alunos - parte 2


Como na  primeira parte deste artigo  já foram definidos os alicerces para a aplicação Cadastro de Alunos nesta segunda parte vou abordar o código usado para fazer a aplicação funcionar.

Como a aplicação possui somente um formulário chamado Alunos.vb a execução da aplicação irá iniciar o carregamento deste formulário pelo evento Load.

Definindo a carga dos dados

Neste evento , eu coloquei o código que irá acessar o banco de dados Alunos.mdb estabelecendo uma conexão , defini um comando SQL para selecionar os registros da tabela Alunos e através de um DataAdapter preencher um objeto DataTable com os dados retornados. Como estou efetuando uma conexão com um banco de dados Microsoft Access usei o provedor OleDb.

Em seguida efetuei a vinculação dos dados com os controles definidos no formulário para exibição dos mesmos e para gerenciar a navegação defini um objeto CurrencyManager.

O modelo de objetos Windows Forms suporta dois gerenciadores de vinculação de dados:

O código associado ao evento esta descrito e comentado abaixo:

Private Sub frmCadastroAlunos_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

 

'conecta com o banco de dados e abre a conexão

AlunosConnection = New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0; Data Source = " + Application.StartupPath + "\..\..\Alunos.mdb")

AlunosConnection.Open()

'define um objeto command

AlunosCommand = New OleDbCommand("SELECT * FROM Alunos ORDER BY Nome", AlunosConnection)

'define um dataAdapter

AlunosAdapter = New OleDbDataAdapter()

AlunosAdapter.SelectCommand = AlunosCommand

'define e preenche um DataTable com os dados

AlunosTabela = New DataTable()

AlunosAdapter.Fill(AlunosTabela)

'vincula os dados aos controles do formulário

txtNome.DataBindings.Add("Text", AlunosTabela, "Nome")

txEndereco.DataBindings.Add("Text", AlunosTabela, "Endereco")
'os controles lblSexo e lblGrau não são visiveis ao usuário e
'sao usados para preencher os controles radioButton equivalentes

lblSexo.DataBindings.Add("Text", AlunosTabela, "Sexo")

lblGrau.DataBindings.Add("Text", AlunosTabela, "Grau")

dtpNascimento.DataBindings.Add("Text", AlunosTabela, "Nascimento")

lblFoto.DataBindings.Add("Text", AlunosTabela, "Foto")

'estabelece o currencyManager

AlunosCManager = DirectCast(Me.BindingContext(AlunosTabela), CurrencyManager)

'Defini a exibição dos dados nos controles lable para sexo e grau e exibe a foto do aluno

Call ExibirDados()

'define o estado de exibição dos dados: visualizar (Ver) e Editar

Call definirEstado("Ver")

End Sub

Você pode conhecer mais sobre cada um dos itens citados lendo os meus artigos:

Agora passemos ao código da rotina ExibirDados() :

Private Sub ExibirDados()


'sexo

If lblSexo.Text = "M" Then

    rdoMasculino.Checked = True

Else

    rdoFeminino.Checked = True

End If
 

'grau

Select Case lblGrau.Text

   Case "1"

      rdoPrimeiro.Checked = True

    Case "2"

      rdoSegundo.Checked = True

    Case "3"

      rdoTerceiro.Checked = True

   Case "4"

      rdoQuarto.Checked = True

    Case "5"

      rdoQuinto.Checked = True

   Case "6"

       rdoSexto.Checked = True

End Select
 

Call ExibirFoto()


End
Sub

 

Esta rotina atribui valores aos controles RadioButton usados para definir o Sexo e Ano/Grau que o aluno esta cursando. Note que o código usa dois controles Label: lblSexo e lblGrau, que não são visíveis em tempo de execução, para verificar qual o valor obtido da tabela e exibir a informação no RadioButton equivalente.

 

Agora é a vez da rotina ExibirFoto():

 

Private Sub ExibirFoto()
 

If lblFoto.Text <> "" Then

       Try

           picItem.Image = Image.FromFile(localfotos & lblFoto.Text)

      Catch ex As Exception

          picItem.Image = Nothing

          MessageBox.Show(ex.Message, "Erro ao carregar Foto.", MessageBoxButtons.OK, MessageBoxIcon.Error)

      End Try

Else

       picItem.Image = Nothing

End If

End Sub

O código verifica se a Label: lblFoto esta vazia ( Poderíamos ter usado também:  If lblFoto.Text IsNot String.Empty Then )

Se for verdadeiro carregamos a imagem no controle picItem, cujo caminho foi definido na variável localfotos, usando o nome da imagem carregado em lblFoto.text, caso contrário atribuímos um Nothing ao controle.

Lembre que ainda estamos executando o código no evento Load e a última rotina chamada é : definirEstado():

Private Sub definirEstado(ByVal AppEstado As String)


mEstado = AppEstado


Select
Case
AppEstado

Case "Ver"

btnPrimeiro.Enabled = True

btnAnterior.Enabled = True

btnProximo.Enabled = True

btnUltimo.Enabled = True

btnEdita.Enabled = True

btnSalva.Enabled = False

btnCancela.Enabled = False

btnInclui.Enabled = True

btnDeletar.Enabled = True

btnImprimir.Enabled = True

btnSair.Enabled = True

txtNome.ReadOnly = True

txEndereco.ReadOnly = True

dtpNascimento.Enabled = False

btnCarregaFoto.Enabled = False

grpSexo.Enabled = False

grpGrau.Enabled = False

Case "Editar", "Incluir"

btnPrimeiro.Enabled = False

btnAnterior.Enabled = False

btnProximo.Enabled = False

btnUltimo.Enabled = False

btnEdita.Enabled = False

btnSalva.Enabled = True

btnCancela.Enabled = True

btnInclui.Enabled = False

btnDeletar.Enabled = False

btnImprimir.Enabled = False

btnSair.Enabled = False

txtNome.ReadOnly = False

txEndereco.ReadOnly = False

dtpNascimento.Enabled = True

btnCarregaFoto.Enabled = True

grpSexo.Enabled = True

grpGrau.Enabled = True

End Select
 

txtNome.Focus()


End
Sub

Neste código verificamos se o estado é igual a Ver , para visualizar os dados apenas, ou Editar/Incluir usados para edição e inclusão de dados. Conforme o caso as propriedades Enabled e ReadOnly dos controles são alteradas e o foco é colocado no controle txtNome.

Ao terminar a execução do código será apresentado o seguinte formulário:

Definindo a navegação pelos registros

Vejamos a seguir o código associado ao evento Click dos botões de comando que permitem a navegação pelos registros:

Private Sub btnPrimeiro_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnPrimeiro.Click

   AlunosCManager.Position = 0

   Call ExibirDados()

End Sub
 

Private Sub btnAnterior_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnAnterior.Click

   AlunosCManager.Position -= 1

   Call ExibirDados()

End Sub
 

Private Sub btnProximo_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnProximo.Click

   AlunosCManager.Position += 1

    Call ExibirDados()

End Sub
 

Private Sub btnUltimo_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnUltimo.Click

   AlunosCManager.Position = AlunosCManager.Count - 1

    Call ExibirDados()

End Sub

Em cada um dos botões , quando o usuário clicar, o objeto CurrencyManager - AlunosCManager - irá permitir a navegação pelos registros chamado a rotina ExibirDados para que os controles sejam preenchidos com os dados atualizados.

Diferente do objeto Recordset da ADO , a interface IList não mantém o controle sobre o registro atual , não possuindo assim os métodos MoveFirst, MoveNext , MovePrevious e MoveLast da ADO. Ao invés disso o CurrencyManager usa a propriedade Position para manter o controle sobre os registros; incrementando e decrementando esta propriedade permite a navegação pelos registros da tabela.

Definindo as operações básicas de manutenção de dados

Agora vamos as operações para manutenção dos dados , começando pela edição realizada quando o usuário clica no botão Editar. Quando isso ocorre a seguinte tela é exibida:

Note  que os botões de comando para navegação , edição , inclusão(Novo) , impressão, deleção e Sair foram desabilitados.

Os botões Salvar, Cancelar e Carregar Foto foram habilitados;

O acesso para alterar o Sexo e o Ano foram também habilitados;

Isso permite a alteração dos dados do formulário com opção para Salvar o Cancelar a operação.

O código associado ao evento Click do botão Editar é o seguinte:

Private Sub btnEdita_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnEdita.Click

Call definirEstado("Editar")

End Sub

O código apenas chama a rotina definirEstado() passando o parâmetro "Editar" para indicar que estamos no estado de edição dos dados.

Abaixo temos um exemplo de tela mostrando a edição sendo realizada com alteração da data de nascimento através do controle DateTimePicker - dtpNascimento, e da caixa de diálogo OpenFileDialog - dlgAbrir - exibindo uma relação de imagens:

O código para Salvar os dados associado ao evento Click do botão - Salvar - é dado a seguir:

Private Sub btnSalva_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnSalva.Click


'verifica o item Endereço

If txEndereco.Text.Trim = ""  Then

    MessageBox.Show("Informe o endereço.", "Erro Entrada", MessageBoxButtons.OK, MessageBoxIcon.Information)

    txEndereco.Focus()

     Exit Sub

End If

 

Dim itemSalvo As String = txEndereco.Text

Dim linhaSalva As Integer

 

'encerra edição do CurrencyManager

AlunosCManager.EndCurrentEdit()

 

'define o modo de exibição ordenado por Nome

AlunosTabela.DefaultView.Sort = "Nome"

 

'obtem o id da linha Salva

linhaSalva = AlunosTabela.DefaultView.Find(itemSalvo)

 

'atribui a posição da linha em edição ao CurrencyManager

AlunosCManager.Position = linhaSalva

Call ExibirDados()

Call definirEstado("Ver")

End Sub

O código verifica se foi informado um valor para o endereço do aluno para prosseguir; em seguida armazena o valor na variável itemSalvo e encerra a edição do CurrencyManager salvando os dados.

Após definir a ordenação pelo nome procura-se o item salvo atribuindo o seu valor a propriedade Position do CurrencyManager para em seguida exibir os dados e definir o estado como visualização.

O botão Cancelar possui o código abaixo:

Private Sub btnCancela_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnCancela.Click


AlunosCManager.CancelCurrentEdit()


If
mEstado = "Incluir"
Then

    AlunosCManager.Position = mMarcador

End If
 

Call ExibirDados()

Call definirEstado("Ver")

 

End Sub

O código usa o método CancelCurrentEdit() para cancelar a edição desfazendo qualquer alteração e verifica se o estado é igual a "Incluir" para atribuir o valor da variável mMarcador a propriedade Position.  Esta variável a iniciada quando o processo de inclusão começa , desta forma podemos voltar a exibir os registros na posição anterior ao início da operação de inclusão.

O botão Novo é usado para incluir um registro da tabela e tem o seguinte código:

Private Sub btnInclui_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnInclui.Click
 

'define a posicao atual do currencyManager

mMarcador = AlunosCManager.Position


'define o estado no modo inclusão

Call definirEstado("Incluir")


'inclui um novo registro no currenymanager

AlunosCManager.AddNew()


'define as propriedades

rdoMasculino.Checked = True : lblSexo.Text = "M"

rdoPrimeiro.Checked = True : lblGrau.Text = "1"

picItem.Image = Nothing

lblFoto.Text = ""


End
Sub

Ao iniciar a inclusão obtemos a posição atual do CurrencyManager e atribuímos a variável mMarcador. Fazemos isso para poder retornar a posição atual dos registros se a inclusão for cancelada.

Em seguida definimos o modo como 'Incluir' e incluímos um novo registro no CurrencyManager definindo em seguidas as propriedades padrão para Sexo e Ano e Foto.

Na última parte deste artigo vou mostrar o código dos botões : Imprimir, Deletar, Sair e Carregar Foto.

Aguarde a continuação do artigo em : VB.NET 2008 - Cadastro de Alunos - parte 3

Até lá...


José Carlos Macoratti