 VB.NET 2008 - 
Cadastro de Alunos - parte 2
 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:
| PrivateSub 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 alunoCall 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() :
| PrivateSub 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 <> "" ThenTry 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():
| PrivateSub definirEstado(ByVal AppEstado As String) 
 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:
| PrivateSub 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:
| PrivateSub btnSalva_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnSalva.Click 
 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 
 If mEstado = "Incluir" Then AlunosCManager.Position = mMarcadorEnd 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:
| PrivateSub 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