Sie sind auf Seite 1von 24

VB.

NET 2008 - Cadastro de Alunos - parte 1


Eu j publiquei diversos artigos/tutoriais mostrando como realizar as operaes bsicas de manuteno de dados: inclui, excluir, alterar, exibir, navegar e imprimir no Visual Basic .NET, mas parece que no fui suficientemente didtico e claro para que as dvidas dos iniciantes fossem esclarecidas pois continuo a receber e-mails solicitando exemplos relacionados ao assunto. O que fazer ? Bem, vou tentar mais uma vez mostrar como voc pode usar o Visual Basic 2008 Express Edition para acessar um banco de dados e realizar as principais operaes de manuteno de dados. O exemplo deste artigo no vai usar os assistentes do VB 2008 pois eu j mostrei como fazer isso no artigo : VB .NET 2008 - Aplicao completa com acesso a dados ; este artigo vai mostrar como voc pode fazer isso via cdigo sem a ajuda dos assistentes. Para tornar a apresentao mais fcil vamos dividir em etapas as tarefas que iremos realizar neste tutorial: 1. 2. 3. 4. 5. 6. Criar o banco de dados e a tabela; Definir a interface com o usurio; Definir a conexo com o banco de dados; Definir a carga dos dados; Definir a navegao pelos registros; Definir as operaes de manuteno de dados;

Vou criar uma pequena aplicao para cadastrar alunos usando o banco de dados Microsoft Access. O banco de dados Alunos.mdb ir conter uma tabela chamada Alunos que tem a seguinte estrutura:

Obs: Eu escolhi criar uma estrutura bem simples para no complicar o tutorial. Alm disso , nesta primeira etapa eu no vou utilizar camadas pois tutorial para iniciantes.

Criando o banco de dados e as tabelas


A primeira coisa a fazer criar o banco de dados e a tabela, e, voc pode fazer isso de diversas maneiras, para saber mais veja os meus artigos:
y y y

Criar banco de dados via Cdigo - Access , SQL Server Criando banco de dados e tabelas com o Access Tabelas: Trabalhando com tabelas

Nota: No VB5/VB6 tambm podamos criar banco de dados Access usando o VISDATA como Add-In no IDE do VB. Lembra ? Para lembrar leia o artigo :
y y SQL revisitado- Conceitos bsicos sobre SQL com exemplos prticos no Visdata. Criando um Banco de dados com o VisData,

Para saber como criar banco de dados usando o Microsoft Access ou o SQL Server 2000 leia os artigos: y y y Criando banco de dados no SQL Server 2000 Criando banco de dados e tabelas com o Access Criando Banco de Dados e Tabelas.

Para criar via cdigo leia o artigo: Criando seus arquivos - Veja como criar seu banco de dados e suas tabelas no Visual Basic usando o DAO.

Definindo a interface com o usurio

Com o banco de dados e a tabela criada j podemos definir a interface com o usurio. Nossa aplicao ter apenas um nico formulrio chamado Alunos.vb que usar o seguinte leiaute:

Os controles usados neste formulrio so: - Label - Usadas para identificao; - TextBox - Exibe os campos : nome, endereo e nascimento; - RadioButton - Usados como opes para Sexo e Ano; - Button - botes de comando; - PictureBox - Exibir a imagem do aluno;

Veja a aplicao em execuo exibindo os dados de um usurio com foto;

Agora uma viso mostrando a utilizao do recurso de imprimir um relatrio no modo de visualizao:

Definindo a conexo com o banco de dados


Vamos usar o recurso My Project para armazenar os valores referente a varivel Escola que ir exibir o nome da escola e a varivel Fotos que ir conter o caminho da localizao das fotos dos alunos. Na janela Solution Explorer clique duas vezes sobre My Project e a seguir clique na aba Settings. A seguir defina as variveis conforme mostra a figura abaixo.

Os valores sero armazenados no arquivo App.Config conforme mostra a figura a seguir:

Para obter os valores armazenados basta usar o recurso My.Settings da seguinte forma: - Dim localfotos As String = My.Settings.Fotos - Dim escola as String = My.Settings.Escola.ToString E a string de conexo com o banco de dados como ser definida. Tudo depende de onde o banco de dados estar localizado. Neste exemplo o banco de dados estar na pasta da aplicao em C:\vbn\Cadastro\ , ento podemos definir a string de conexo da seguinte forma:

Dim strConn as String = "Provider=Microsoft.Jet.OLEDB.4.0; Data Source = " + Application.StartupPath + "\..\..\Alunos.mdb")


O StartupPath retorna o caminho qualificado para o diretrio onde o programa inicia a execuo. Como estamos debugando o diretrio de partida o diretrio C:\vbn\Cadastro\bin\Debug , mas o banco de dados esta na pasta da aplicao em C:\vbn\Cadastro\ , por isso retornamos dois nveis: \..\..\Alunos.mdb

Nota: Para saber mais leia meu artigo : VB 2005 - Objeto Application

Os namespaces usados no projeto sero :

Imports System.Data Imports System.Data.OleDb


Eles sero usados para acessar as classes e os provedores para acessar o banco de dados Microsoft Access Alunos.mdb. Quando a aplicao for executada o evento Load do formulrio frmCadastroAlunos ser usado para carregar os dados da tabela e preencher os controles do formulrio com os dados. No prximo artigo irei mostrar o cdigo necessrio para efetuar a conexo com o banco de dados , selecionar os dados da tabela e exibir no formulrio. Veja a continuao do artigo em : VB .NET 2008 - Criando um 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 aplicao Cadastro de Alunos nesta segunda parte vou abordar o cdigo usado para fazer a aplicao funcionar. Como a aplicao possui somente um formulrio chamado Alunos.vb a execuo da aplicao ir iniciar o carregamento deste formulrio pelo evento Load.

Definindo a carga dos dados


Neste evento , eu coloquei o cdigo que ir acessar o banco de dados Alunos.mdb estabelecendo uma conexo , defini um comando SQL para selecionar os registros da tabela Alunos e atravs de um DataAdapter preencher um objeto DataTable com os dados retornados. Como estou efetuando uma conexo com um banco de dados Microsoft Access usei o provedor OleDb. Em seguida efetuei a vinculao dos dados com os controles definidos no formulrio para exibio dos mesmos e para gerenciar a navegao defini um objeto CurrencyManager.

O modelo de objetos Windows Forms suporta dois gerenciadores de vinculao de dados:


y y

PropertyManager - Usado para fazer a vinculao de controles simples no sendo possvel usar com controles ListBox, ComboBox ou DataGridView; CurrencyManager - Usado para fazer a vinculao de controles simples e complexos que suportam a interface IList como : DataView, Array, ArrayList e objetos Collection.

O cdigo 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 conexo 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 formulrio txtNome.DataBindings.Add("Text", AlunosTabela, "Nome") txEndereco.DataBindings.Add("Text", AlunosTabela, "Endereco") 'os controles lblSexo e lblGrau no so visiveis ao usurio 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 exibio dos dados nos controles lable para sexo e grau e exibe a foto do aluno Call ExibirDados() 'define o estado de exibio 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:

y y y y y y y

ADO.NET - Uma viso geral : Objetos Connection


NET Provedores de Dados para conexo

Usando CurrencyManager Desvendando os segredos do Data Binding no VB.NET


VB.NET - Operaes com dados que retornam registros VB.NET - Operaes com dados que no retornam registros. Operaes bsicas com Banco de dados e VB.NET

