Visual Basic em Português

Página pessoal de Jorge Paulino sobre o Visual Basic (VB.NET, ASP.NET, VB6, VBA) e algumas noticias de tecnologia

VB.NET: Utilizando o controlo DataGridView

O controlo DataGridView é um dos controlos mais versáteis, sendo também simples de utilizar, para mostrar informação com base em uma fonte de dados. Possui alguns wizards possibilitando de uma forma simples, ligar a uma base de dados, gerando automaticamente as colunas e linhas.

No entanto, é possível colocar os dados na DataGridView com poucas linhas de código, permitindo-nos mais versatilidade na utilização deste controlo. Mas para além das inúmeras propriedades que este controlo possui, existem algumas tarefas em que o código é obrigatório para que se obtenha o efeito desejado.
 

O objectivo deste artigo é mostrar como colocar informação numa DataGridView, podendo-se alterar os dados (modificar, apagar e inserir) e efectuar algumas personalizações e operação.   

Para começar é necessário criar uma tabela e definir um dos campos com chave primária. Só assim a DataGridView saberá qual é o campo que vai modificar na base de dados. Neste caso será utilizado o SQL Server mas o exemplo também se aplica ao Microsoft Access, alterando apenas para as suas classes.

Imports System.Data.SqlClient

' Declaração de variáveis privadas
Private da As SqlDataAdapter
Private ds As DataSet

' No Form Load vamos colocar a informação para actualizar a DataGridView
Private Sub DataGridViewExample_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load 

    ' Texto de ligação à base de dados
    Dim myConnectionString As String = _ 
   "Data Source=.\SQLEXPRESS;AttachDbFilename='C:\myDatabase.mdf';" & _ 
 
 "Integrated Security=True;User Instance=True"

    ' Cria uma nova ligação à base de dados
    Dim connection As New SqlConnection(myConnectionString)

    ' Cria um novo SqlDataAdapter que servirá para actualizar o DataSet
    Dim SQL As String = "SELECT * FROM myTable"
    da = New SqlDataAdapter(SQL, connection)

    ' Cria um DataSet, ou seja, uma representação em memória da informação
    ds = New DataSet

    ' Coloca a informação da tabela definida no DataSet
    da.Fill(ds, "myTable")

    ' Define que a fonte de dados da DataGridView é a nossa DataSet
    ' criando automáticamente as colunas e linhas de dados
    Me.DataGridView1.DataSource = ds.Tables("myTable")

    ' Limpa a ligação à base de dados. Não é necessário fechar a ligação
    ' porque esta não foi aberta através do comando .Open()
    connection = Nothing

  End Sub

Neste momento a DataGridView já tem dados. Para gravarmos as alterações que efectuarmos, como apagar, modificar e inserir, só necessitamos de efectuar o seguinte (num botão por exemplo):

Private Sub btnGravar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnGravar.Click

    ' Cria automaticamente o comando para permite actualizar a DataSet
    Dim cb As New SqlCommandBuilder(da)

    ' Actualiza na DataSet, e por sua vez na tabela, as alterações efectuadas
    da.Update(ds, "myTable")

End Sub

 E já está! Ou seja, como muito pouco código consegue-se colocar informação na DataGridView e actualizar a informação na base de dados.


Mas vamos agora fazer algumas personalizações, como exemplo, das muitas que são possíveis:
 

Colorir linhas e alterar a Font através de uma pesquisa

Este pequeno exemplo pretende colorir as linhas e alterar a Font onde existe a palavra “Lisboa”. Pode-se também alterar outras propriedades nas linhas da DataGridView


' Inicia um ciclo em todas as linhas
For Each row As DataGridViewRow In Me.DataGridView1.Rows

    ' Caso não seja um nova linha (a última)
    If Not row.IsNewRow Then

        ' Inicia um ciclo em todas as células/colunas da linha actual
        For Each cell As DataGridViewCell In row.Cells

        ' Verifica se a célula, após convertida para maiúscula, tem a palavra 
        ' "LISBOA" e caso seja verdadeiro coloca a cor de fundo, nova Font 
        ‘ e salta para a próxima 
        If cell.Value.ToString.ToUpper.Contains("LISBOA") Then

            With Me.DataGridView1.Rows(row.Index).DefaultCellStyle
                .BackColor = Color.SpringGreen
                .Font = New Font("Verdana", 12)
             End With

             Exit For

        End If

        Next ' Fim do ciclo nas colunas

    End If

