DBGrid - Revisitado


Atendendo a diversos pedidos retorno ao assunto DBGrid .(Leia também o artigo  DBGrid ). O DBGrid é um dos controles que podemos usar para exibir os dados em formato de uma lista , com linhas e colunas, como uma planilha. Para não ser repetitivo procurarei abordar aspectos ainda não tratados relacionados com este controle.

Cabe citar que existem vários controles desenvolvidos por terceiros que possuem mais recursos que o DBGrid. O True DBGrid Pro além de ser totalmente compatível com o DBGrid possui muitos recursos que este não possui. 

Na versão 6.0 do VB a versão do DBGrid não é mais instalada automaticamente durante a instalação. Para instalar o controle você deve procurar no CD do Visual Basic - disco 1 - na pasta \COMMON\TOOLS\VB\CONTROLS, e copiar os arquivos DBGRID32.OCX, DBGRID32.DEP E DGRID.REG para o diretório c:\windows\system e clicar duas vezes sobre o arquivo DBGRID.REG para registrar o controle. Na versão 6.0 o VB possui o controle DataGrid que possui o tamanho de 252 KB enquanto o a OCX do DBGrid possui uns 500 KB.

Vamos ao que interessa....

O modelo de objetos do DBGrid

O controle DBGrid possui vários objetos usados para manipular a grade. Vejamos o seu modelo:

Usando DBGrid para exibir os dados de um BD

Para usar o Controle você deve selecionar  no seu projeto no VB a opção - Project Components no menu Project , e a seguir marcar na caixa de diálogo que surge , na lista de componentes , o componente Microsoft Data Bound Grid Control.

Para Exibir dados no seu controle DBGrid , insira um controle de Dados DAO e defina as propriedades RecordSource e DatabaseName do controle de dados para a fonte de dados que quer exibir . A seguir insira o DBGrid no seu formulário e defina a propriedade DataSource do controle DBGrid para o nome do controle de dados e Pronto. 

Agora basta executar sua aplicação e os dados serão exibidos no Grid.

OBS: O DBGrid não possui a propriedade DataField.

modelo de objetos DBGrid quadro 1

Para exibir um exemplo prático vamos usar o banco de dados Biblio.mdb e exibir os registros da tabela Publishers no grid. Abaixo a aplicação das regras do quadro 1 , e a exibição dos dados no Grid.

Tudo Certo !!! Bem , quase.... Nem tudo na vida e tão simples. Ao executar o projeto proposto no quadro 1 você vai perceber que as colunas dos registros são exibidas aleatoriamente e que os dados são apenas leitura... Ai começam a surgir as dúvidas ... Vamos procurar responder as mais usuais.

Como inserir e selecionar as colunas que eu quero exibir ?

Inserindo Colunas

A primeira coisa a fazer e ver quantas colunas você vai querer exibir. O DBGrid exibe por padrão duas colunas ( Column0 e Column1). Se você pretende exibir mais de duas colunas vai ter que inserir novas colunas. Para incluir novas colunas faça o seguinte:

Selecionando Colunas

  1. No seu projeto VB clique no controle DBGrid com o botão direito do mouse e selecione a opção Properties... da janela suspensa
  2. Na caixa de diálogo Properties... clique na ficha Columns e a seguir clique na combo Column. Você verá cada coluna identificada como - Column0 , Column1, ...
  3. Atribua a cada coluna a propriedade DataField de cada campo da fonte de dados que quer exibir e defina a propriedade Caption que irá identificar esta coluna no grid

Assim para o nosso exemplo , para exibir somente três colunas no Grid para os campos : PubID , Name e Address teremos:

As colunas não saem ajustadas ao tamanho de cada campo , para redimensionar cada coluna faça o seguinte:

 Melhorou , não é mesmo !!!

Voce pode fazer isto via código usando as propriedades:  Width para definir a largura de cada coluna , a propriedade Alignment para definir o alinhamento dos dados na coluna e a propriedade caption para definir o nome da coluna. Assim poderíamos ter usado

dbgrid1.columns(0).Caption="Name"

dbgrid1.columns(0).Width=1000