Agora passemos ao cdigo 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 cdigo usa dois controles Label: lblSexo e lblGrau, que no so visveis em tempo de execuo, para verificar qual o valor obtido da tabela e exibir a informao 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 cdigo verifica se a Label: lblFoto esta vazia ( Poderamos ter usado tambm: If lblFoto.Text IsNot String.Empty Then ) Se for verdadeiro carregamos a imagem no controle picItem, cujo caminho foi definido na varivel localfotos, usando o nome da imagem carregado em lblFoto.text, caso contrrio atribumos um Nothing ao controle. Lembre que ainda estamos executando o cdigo 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 cdigo verificamos se o estado igual a Ver , para visualizar os dados apenas, ou Editar/Incluir usados para edio e incluso de dados. Conforme o caso as propriedades Enabled e ReadOnly dos controles so alteradas e o foco colocado no controle txtNome. Ao terminar a execuo do cdigo ser apresentado o seguinte formulrio:

Definindo a navegao pelos registros


Vejamos a seguir o cdigo associado ao evento Click dos botes de comando que permitem a navegao 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 botes , quando o usurio clicar, o objeto CurrencyManager - AlunosCManager - ir permitir a navegao 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 no mantm o controle sobre o registro atual , no possuindo assim os mtodos MoveFirst, MoveNext , MovePrevious e MoveLast da ADO. Ao invs disso o CurrencyManager usa a propriedade Position para manter o controle sobre os registros; incrementando e decrementando esta propriedade permite a navegao pelos registros da tabela.

Definindo as operaes bsicas de manuteno de dados


Agora vamos as operaes para manuteno dos dados , comeando pela edio realizada quando o usurio clica no boto Editar. Quando isso ocorre a seguinte tela exibida:

Note que os botes de comando para navegao , edio , incluso(Novo) , impresso, deleo e Sair foram desabilitados. Os botes Salvar, Cancelar e Carregar Foto foram habilitados; O acesso para alterar o Sexo e o Ano foram tambm habilitados; Isso permite a alterao dos dados do formulrio com opo para Salvar o Cancelar a operao.

O cdigo associado ao evento Click do boto 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 cdigo apenas chama a rotina definirEstado() passando o parmetro "Editar" para indicar que estamos no estado de edio dos dados. Abaixo temos um exemplo de tela mostrando a edio sendo realizada com alterao da data de nascimento atravs do controle DateTimePicker - dtpNascimento, e da caixa de dilogo OpenFileDialog - dlgAbrir - exibindo uma relao de imagens:

O cdigo para Salvar os dados associado ao evento Click do boto - Salvar - dado a seguir:
Private Sub btnSalva_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnSalva.Click 'verifica o item Endereo If txEndereco.Text.Trim = "" Then MessageBox.Show("Informe o endereo.", "Erro Entrada", MessageBoxButtons.OK, MessageBoxIcon.Information) txEndereco.Focus() Exit Sub End If Dim itemSalvo As String = txEndereco.Text Dim linhaSalva As Integer 'encerra edio do CurrencyManager AlunosCManager.EndCurrentEdit() 'define o modo de exibio ordenado por Nome AlunosTabela.DefaultView.Sort = "Nome" 'obtem o id da linha Salva

linhaSalva = AlunosTabela.DefaultView.Find(itemSalvo) 'atribui a posio da linha em edio ao CurrencyManager AlunosCManager.Position = linhaSalva Call ExibirDados() Call definirEstado("Ver") End Sub

O cdigo verifica se foi informado um valor para o endereo do aluno para prosseguir; em seguida armazena o valor na varivel itemSalvo e encerra a edio do CurrencyManager salvando os dados. Aps definir a ordenao 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 visualizao. O boto Cancelar possui o cdigo 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 cdigo usa o mtodo CancelCurrentEdit() para cancelar a edio desfazendo qualquer alterao e verifica se o estado igual a "Incluir" para atribuir o valor da varivel mMarcador a propriedade Position. Esta varivel a iniciada quando o processo de incluso comea , desta forma podemos voltar a exibir os registros na posio anterior ao incio da operao de incluso. O boto Novo usado para incluir um registro da tabela e tem o seguinte cdigo:
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 incluso 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 incluso obtemos a posio atual do CurrencyManager e atribumos a varivel mMarcador. Fazemos isso para poder retornar a posio atual dos registros se a incluso for cancelada. Em seguida definimos o modo como 'Incluir' e inclumos um novo registro no CurrencyManager definindo em seguidas as propriedades padro para Sexo e Ano e Foto. Na ltima parte deste artigo vou mostrar o cdigo dos botes : Imprimir, Deletar, Sair e Carregar Foto.