Next ' Fim do ciclo nas linhas

 

Alterar alinhamento de texto nas colunas

Este pequeno exemplo pretende alterar o alinhamento do texto nas células e header (cabeçalho) da coluna 1

' Alterações na coluna 1
With Me.DataGridView1.Columns(1)

   ' Altera o alinhamento das células para o centro 
   .DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter

   ' Altera o alinhamento da header para o centro 
   .HeaderCell.Style.Alignment = DataGridViewContentAlignment.MiddleCenter   

End With

   
Seleccionar uma linha de acordo com um número (ID)

Este pequeno exemplo pretende seleccionar uma linha de acordo com um número (ID) utilizando uma função auxiliar que identifica a posição ou índice na DataGridView

' Função que pesquisa na coluna 0 por um id e devolve a posição na lista
Private Function getDataGridViewIndex(ByVal id As Integer) As Integer

    For Each row As DataGridViewRow In Me.DataGridView1.Rows

        If Not row.IsNewRow Then
            If row.Cells(0).Value = id Then
                Return row.Index
            End If
        End If

     Next

     Return 0

End Function

E a utilização:   

Dim result As Integer = getDataGridViewIndex(10)

With Me.DataGridView1   

    ' Define que a selecção será efectuada na linha toda
    .SelectionMode = DataGridViewSelectionMode.FullRowSelect   

     ' Define que a célula/linha actual é a da pesquisa
    .CurrentCell = DataGridView1.Rows(result).Cells(0)

     ' Define que a primeira linha a aparecer visível no topo da
    '  DataGridView é a encontrada  (caso a lista seja grande)
    .FirstDisplayedScrollingRowIndex = result   

 End With

 

Em suma, o controlo DataGridView é bastante simples de utilizar e permite diversas personalizações o que facilita bastante o programador/utilizador. É o controlo ideal para visualizar e alterar informação na base de dados sobre a forma de grelha.

   

PS: Como sempre, qualquer dúvida, comentário ou correcção ao artigo é sempre bem vinda!

48 comentários:

Anónimo disse...

Olha que o Insert e o Delete nao funcionam. Nao basta substituir o Update por Insert ou Delete. Como é que se faz? Abraço e thanks pelo tutorial que ta muito fixe

jpaulino disse...

Olá,

Não é necessário substituir o Update por Insert ou Delete. O Update faz isso, ou seja, actualiza as alterações que foram feitas na DataGridView, quer seja uma alteração, eliminação ou inserção.

Guilherme disse...

nossa, muito Obrigado,

me ajudou muito

:)

Anónimo disse...

Ola

gostava de saber, como posso declarar uma variável para limitar as linhas que me aparecem

por ex:

Dim SQL As String = "SELECT campo FROM tabela WHERE variavel=@variavel"
o.que.queria.saber("@variavel", variavel.Text)

Obrigado

jpaulino disse...

Olá,

Neste caso, como é um SqlDataAdapter, podes fazer da seguinte forma:

da = New SqlDataAdapter(SQL, connection)
da.SelectCommand.Parameters.Add("@variavel", SqlDbType.VarChar).Value = variavel.Text

Anónimo disse...

Funcionou na perfeição!

Obrigado ;)

Anónimo disse...

Como faço para mesclar 2 tabelas.
ex:
TAB 1: ID = 1 Nome = Flor
TAB 2: ID = 1 COR= Rosa

apresentar assim no grid:
1 | Flor | Rosa

e se eu alterar a cor, salvar no banco de dados a alteração de rosa para azul..

procurei na net e nao to achando.
fico aguardo, obrigado.
mamonalta@hotmail.com

Danillo Leite disse...

Como faço para mesclar 2 tabelas no Datagrid.
ex:
TAB 1: ID = 1 Nome = Flor
TAB 2: ID = 1 COR= Rosa

apresentar assim no grid:
1 | Flor | Rosa

