VB.NET - Manutenção de dados com DataGrid
O controle DataGrid do VB.NET pode ser usado de muitas formas e em diversas aplicações. Neste artigo vou mostrar como podemos usar o DataGrid para efetuar a manutenção de uma fonte de dados Access (mas podia ser MySql, FirebBird, SQL Server, etc)
Para este exemplo eu criei um banco de dados no Access chamado Empresa.mdb e uma tabela chamada funcionarios cuja estrutura é exibida a seguir:
O objetivo é efetuar a manutenção dos dados dos funcionários exibindo os seus dados em um DataGrid e fornecendo ao usuário as opções de : Incluir, Excluir, e Alterar dados.
Abaixo temos uma visão do formulário da aplicação com os controles usados e a aplicação quando da sua execução exibindo os dados:
|
|
O formulário da aplicação | A aplicação exibindo os dados cadastrados |
Inicie uma nova solução chamada funcionarios no VS.NET do tipo Windows Application usando a linguagem VB.NET.
A seguir inclua no formulário form1.vb os componentes:
DataGrid - DataGrid1
TextBox - TextBox1, TextBox2, TextBox3, TextBox4
Button - cmdInclui, edita, salva e deleta
Agora vamos dar uma olhada no código do projeto e na sua estrutura atual. Ao espiar o código você veria o seguinte :
O código ao lado exibe o
recurso de criarmos regiões identificadas onde o código fica agrupado,
tornando assim , mais fácil manter e localizar um trecho de código
específico. Para ver o código sob a região basta clicar no sinal de + .
|
A primeira coisa a fazer é importar o namespace System.Data.OleDb , pois vamos efetuar o acesso em uma base de dados Access.
Vejamos a seguir o restando do código por região:
1-) Na region Declarations temos :
Dim
cn As New
OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=Empresa.mdb")
Dim da As New OleDbDataAdapter Dim ds As New DataSet Dim dt As DataTable Dim rc As Integer Dim r As DataRow |
Apenas estou definindo as variáveis que serão usadas no projeto e a conexão com o banco de dados Empresa.mdb
2-) Código da Region Form Load:
Private Sub Form1_Load(ByVal
sender As System.Object,
ByVal e As System.EventArgs)
Handles MyBase.Load
da = New OleDbDataAdapter("select * from Funcionarios", cn) da.Fill(ds, "Funcionarios") dt = ds.Tables(0) DataGrid1.DataSource = dt formload() Catch ex As Exception MessageBox.Show(ex.Message)
End
Try |
- Atribuímos o título - Controle de Funcionários - ao formulário atual.
- Criamos um DataAdpater - da - , extraindo dados da tabela Funcionarios na conexão cn.
- Preenchemos um DataSet - ds - , e, obtendo a primeira e única tabela (Tables(0)) atribuímos ao DataGrid para exibir os dados.
3-) Na Region DataGrid o código abaixo obtém a linha atual selecionada(rc = DataGrid1.CurrentRowIndex) e a exibe nas caixas de texto.
Private Sub DataGrid1_MouseUp(ByVal
sender As Object,
ByVal e As System.Windows.Forms.MouseEventArgs)
Handles DataGrid1.MouseUp
obtemFuncionario(rc)
TextBox2.ReadOnly = False TextBox3.ReadOnly = False TextBox4.ReadOnly = False edita.Enabled = True deleta.Enabled = True cmdInclui.Text = "Inclui" End Sub |
4-) Na Region TextBoxes temos o seguinte código:
Private Sub TextBox2_KeyPress(ByVal
sender As Object,
ByVal e As System.Windows.Forms.KeyPressEventArgs)
Handles TextBox2.KeyPress
e.Handled = SomenteCaracteres(Asc(e.KeyChar)) End Sub
e.Handled = SomenteNumeros(Asc(e.KeyChar))
End
Sub e.Handled = SomenteCaracteres(Asc(e.KeyChar)) End Sub |
Em cada evento KeyPress dos textboxes : TextBox1 (Nome) , TextBox1 (Salário) , TextBox1 (Setor) estou atribuindo código que faz o seguinte:
a) TextBox2(Nome) : e.Handled = SomenteCaracteres(Asc(e.KeyChar)) - Permite somente a impostação de valores caracteres (de a a z)
b) TextBox3(Salario) : e.Handled = SomenteNumeros(Asc(e.KeyChar)) - Permite somente a impostação de valores numéricos (dígitos de 0 a 9)
a) TextBox4(Setor) : e.Handled = SomenteCaracteres(Asc(e.KeyChar)) - Permite somente a impostação de valores caracteres (de a a z)
5-) Na Region Button temos o código atribuído a cada botão de comando. Vamos mostrar cada um deles:
a-) O botão Inclui também faz as vezes do botão cancela, por isto, eu verifico se o texto do botão acionado é Inclui, e, neste caso é feita a preparação para a inclusão dos dados. O foco vai para o TextBox2 (Nome) e ao TextBox1(Código) é atribuído um número inteiro que corresponde ao número de registros mais um.
Se o texto do botão for - Cancela - a rotina carregaFormulario será chamada. Ela apenas limpa os TextBox e desabilita os botões necessários.
Private Sub cmdInclui_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdInclui.Click
If cmdInclui.Text = "Inclui" Then TextBox2.Focus() TextBox1.Text = Integer.Parse(dt.Rows(dt.Rows.Count - 1).Item(0)) + 1 TextBox1.ReadOnly = True TextBox2.ReadOnly = False TextBox3.ReadOnly = False TextBox4.ReadOnly = False TextBox2.Clear() TextBox3.Clear() TextBox4.Clear()
Me.edita.Enabled = False Me.deleta.Enabled = False Me.salva.Enabled = True Me.cmdInclui.Text = "Cancela"
carregaFormulario() Me.cmdInclui.Text = "Inclui" End If Catch ex As ExceptionMessageBox.Show(ex.Message) End Try End Sub |
b-) O código do botão Deleta exibido abaixo faz o seguinte :
- obtém a linha atual selecionada do DataGrid - Dim dr As DataRow = dt.Rows(DataGrid1.CurrentRowIndex)
- Obtém o nome da linha atual tomando o cuidado de efetuar a conversão para String - Dim nome As String = CType(dr.Item(1), String)
- Solicita a confirmação da exclusão
- Se houver confirmação deverá ser criado um objeto CommandBuilder para que sejam gerados automaticamente os comandos que conciliam as mudanças feitas para o DataSet com o banco de dados associado. Sem isto a operação irá falhar.
- A seguir usamos o método Delete() para marcar a linha para ser removida. A remoção ocorre quando o método AcceptChanges for invocado. (Poderiamos ter usado o método Remove() que remove a linha da coleção de linhas de imediato).
- Aplicamos o método Update() do objeto DataAdapter. Ao fazer isto o DataAdapter examina a propriedade RowState e executa o comando SQL (INSERT,UPDATE,DELETE) requerido para cada linha baseado na ordem dos índices configurados no DataSet.
Private Sub deleta_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles deleta.Click
Dim dr As DataRow = dt.Rows(DataGrid1.CurrentRowIndex) Dim nome As String = CType(dr.Item(1), String)
MsgBox("Operação Cancelada.", MsgBoxStyle.Information, "Cancelada.") Exit Sub End Ifrc = DataGrid1.CurrentRowIndex dt.Rows(rc).Delete()
da.Update(ds, "Funcionarios")
|
c-) O código do botão - Salva - realiza as seguintes tarefas:
- Cria um objeto CommandBuilder para conciliar as alterações feitas no DataSet com o Banco de dados
- obtém o código do funcionário - str = TextBox1.Text
- converte o código para Inteiro - id = Integer.Parse(str)
- Verifica se o código corresponde ao um novo registro e neste caso cria uma nova linha na tabela - r = dt.NewRow
- atribui os valores das caixas de texto ao vetor de linhas e os adiciona na coleção de linhas - dt.Rows.Add(r)
- Invoca o método Update() do objeto DataAdapter. Ao fazer isto o DataAdapter examina a propriedade RowState e executa o comando SQL (INSERT,UPDATE,DELETE) requerido para cada linha baseado na ordem dos índices configurados no DataSet.
- se o código já existir então é feito uma atualização dos dados.
Private Sub salva_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles salva.Click
id = Integer.Parse(str)
r = dt.NewRow r(0) = TextBox1.Text r(1) = TextBox2.Text r(2) = TextBox3.Text r(3) = TextBox4.Text dt.Rows.Add(r)
MessageBox.Show("Inclusão realizada com sucesso.") Me.cmdInclui.Text = "Inclui" Me.cmdInclui.Enabled = True Me.edita.Enabled = True Me.deleta.Enabled = True Me.salva.Enabled = False ElseIf id < dt.Rows.Count + 1 Then
r("nome") = TextBox2.Text r("salario") = TextBox3.Text r("setor") = TextBox4.Text da.Update(ds, "Funcionarios") Me.salva.Enabled = False End If End Sub |
d-) O botão Edita , cujo código esta a seguir, apenas obtém a linha selecionada e habilita e desabilita os botões necessários.
Private Sub edita_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles edita.Click
TextBox2.ReadOnly = False TextBox3.ReadOnly = False TextBox4.ReadOnly = False
End Sub |
A última Region é a Methods que contém as rotinas :
obtemFuncionario() - carrega os dados da linha atual para exibição nas caixas de texto
carregaFormulário() - habilita e desabilita os botões necessários
SomenteNumeros() - que permite somente valores numéricos
SomenteCaracteres() - que permite somente valores alfanuméricos
Public Sub obtemFuncionario(ByVal
i As Integer)
r = dt.Rows(i) TextBox1.Text = r("codigo") TextBox2.Text = r("nome") TextBox3.Text = r("salario") TextBox4.Text = r("setor")
End
Sub Me.TextBox1.ReadOnly = True Me.TextBox2.ReadOnly = True Me.TextBox3.ReadOnly = True Me.TextBox4.ReadOnly = True TextBox1.Clear() TextBox2.Clear() TextBox3.Clear() TextBox4.Clear() Me.cmdInclui.Enabled = True Me.edita.Enabled = False Me.salva.Enabled = False Me.deleta.Enabled = False End Sub
SomenteNumeros = False ElseSomenteNumeros = True End IfEnd Function Public Function SomenteCaracteres(ByVal key As String) As Boolean If (key >= 65 And key <= 90) Or (key >= 97 And key <= 122) Or key = 8 Then SomenteCaracteres = False ElseSomenteCaracteres = True MsgBox("informe somente caracteres alfanuméricos.", MsgBoxStyle.Information, "Não informe números.") End If End Function
|
Para finalizar temos ainda o código que será executado quando o formulário for fechado.
Private Sub Form1_Closing(ByVal
sender As Object,
ByVal e As System.ComponentModel.CancelEventArgs)
Handles MyBase.Closing
If MessageBox.Show("Deseja realmente encerrar a aplicação ? ", "Encerrar", MessageBoxButtons.YesNo, MessageBoxIcon.Stop) = DialogResult.No Then e.Cancel = True End If End Sub |
E chegamos ao fim da nossa saga para manter dados usando um Datagrid via DataSet com ADO.NET.
Creio que não existem dificuldades insuperáveis no código exibido, pelo contrário , ele é muito simples , agora resta a você aprender e refinar pois além de esta não ser a única forma de fazer isto usando ADO.NET com certeza o código pode ser otimizado.
Pegue o projeto completo aqui : manDados.zip
Eu sei
, é apenas VB, but I like it !!!
Veja os
Destaques e novidades do SUPER DVD Visual Basic (sempre atualizado) : clique
e confira !
Quer migrar para o VB .NET ?
Quer aprender C# ??
Quer aprender os conceitos da Programação Orientada a objetos ? Quer aprender o gerar relatórios com o ReportViewer no VS 2013 ? Quer aprender a criar aplicações Web Dinâmicas usando a ASP .NET MVC 5 ? |
Gostou ?
Compartilhe no Facebook
Compartilhe no Twitter
Referências:
Super DVD Vídeo Aulas - Vídeo Aula sobre VB .NET, ASP .NET e C#
VB6 - DataGrid, MSFlexGrid e alguns conceitos básicos. - Macoratti.net
VB .NET - DataGridView - Selecionando e exibindo ... - Macoratti.net