dgrid1.columns(0).Alignment = dbgCenter ' alinhamento central

 Como incluir , excluir e editar registros no Grid ?

Se você não tomar nenhuma atitude , o DBGrid somente permite alterar os dados exibidos. Você não poderá nem incluir nem excluir registros. Para mudar esta postura você tem que alterar as seguintes propriedades:

  1. AllowAddNew - Indica se podemos incluir novos registros - ( o padrão é True )
  2. AllowDelete - Indica se podemos excluir registros - ( o padrão é False )
  3. AllowUPdate - Indica se podemos atualizar os registros - ( o padrão e True )

Para poder incluir , excluir e editar registros devemos alterar o valor destas propriedades para True. Faça assim:

Pronto nosso projeto já permite alterar , incluir e excluir (Como estamos usando uma tabela que possui relacionamentos , o VB irá reclamar se você tentar excluir um registro). Abaixo temos um exemplo de alteração e inclusão feita diretamente no Grid. ( Atenção !!! Tudo isto somente será possível se a propriedade RecordsetType do data control for definida como Table ou Dynaset

Se você for um garoto(a) e'x'perto deverá esta pensando: " Não dá para fazer uma crítica dos dados digitados diretamente no Grid ? " . Dá. Para fazer isto temos que usar o evento BeforeColUpdate , pois temos que fazer a validação dos dados antes de gravá-los no banco de dados. 

Vamos supor que desejamos permitir somente valores numéricos em uma coluna do grid , pois o campo associado é um campo que deve receber somente valores numéricos ; sendo  que o valor informado não pode ser maior que 10.  Poderemos usar o seguinte código para fazer a validação:

Private Sub DBGrid1_BeforeColUpdate(ByVal ColIndex As Integer, OldValue As Variant,_
 Cancel As Integer)
If ColIndex = 2 Then
    If Not IsNumeric(DBGrid1) Then
        MsgBox "Informe somente valores numéricos", vbCritical
        DBGrid1 = 0
    End If
    If DBGrid1.Columns(2).Value > 10 Then
       MsgBox "Valor informado nao pode ser superior a 10 ! "
       dgbrid1 = 0
    End If
End If
End Sub

Usando Marcadores ( Bookmarks) e selecionando registros

Podemos nos referir a uma linha selecionada atualmente na grade usando a propriedade BooKmark , ela permite que marquemos o local de um certo registro para que possamos voltar depois para o este registro. Sua utilização é bem simples:

Dim marcador As Variant
Private Sub Command1_Click()
  marcador = DBGrid1.Bookmark     ' aqui usamos uma variável para armazenar a posição do registro selecionado
End Sub

Private Sub Command2_Click()
  DBGrid1.Bookmark = marcador    ' aqui retornamos ao registro cuja posição foi marcada anteriormente
 End Sub

Em conjunto com a propriedade Bookmark podemos usar a coleção SelBookmarks para selecionar visivelmente uma ou mais linhas na grade destacando-a para o usuário. Para selecionar uma linha apenas adicionamos o marcador (bookmark) á coleção SelBookmark com o seguinte código:

DBGrid1.SelBookmarks.Add DBGrid1.Bookmark

Como exemplo prático podemos realizar uma busca na base de dados para localizar um registro , e , usando as propriedades acima , selecionar o registro encontrado exibindo-o ao usuário através da seleção da linha da grade. O código para esta façanha pode ser o seguinte:

Private Sub Command4_Click()
Dim codigo As String

codigo = 0
codigo = InputBox("Informe o codigo a localizar ! ", "Localizando via Código", 1)

If codigo = "" Then
    Exit Sub
End If

Data1.Recordset.FindFirst "PubId=" & CLng(codigo)

If Data1.Recordset.NoMatch Then
     MsgBox " Registro não localizado ", vbExclamation
Else
     DBGrid1.SelBookmarks.Add DBGrid1.Bookmark  
'usando a propriedade para selecionar a linha
End If
End Sub

O resultado , após algumas buscas , é o seguinte:

Acho que sem querer acabei repetindo tópicos abordados em outros artigos , fazer o que !!! , bom proveito...


José Carlos Macoratti