Se eu realizar alguma alteração na cor, salvar no banco de dados a alteração ex. de rosa para azul..

estou procurando na net e nao to achando.
Não necessarimente as tabelas estão relacionadas.
fico aguardo, obrigado.

jpaulino disse...

Olá Danillo,

Não entendi bem o que pretende fazer. É ter duas colunas com duas informações diferentes e gravar o conjunto das duas na base de dados ?

Isso depende de muita coisa: se a datagridview não estiver vinculada à base de dados é relativamente simples, se estiver crie um campo auxiliar escondido onde altera os dados após alteração das células. Ao gravar, grava correctamente.

Mas esclarece melhor para vbtuga (at) gmail (dot) com

Abraço

João Henriques disse...

Olá,

Pretendo criar uma data grid para inserir, alterar e eliminar registos com o mysql.
Está tudo bem, até que quero que uma das colunas seja uma combobox, podendo assim seleccionar um "status" para o registo que estou a trabalhar.

Como poderei fazer isso?

Cumprimentos

jpaulino disse...
Este comentário foi removido pelo autor.
jpaulino disse...

Olá João,

Podes inserir coluna do tipo DataGridViewComboboxColumn depois de carregares os dados, com o DisplayMember e ValueMember. Quando a a combo é alterada, alteras o respectivo campo (que deve estar escondido) com o valor da selecção.

Não sei se fui claro, mas podes colocar a questão, mostrando código, no fórum onde sou moderador.

João Henriques disse...

Então o que me está a aconselhar é criar as colunas que pretendo na DataGridView e preenche-las com os dados da tabela?!
Também já tentei essa solução mas não consegui preencher, algum tópico onde eu possa ver código semelhante para tirar uma ideia do que tenho de fazer?!

jpaulino disse...

Podes colocar o que já tentaste em portugal-a-programar.org ?

GR disse...

Antes de mais parabens pelo post, acredita que é muito util para novos iniciantes de linguagens de programação como eu que estou a estudar esta linguagem.

Eu estou a estagiar e pediram-me ajuda para fazer um programa de suport para aceder e actualizar uma base de dados em access, eu ja liguei a datagridview a uma base de dados mas eu nao consigo actulizar os dados, ou seja eu tenho as opções de "enable adding, editing e delete" seleccionadas mas quando fecho o programa ela nao aletera a base de dados, será que me podes ajudar ?

Pedia alguma brevidade se fore possivel :$

Abraço

Danillo Leite disse...

GR entre em contato comigo por www.danilloleite.com

eu te auxilio com o db e o datagrid
abraços
Danillo Leite

GR disse...

Obrigado Danillo, fico a espera :D

Luis Silva disse...

Ola eu na minha gridview tenho um campo de data e queria realizar um teste e ver se faltassem dois dias para atingir essa data pintar essa linha como posso fazer?

jpaulino disse...

Olá Luís,

Já tens alguma coisa feita ? Sem mostrares informação é dificil ajudar-te.

Luis Silva disse...

Entretanto coloquei a minha duvida no P@P la tenho o que tenho feito

http://www.portugal-a-programar.org/forum/index.php/topic,39013.0.html

Ana disse...

Olá amigos!

" Só assim a DataGridView saberá qual é o campo que vai modificar na base de dados. Neste caso será utilizado o SQL Server mas o exemplo também se aplica ao Microsoft Access, alterando apenas para as suas classes "

Já tentei alterar as classes para o access mas tenho sempre um erro.
Já vi exemplos noutros websites mas são pouco esclarecedores...
Alguem me podia indicar como usar este exemplo com as classes para access? obrigado desde já!

Ana Freitas

Danillo Leite disse...

Ana,

Entra no meu blog, www.danilloleite.com

me passa seu email que eu lhe envio um exemplo de datagridview com acess funcionando.

T+

Ana Freitas disse...

Danilo, tentei deixar o meu e-mail no seu blog na página dos contactos mas não estava a funcionar por isso fiz um reply a um post seu.

De qualquer modo fica aqui também o meu e-mail anafreitas1980@hotmail.com

Obrigado pela ajuda! :)

Ana Freitas disse...