VB.NET 2008 - Cadastro de Alunos - parte 3


Na segunda parte deste artigo definimos a carga de dados, a navegao pelos registros e as operaes bsicas de manuteno de dados. Neste ltimo artigo veremos o cdigo dos botes : Imprimir, Deletar, Sair e Carregar Foto. Lembrando que a aplicao possui somente um formulrio chamado Alunos.vb e que estamos usando o Visual Basic 2008 Express Edition.

Definindo a impresso
A seguir eu vou mostrar o cdigo usado para imprimir os dados , inclusive a foto do cadastro de alunos. Em meu artigo Impresso e Visualizao. O que h de novo ? eu apresento o namespace System.Drawing.Printing e a classe PrintDocument e o componente PrintPreviewDialog. Eles so os pilares da impresso no VB .NET.

No artigo Criando um editor de textos no VB .NET eu mostro como voc pode criar um editor de textos com recursos de impresso usando as classes e em meu artigo Imprimindo no VB 2005 a eu volto ao assunto descrevendo o processo usado para imprimir no VB. Ento repetindo o que eu j disse: Para imprimir no VB.NET temos a seqncia que deve ser seguida: 1- Primeiro, voc deve instanciar um objeto PrintDocument 2- A seguir voc tem que criar uma instncia de um objeto PrintDialog e definir a referncia para o objeto PrintDocument:
Dim doc As PrintDocument = New PrintDocument Dim printer As PrintDialog = New PrintDialog printer.Document = doc

3- Em seguida voc deve mostrar a caixa de dilogo onde o usurio pode selecionar a impressora e suas propriedades: printer.ShowDialog() 4- Agora voc precisa subscrever o evento PrintDocument.PringPage o qual ser disparado para cada nova pgina: AddHandler doc.PrintPage, AddressOf PrintPageHandler 5- Chamar o mtodo Print; 6- Implementar o tratamento de evento para o evento PrintDocument.PrintPage onde nos desejamos imprimir o texto. Ento inclua no formulrio o componente PrintPreviewDialog alterando o seu nome para dlgVisualiza. Agora no evento Click do boto Imprimir inclua o cdigo:
Private Sub btnImprimir_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnImprimir.Click 'Declara o printdocument Dim AlunosDocument As Drawing.Printing.PrintDocument 'Cria o documento e da nome ao mesmo AlunosDocument = New Drawing.Printing.PrintDocument() AlunosDocument.DocumentName = "Alunos" 'incluir o manipulador de eventos

AddHandler AlunosDocument.PrintPage, AddressOf Me.ImprimirAlunos


'Imprime no modo de visualizao Dim SavedPosition As Integer = AlunosCManager.Position dlgVisualiza.Document = AlunosDocument dlgVisualiza.ShowDialog() 'libera o documento apos imprimir AlunosDocument.Dispose() AlunosCManager.Position = SavedPosition End Sub

