VB .NET
- DataGridView e DataSet - dicas
Eu creio que você já deve saber o que é um DataSet, mas se anda meio esquecido, vou repetir a definição básica sobre o dataset. Vamos lá...
O
objeto DataSet representa uma cópia do banco de dados em memória. ![]()
Se você já se aventurou a criar algum programa para banco de dados usando o Visual Basic já ouviu pelo menos falar no objeto Recordset . Afinal era ele que permitia o acesso , exibição e a manipulação dos dados.(O objeto DataSet veio para substituir com vantagens o objeto recordset e guarda poucas similaridades com o objeto recordset. )
A classe DataSet contém toda a funcionalidade para gerenciar dados armazenados na memória através de um chache de dados desconectado . Abaixo temos sua estrutura:

Podemos ver que o DataSet contém , tabelas , relacionamentos entre tabelas e cada tabela contém um conjunto de linhas e colunas. Perceba que o DataSet esta relacionado com Tabelas ( Tables ) e Relacionamentos ( Relations ) e que as tabelas contidas no DataSet pertence a classe DataTable.
Os dados internos contidos em um DataSet são mantidos no formato XML e a estrutura do DataSet é definida pelo XSD (XML Schema Definition Language) , ou seja , XML e DataSet estão intimamente ligados.
A principal característica do DataSet é totalmente desconectado , você pode usar um DataSet para armazenar dados de um banco de dados e pode também mover os dados de um DataSet para um banco de dados , mas o próprio DataSet não faz conexão alguma com o banco de dados , ele nem mesmo tem um objeto para realizar tal conexão .
A ligação entre o banco de dados e DataSet é feita pelo objeto DataAdapter (Adaptador de dados). Abaixo uma ilustração que procura mostrar a interação entre os objetos ADO.NET e o modelo desconectado com o DataSet.
Com essa introdução espero sua memória tenha sido refrescada, e, neste artigo eu vou mostrar como criar um DataSet manualmente vinculando-o a um DataGridView onde iremos realizar algumas operações básicas.
Nota: Eu vou criar um DataSet não Tipado. Um dataset tipado possui toda a estrutura das tabelas, e permite o acesso às colunas do banco de dados como se fossem propriedades do dataset.
Abra o seu Visual Basic 2008 Express Edition e crie uma nova solução chamada dgvBasico;
Agora a partir da ToolBox , na guia Data , selecione e arraste o componente DataSet no formulário , form1.vb ,criado na solução;
Surgirá a janela Add DataSet, marque a opção Untyped dataset (dataset não tipado) e clique no botão OK;
![]() |
Você verá na base do formulário o objeto DataSet; Selecione-o e na janela de propriedades altere o seu nome para dsMacoratti; (ou algo mais sugestivo);
![]() |
Pronto já temos o nosso dataset não tipado , pois ele não tem nenhuma informação sobre as estruturas que irá conter;
Vamos agora criar uma tabela , para isso selecione a propriedade Tables e clique no botão ao lado;
A janela Tables Collection Editor irá surgir; informe o nome da tabela em TableName(eu dei o nome Macoratti);
Agora temos que criar as colunas da tabela; Na propriedade Columns clique no botão a direita e na janela Columns Collection Editor crie 3 colunas : Codigo, Nome e Nota, conforme a figura abaixo , tomando o cuidado de definir o tipo de dados;

Após encerrar esta etapa teremos o dataset dsMacoratti e a tabela Macoratti contendo os campos codigo, nome e nota;
Inclua então a partir da ToolBox um controle DataGridView no formulário com o nome gdvAlunos e defina as seguintes propriedades :
| O Controle
DataGridView suporta o modelo padrão de vinculação dos formulários
Windows, e, desta forma pode ser vinculado a uma variedade de fonte de
dados. Em muitas circunstâncias você efetuará a vinculação a um componente
BindingSource que irá gerenciar os detalhes da interação com a
fonte de dados.
O componente BindingSource pode representar qualquer fonte de dados em um formulário Windows e dá a você uma grande flexibilidade quando da seleção ou modificação da localização dos seus dados. Podemos fazer a vinculação do BindingSource qualquer um dos seguintes objetos/Interfaces:
- Object - System.Type - IEnumerable - ICollection - IList - IListSource - IBindingList - IBindingListView Resumindo, o componente BindingSource possui duas funções básicas:
|
A seguir na propriedade Columns do Grid clique para editar as colunas e você verá as colunas definidas na tabela;

Definimos a coluna Codigo como chave primária, com isso não vamos permitir a inclusão de dois códigos iguais;
Note que pela figura abaixo poderíamos também ter definido a coluna Codigo como AutoIncrement;