YEHHH..já consegui gravar na tabela access! Obg jpaulino pelo código aqui disponibilizado e sua explicação.


Danillo,

Obrigado pela disponibilidade, mas pode-me enviar o seu exemplo na mesma para poder comparar...

Agora vou tentar a validação de dados introduzidos... :)

jpaulino disse...

Olá,

Pesso desculpa pelo atraso na resposta, mas ainda bem que já está a funcionar!

E ainda bem que o exemplo ajudou :)

Ana Freitas disse...

Posso chatear mais um pouco?

Neste momento tento que ao clicar no botão que grava os dados no access o cursor se mova para a última linha em branco do datagrid para que o utilizador possa inserir novos dados.

Ja o consigo fazer mover através do código

If DataGridView1.CurrentRow.Index < DataGridView1.Rows.Count Then



rc = DataGridView1.Rows.Count - 1


DataGridView1.CurrentCell = DataGridView1.Item(1, rc)

Mas não fico em modo de edição com o cursor a piscar para inserir novos dados.

Já tentei alguns comandos mas sem sucesso...

alguma ideia do que devo usar?

Obrigado..

Se não devo postar este tipo de dúvidas aqui peço desculpa!

jpaulino disse...

Olá,

Poder ate podes, mas num fórum é mais indicado e tem mais visibilidade.

Coloca aqui: http://www.portugal-a-programar.org/forum/index.php/board,201.0.html

Ana Freitas disse...

Ok, obrigado jpaulino, ´e o que irei fazer.

Ana Freitas disse...

jpaulino, continuo com o mesmo problema que apresentei no forum, ou seja ao carregar 2 x no botão actualizar tenho um erro...

Estou a rever o teu artigo novamente, e agora fiquei confusa com o

Dim cb As New SqlCommandBuilder(da)

o cb é usado onde e para quê? a única referencia ao cb é na linha que colei em cima?

Obrigado.

Ana Freitas disse...

criei um projecto novo de raiz com o mesmo código e o erro desapareceu...bizarro!
:)

jpaulino disse...

Olá,

O SqlCommandBuilder cria automáticamente os comandos T-SQL, mas é estranho depois de apagar e criar um novo tenha funcionado.

O que interessa é que está a funcionar!

Junin disse...

Olá Gente, eu tou precisando de uma ajuda no visual basic 2008 !

é que qero colokar um html lah , tipo, qem sabe o que é loader de habbo...ai eu quero colocar um loader de habbo lah, como faço ?
e também quero colokar um contador de visitas, pra colokar isso tem qe ser em html é claro, mais o problema é aonde eu coloko pra htmo !!
Mim ajudem por favor . Contatos ~>lindembergue.junior@hotmail.com

Jorge Paulino disse...

Olá Junin!

Coloque a questão aqui e com mais detalhe/com melhor explicação.

jorgerosa disse...

OBRIGADO!!! Valeu ouro para mim, não encontrei nada de jeito, na web, para procurar e seleccionar uma row por id. Mas eu uso C#, por isso aqui fica a versão que adaptei:

// #1) Função que pesquisa na coluna 0 por um id e devolve a posição na lista:
private int getDataGridViewIndex(int id)
{
foreach (DataGridViewRow roo in dataGridView1.Rows)
{
if (!roo.IsNewRow)
{
int cellContains = Convert.ToInt32(roo.Cells[0].Value);
if (cellContains == id)
{
return roo.Index;
}
}
}
return 0;
}



// #2) Função que pesquisa na coluna 0 por um id e devolve a posição na lista:
private void actualizarMarcados()
{
int result = getDataGridViewIndex(4);
// Define que a célula/linha actual é a da pesquisa
// dataGridView1.CurrentCell = dataGridView1.Rows[result].Cells[0];
dataGridView1.Rows[result].DefaultCellStyle.BackColor = Color.LightGreen;
// Define que a primeira linha a aparecer visível no topo da DataGridView é a encontrada (caso a lista seja grande)
// dataGridView1.FirstDisplayedScrollingRowIndex = result;
textBoxDEBUG.Text = result.ToString();
}

Jorge Paulino disse...

Ainda bem que ajudou jorgerosa! :)

Anónimo disse...