Agora temos que codificar a rotina ImprimirAlunos que ir realizar o trabalho de impresso. O cdigo o seguinte:
Private Sub ImprimirAlunos(ByVal sender As Object, ByVal e As Drawing.Printing.PrintPageEventArgs) 'desenha a bordar Dim MyPen As Pen = New Pen(Color.Black, 3) e.Graphics.DrawRectangle(MyPen, e.MarginBounds.X, e.MarginBounds.Y, 450, 480) Dim MyFont As Font = New Font("Arial", 12, FontStyle.Bold) Dim S As String = My.Settings.Escola.ToString Dim SSize As SizeF = e.Graphics.MeasureString(S, MyFont) e.Graphics.DrawString(S, MyFont, Brushes.Black, e.MarginBounds.X + CInt(0.5 * (250 - SSize.Width)), e.MarginBounds.Y + 15) 'posiciona a imagem e.Graphics.DrawImage(picItem.Image, e.MarginBounds.X + 25, e.MarginBounds.Y + 50, 400, 300) e.HasMorePages = False 'define os campos a serem impressos MyFont = New Font("Arial", 14) Dim Y As Integer = e.MarginBounds.Y + 400 S = txtNome.Text + " " + txEndereco.Text SSize = e.Graphics.MeasureString(S, MyFont) e.Graphics.DrawString(S, MyFont, Brushes.Black, e.MarginBounds.X + CInt(0.5 * (300 - SSize.Width)), Y) Y += CInt(MyFont.GetHeight(e.Graphics)) 'S = txtLastName.Text 'SSize = e.Graphics.MeasureString(S, MyFont)

' e.Graphics.DrawString(S, MyFont, Brushes.Black, e.MarginBounds.X + CInt(0.5 * (300 - SSize.Width)), Y) 'Y += CInt(MyFont.GetHeight(e.Graphics)) S = lblGrau.Text + "o Grau " SSize = e.Graphics.MeasureString(S, MyFont) e.Graphics.DrawString(S, MyFont, Brushes.Black, e.MarginBounds.X + CInt(0.5 * (300 - SSize.Width)), Y) End Sub

Ao clicar no boto Imprimir o resultado obtido ser o seguinte:

Usando o recurso do Zoom para aumentar a imagem voc pode obter:

Excluindo dados
O cdigo do boto Deletar exibido a seguir. Aps confirmao usamos o mtodo RemoveAt do CurrencyManager e em seguida chamamos a rotina ExibirDados().
Private Sub btnDeletar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnDeletar.Click If MessageBox.Show("Confirma e excluso deste registro ? ", "Deletar", MessageBoxButtons.YesNo, MessageBoxIcon.Question, MessageBoxDefaultButton.Button2) = Windows.Forms.DialogResult.Yes Then AlunosCManager.RemoveAt(AlunosCManager.Position) Call ExibirDados()

End If Call definirEstado("Ver") End Sub

Carregando a foto
Quando clica no boto Carregar Foto aberto uma janela de dilogo Abrir para que um arquivo de foto seja selecionado. Aps selecionar uma imagem clique no boto Salvar. O cdigo que faz tudo isso dado abaixo:
Private Sub btnCarregaFoto_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnCarregaFoto.Click Dim nomeImagem As String dlgAbrir.InitialDirectory = localfotos Try If dlgAbrir.ShowDialog = Windows.Forms.DialogResult.OK Then 'obtem o caminho e nome da imagem nomeImagem = dlgAbrir.FileName 'obtem a posio da / na string Dim posicaoBarra As Integer = nomeImagem.LastIndexOf("\") 'extrai somente o nome do arquivo da string e atribui a lblFoto lblFoto.Text = nomeImagem.Substring(posicaoBarra + 1) 'chama a rotina para exibir a foto Call ExibirFoto() End If Catch ex As Exception MessageBox.Show(ex.Message, "Erro ao abrir Foto.", MessageBoxButtons.OK, MessageBoxIcon.Error) End Try End Sub

Para encerrar o programa temos o cdigo abaixo associado ao evento Click do boto Sair:
Private Sub btnSair_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnSair.Click If (MessageBox.Show("Deseja sair ?", "Sair", MessageBoxButtons.YesNo) = Windows.Forms.DialogResult.Yes) Then Me.Close() End If

End Sub

Com isso terminei a apresentao da aplicao Cadastro de Alunos usando todos os recursos de manuteno de dados e navegao pelos registros. Tudo isso com exibio de imagens e impresso tambm. Para encerrar com chave de ouro o ltimo captulo da srie ir mostrar como gerar o pacote para instalao.