Agora vamos incluir no formulário os seguintes controles:
![]() |
Nosso objetivo é incluir dados no DataGridView a partir do formulário. Então vamos incluir o código abaixo no evento Click do botão de comando Incluir no Grid;
Private Sub btnIncluir_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnIncluir.Click
' Validação
If txtCodigo.Text.Length = 0 Then
MessageBox.Show("Informe o código de identificação", _
"Codigo", MessageBoxButtons.OK, _
MessageBoxIcon.Exclamation)
txtCodigo.Focus()
Exit Sub
End If If txtNome.Text.Length = 0 Then
MessageBox.Show("Informe o nome", _
"Nome", MessageBoxButtons.OK, _
MessageBoxIcon.Exclamation)
txtNome.Focus()
Exit Sub
End If If txtNota.Text.Length = 0 Then
MessageBox.Show("Informe a nota do aluno", _
"Nota", MessageBoxButtons.OK, _
MessageBoxIcon.Exclamation)
txtNome.Focus()
Exit Sub
End If
'//
'Obtem um novo registro do formato correto para a tabela
Dim nova_linha As DataRow = dsMacoratti.Tables(0).NewRow() ' Preenche os valores do registro
nova_linha.ItemArray = New Object() {txtCodigo.Text, txtNome.Text, txtNota.Text} ' inclui o registro na tabela
Try
dsMacoratti.Tables(0).Rows.Add(nova_linha)
Catch ex As Exception
MsgBox(" erro: " & ex.Message)
End Try 'limpa os TextBox
txtCodigo.Clear()
txtNome.Clear()
txtNota.Clear() 'poe o foco no txtCodigo
txtCodigo.Focus()
mudaCorCelula()End Sub |
Com este código incluímos os valores digitados no DataGridView;
Agora vamos um pouco além implementando alguns recursos interessantes no DataGridView:
1- Destacando o cabeçalho de uma coluna com uma cor diferente;
Para isso vamos usar o evento Load do formulário e definir um estilo para a célula do DataGridView de cor amarela;
Private Sub frmGDV_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Dim estilo_cabecalho As New DataGridViewCellStyle 'define a cor do cabeçalho e aplica
estilo_cabecalho.BackColor = Color.Yellow
gdvAlunos.Columns(2).HeaderCell.Style = estilo_cabecalho ' desabilita o estilo visual do cabecalho
gdvAlunos.EnableHeadersVisualStyles = False
End Sub |
O efeito pode ser visto na figura abaixo ao executar o projeto:

2- Colorindo uma célula com base em um critério
Vamos criar uma rotina chamada mudaCorCelula() para alterar a cor da célula Nota quando a nota for menor que 6. (A rotina já esta sendo chamada após a inclusão de valores no Grid;)
Private Sub mudaCorCelula() ' colore as notas abaixo de 6 de cor vermelha fundo branco
Dim estilo_nota As New DataGridViewCellStyle()
estilo_nota.BackColor = Color.Red
estilo_nota.ForeColor = Color.White 'percorre as linhas da tabela e verifica se o criterio foi atendido
'alterando definindo o estilo do item no grid
For r As Integer = 0 To dsMacoratti.Tables(0).Rows.Count - 1
If dsMacoratti.Tables(0).Rows(r).Item("Nota") < 6 Then
gdvAlunos.Item(2, r).Style = estilo_nota
End If
Next r
End Sub
|
Executando o projeto e incluindo alguns dados iremos obter:

3- Totalizando os valores de uma determinada coluna
Vamos calcular o total da coluna Nota e exibir o valor em controle label chamado lblTotal colocado bem abaixo desta coluna no formulário.
Para fazer isso usamos o método Compute do objeto DataTable, para somar as notas. Este método calcula o valor de uma expressão na linha atual permitindo usar um filtro;
Sintaxe:
Public Function Compute (expression As String, filter As String ) As Object
Nota: A expressão requer uma função agregada. Ex: Count(Quantidade)
Para o nosso caso podemos usar o seguinte código:
Private Sub btnCalcular_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnCalcular.Click gdvAlunos.DataSource = dsMacoratti Dim sumTotal As String = dsMacoratti.Tables(0).Compute("SUM(nota)", String.Empty).ToString
lblTotal.Text = "TOTAL :" & sumTotal
End Sub |
Executando o projeto , após incluir alguns valores e clicar no botão: Calcular total iremos obter:

Para calcular o total para Codigo maior que o valor 1 fazemos assim:
Dim
somaTotal As String = dsMacoratti.Tables(0).Compute("SUM(nota)", "Codigo > 1").ToStringNota: podemos usar também o formato: dsMacoratti.Tables(0).Compute("Sum(Nota)", "Nome like 'Jos'").ToString
Para finalizar ire mostrar algumas das validações que usei neste exemplo para torná-lo mais robusto:
4 - Permitir somente valores numéricos
Usamos o evento KeyPress do controle TextBox e incluímos o seguinte código para permitir somente valores numéricos e o backspace;
|
Private Sub txtNota_KeyPress(ByVal
sender As System.Object, ByVal e As
System.Windows.Forms.KeyPressEventArgs) Handles
txtNota.KeyPress
'so numeros e backspace If Char.IsLetter(e.KeyChar) Then e.Handled = True End If End Sub
|
5 - Permitir somente valores alfanuméricos
Usamos o evento KeyPress do controle TextBox e incluímos o seguinte código para permitir somente valores alfanuméricos;
|
Private Sub txtNome_KeyPress(ByVal sender As System.Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles txtNome.KeyPress'so letras e backspace If Char.IsNumber(e.KeyChar) Then e.Handled = True End If End Sub |
Obs: Se você definir a propriedade CharacterCasing do TextBox como igual a Upper todas as letras digitadas sairão em caixa alta;
Com isso espero que as dicas e os conceitos aqui expostos te ajudem em sua empreitada de programador.
Pegue o projeto completo aqui:
dgvBasico.zip
Até mais ver...![]()
referências:
José Carlos Macoratti