Por favor, gostaria muito da sua ajuda. Eu tenho um datagridview, onde nele há uma coluna de chekbox. Eu trago os dados de uma tabela e coloco eles nesse datagridview, até aí tudo bem. POrém eu não consigo marcar a coluna checkbox (do datagridview) de acordo com o registro retornado da base (check ou não chek). Por favor, me ajude, se possível, coloque o código, a minha aplicação é vb. net em windows form. Abraço.

Jorge Paulino disse...

Olá,

Mas se o campo na base de dados estiver definido como True/False (Access) ou Bit (SQL Server) a informação deverá aparecer correctamente.

Verifique e caso não esteja a funcionar coloque a questão no fórum Portugal-a-Programar

Anónimo disse...

Olá, tenho um datagridview feito no visual basic 2008. fiz normalmente criando o banco de dados, depois o dataset e arrastei a tabela para o form, criando o datagrid. Em baixo aparece : servicodataset, servicotableadapter, servicobindingsource, tableradaptermanager e servicobindingnavegator. Gravo no datagriview normalmente pelo botao save. Quero agora jogar os dados que adicionei o banco de dados de origem. Nos exemplos acima usar sqlserver. Nao consiguir faze-lo . Preciso de ajuda.
grato

Jorge Paulino disse...

Mas estes artigo mostra como fazer sem ser utilizando os wizards e com isso sendo muito fácil de gravar os dados na base de dados.

Já tentaste desta forma?

Anónimo disse...

Como posso ajustar as colunas da datagridview de modo a preencher totalmente na horizontal? (ficando sem o espaço cinzento)

Anónimo disse...

Como posso criar um uma coluna Autonumber?

obrigado..

Anónimo disse...

ola,Gostaria de por a linha a vermelho num datagridview quando um valor de uma celula fosse maior 10% que o valor de outra celula na mesma linha

Obrigado

Pela ajuda

Jorge Paulino disse...

Coloque a sua questão no fórum da comunidade portugal-a-programar (com mais detalhes e mostrando o código que já tem) ;)

Cumprimentos,
Jorge Paulino

Anónimo disse...

Ola Pessoal tenho o seguinte codigo
mas quando a query variavel SQL tem where nao carrega a datagrid
Dim connectionString As String = ("Data Source=MKK-PC\DATASERVER;Database=Gest_Doc; Integrated Security=SSPI;")
Dim sql As String = "SELECT * FROM vwNotificacao where (Para_Quem='" & My.User.Name & "') AND (Sit_Mens= 1 )"
Dim connection As New SqlConnection(connectionString)
connection.Open()
Dim sCommand As SqlCommand
Dim sAdapter As SqlDataAdapter
Dim sBuilder As SqlCommandBuilder
Dim sDs As DataSet
Dim sTable As New DataTable

sCommand = New SqlCommand(sql, connection)
sAdapter = New SqlDataAdapter(sCommand)
sBuilder = New SqlCommandBuilder(sAdapter)
sDs = New DataSet()
sAdapter.Fill(sDs, "vwNotificacao")
sTable = sDs.Tables("vwNotificacao")
connection.Close()
GridNotificacao.DataSource = sDs.Tables("vwNotificacao")
GridNotificacao.ReadOnly = True

Jorge Paulino disse...

Olá,

Deixe a sua questão aqui

Cumprimentos,
Jorge Paulino

Anónimo disse...

muito boa suas dicas
valeu :)

reinaldo rojo disse...

Pode me ajudar?
Se no datagridview as linhas fosse arquivos de imagem e eu clicasse em alguma delas, qualquer uma, que código eu poderia usar pra abrir a imagem no visualizador de imagens do windows?
Ah! uso o vb 2010 express
Obrigado!

Anacleto Vecas disse...

Para bens pela exlente materia.

Infelizmente a minha datagridview não ta mudar a cor, não sei porque

Mensagens Recentes



Microsoft Office Especialist

Membro da Comunidade
Experts-Exchange


Administ. da Comunidade
Portugal-a-Programar



Twitter

Artigos no CodeProject

Artigos no CodeProject

Subscrever Novidades

Endereço de Email:

Delivered by FeedBurner

Seguidores

Histórico