1
2 3 4 5 6 7 8 9 10 11 12
13
14
Visual Basic 2005 Express Edition
15 16 17 18 19 20 21 22 23 24 25
Autor: Alexandro Vieira de Souza
26 27 28 29 30 31 32
33 34 35 36 37 38 39 40 41 42 43 44
• Visual Basic 2005 Express Edition
Iniciando um Projeto – Ambiente VB 2005
Para iniciar um projeto você deve ir no menu superior do VB 2005, clicar em "File" e escolher a opção "New Project", quando clicar, vai aparecer essa tela, então você escolhe a opção "Windows Application", para uma aplicação ao Windows e clica em Ok.
Ambiente de Trabalho – Ambiente VB 2005
45 46 47 48 49 50 51
• 1 – È o formulário onde você vai criar suas aplicações, como adicionar botões, imagens, labels, etc. • 2 – Esse menu são as opções da ToolBox, encontrada no menu 3, que ajuda você á adicionar os botões, labels, imagens e várias outras coisas. • 3 – Menu 2 Superior, é responsável por boa parte do trabalho, que tem as seguintes opções de trabalho :
52 53
-•
New Project – Para você iniciar um novo projeto, como foi mostrado no inicio da aula.
54 55
-•
56 57 58
-• Add New Item – Para você adicionar um novo item, por exemplo : Um novo formulário, um novo banco de dados.
59 60
-•
Save "Arquivo" – Para salvar o projeto que está aberto no momento.
61 62
-•
Save All – Para salvar todos os arquivos que estão abertos nas abas.
63
-•
Cut – Recortar algo no formulário.
64 65
-•
Copy – Para copiar algo do projeto.
66 67
-•
Paste – Para colar algo que foi copiado.
68
-•
Find – Serve para procurar algo no projeto.
Open File – Para abrir algum projeto.
69 70 71
-•
72 73
-•
74 75
-•
Undo – Desfazer algo.
76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104
-•
Redo – Refazer algo.
Coment – Comentário para fora as linhas selecionadas. Uncoment – (Não Conheço)
-•Start Debugging – Para você fazer um teste do projeto, para ver se deu algum debug. -•Break All – Para pausar o teste de projeto. -•Stop Debugging – Para parar o teste de projeto. -•Step Into – Pisar em...(Tradução do Google) -•Step Over – Etapa sobre...(Tradução do Google) -•Step Out – Etapa para fora...(Tradução do Google) -•Solution Explorer – Explora os projetos apresentados. -•Properties Window – Propriedades da Janela. -•Object Browser – Importar algum objeto do browser. -•ToolBox – Caixa de ferramente, para adicionar labels, botões, etc. -•Error List – Mostra a lista dos erros encontrados. • 4 – È o menu superior onde você pode, salvar, abrir, iniciar um novo projeto, etc. • 5 – È tipo o Windows Explorer, com todas as partes do seu projeto dividida. • 6 – Nesse local, são as propriedades do ferramenta utilizada, onde pode mudar, adicionar imagem, mudar fonte, cor das letras, etc. • 7 – Aí são as abas, onde ficam guardadas os projetos abertos ao mesmo tempo.
105 106
VB 2005 - Criando um Formulário de Pedidos com os Assistentes
107 108 109 110
Neste artigo eu vou mostrar como você pode criar um formulário para efetuar o pedido de venda de um produto em uma aplicação Windows Forms usando somente os assistentes de configuração para Data Source.
111 112
Suponha que você tenha que criar um formulário de pedidos para vendas em uma aplicação Windows Forms usando o VB 2005 Express Edition.
113
O modelo relacional das tabelas usadas pelo sistema é o seguinte:
114 115 116
Nota: Não vou entrar no mérito do modelo nem nos detalhes de criação do banco de dados, das tabelas e dos relacionamentos. É importante efetuar a modelagem de forma correta definindo as chaves primárias as chaves estrangeiras e os relacionamentos.
117 118 119
A representação do modelo relacional acima, feito para as tabelas usadas neste artigo, foi obtido a partir do diagrama do banco de dados criado na IDE do Visual Basic 2005 Express Edition. Abaixo temos a figura onde exibimos o diagrama criado:
120 121 122 123
Além disso você terá que criar uma interface que irá usar, como tabelas principais, as tabelas Pedido e Itens, e que deverá receber os pedidos dos clientes e discriminar os itens destes pedidos. Para saber mais leia o artigo : VB.NET - Usando DataBase Diagrama
124 125
Abra o Visual Basic 2005 Express Edition e crie uma nova aplicação Windows Forms com o nome Vendas.
126 127
Você deverá criar um banco de dados contendo as tabelas com a estrutura acima. No exemplo mostrado neste artigo o banco de dados é identificado pelo nome livraria.mdf.
128 129
Altere o título do formulário form1.vb para Pedidos. Abaixo você tem uma visão do projeto no VB 2005.
130 131
Vamos incluir um novo Data Source selecionando a partir do menu Data ou da janela Data Source a opção Add New Data Source...
132 133
Na janela do Assistente de configuração para Data Source selecione a opção Database pois estaremos efetuando a conexão um banco de dados relacional SQL Server.
134 135 136
Escolha a seguir a conexão com a fonte de dados. Se ela não existir clique no botão New Connection e selecione o tipo da fonte de dados e sua localização;
137 138 139
Em seguida será apresentada a janela contendo os objetos do banco de dados livraria.mdf, expanda o objeto Tables e selecione as tabelas Itens e Pedido, pois vamos trabalhar somente com essas tabelas e altere o nome do dataset que será gerado para PedidosDS;
140 141 142
Na janela DataSource você verá o DataSet - PedidosDS exibindo as tabelas itens e Pedido. Perceba que a tabela Pedido possui um vinculo com a tabela Itens decorrente do relacionamento feito pela chave pedidoID;
143 144
A janela Solution Explorer também exibe o DataSet onde é possível visualizar o esquema criado com base nas tabelas do banco de dados.
145 146 147 148 149
Na janela Data Sources vamos expandir a tabela Pedido e alterar o modo de exibição de alguns dos seus campos, para isso basta selecionar o campo e escolher a opção desejada a partir do menu; • •
clienteID altere o modo para ComboBox formaPagamentoID altere para o modo ComboBox
150 151
A seguir vamos definir o modo de visualização dos campos da tabela como Details. Clique na tabela e selecione este modo a partir do menu;
152 153 154
Arraste e solte a tabela no formulário form1.vb do projeto. Você deverá ver cada campo sendo exibido no formato definido no DataSet; verá também a criação dos objetos abaixo na bandeja do formulário;
155 156 157 158
• • • •
PedidoDS (dataset) PedidoBindingSource PedidoTableAdapter PedidoBindingNavigator
159 160 161
Em seguida, ainda na janela Data Sources, selecione a tabela itens que esta vinculada a tabela Pedido conforme a figura (Não confunda com a tabela Itens que também foi criada no dataset) e altere o modo de exibição para DataGridView
162 163
Arraste e solte a tabela no mesmo formulário form1.vb , logo abaixo do local onde os itens da tabela pedido foram exibidos;
164
Vamos selecionar o DataGridView criado e clicar na opção Edit Columns;
165 166 167
Remova o campo PedidoID e selecione a coluna LivroID. Em seguida na propriedade Columntype altere o seu valor para DataGridViewComboBoxColumn e clique em OK;
168
Obs: Para Remover o campo PedidoID selecione o campo e clique no botão Remove.
169 170 171 172 173
Vamos criar outro Data Source a partir da tabela livros para que possamos usar no formulário de pedidos. A partir da janela Data Sources ou no menu Data Selecionando a opção Add New Data Source , selecione DataBase, aceite a conexão já criada com o banco de dados livraria.mdf e na janela onde são exibidos as tabelas do banco de dados selecione a tabela Livros informando nome LivrosDS para o dataset a ser criado;
174 175
Vamos repetir o procedimento e criar mais dois novos Data Sources : ClientesDS e PagmentosDS. Iremos usar estes DataSources no formulário de pedidos logo em seguida.
176 177 178 179 180
Veremos a seguir como usar os Data Sources criados. Lembra que no formulário , alteremos o tipo de coluna do campo LivroID no DataGridView para DataGridViewComboBoxColumn. Pois bem, agora na propriedade DataSource vamos indicar o nome LivrosDS referente ao Data Source que acabamos de criar definindo as propriedades DisplayMember como titulo e ValueMember como livroID;
181 182 183 184
Vamos agora selecionar a comboBox definida para o campo ClienteID e a partir da janela Data Sources arrastar e soltar a tabela Clientes do data source ClientesDS criado. Em seguida repita o procedimento para a comboBox do campo forma pagamento ID arrastando a tabela Pagamentos do data source PagamentosDS;
185 186
Perceba que na bandeja do formulário os objetos DataSet, BindingSource e TableAdapter são criados para cada Data Source usado no formulário.
187
Execute o projeto pressionando F5 e vejamos o resultado:
188 189
1- Note que no lugar de exibir o código do livro o DataGridView exibe uma coluna contendo os títulos de cada livro;
190 191
2- A combobox referente a forma de pagamento agora exibe a descrição do pagamento e não o seu código;
192
3- A combobox referente ao campo ClienteID exibe o nome do cliente;
193 194 195
Nota: Eu poderia ter criado um único dataset usando todas as tabelas mas resolvi mostrar esta alternativo que pode ser usada se você pretende usar os data sources criados em mais de um formulário.
196 197 198
E temos então o formulário completo pronto para ser usado no cadastramento de pedidos usando um interface amigável que foi criada sem você ter que digitar praticamente nenhuma linha de código.
199 200 201
Naturalmente faltou espaço para falar das validações e outros recursos que podem ser usados para tornar a aplicação mais robusta e funcional. Essa é deixa para você atuar melhorando o exemplo acima...
202
Até o próximo artigo VB.NET...
203 204
José Carlos Macoratti
205
VB 2005 - Atualizando dados com TableAdapter
206 207
Como atualizar os dados usando o TableAdapter ?
208 209 210
Após você realizar as alterações no seu DataSet você deve enviar os dados para o banco de dados. Lembre-se que um DataSet trabalha no modo desconectado e se você não enviar as atualizações para o banco de dados ele não refletirá as operações feitas no DataSet.
211 212
Se estiver usando um TableAdapter você deve usar o comando Update deste componente para atualizar as tabelas correspondentes no banco de dados. Os TableAdapters usam comandos de dados para ler e para escrever em uma fonte de dados. O método Fill associado a consulta é a base para criar o esquema da tabela de dados associada com como os comandos insertCommand, UpdateCommand, e DeleteCommand associados com o método Update do TableAdapter. Desta forma ao chamar o método Update ele executa a instrução criada quando o TableAdapter foi originalmente configurado e não uma das consultas adicionais que podem ter sido criadas com o Assistente de configuração do TableAdapter.
213 214
O componente TableAdapter ira executar os comandos : INSERT, UPDATE E DELETE tendo como base os valores obtidos para a propriedade RowState.
215 216
A propriedade RowState obtém um dos valores da enumeração DataRowState da classe DataRow. Os valores possíveis para esta enumeração são:
217 218 219
Nome do membro
Descrição
Added
A linha foi adicionada ao DataRowCollection e o método AcceptChanges não foi
Deleted
A linha foi excluída usando o método Delete da DataRow.
Detached
A linha foi criada mas não faz parte de qualquer DataRowCollection. A DataRow imediatamente após ele ter sido criada e para que ela seja adicionada a uma col removida de uma coleção.
Modified
A linha tenha sido modificada e o método AcceptChanges não foi chamado.
Unchanged
A linha não foi alterada desde que o método AcceptChanges foi chamado pela ú
Estes valores dependem de dois fatores: 1. Do tipo de operação que foi realizada na linha; 2. Se o método AcceptChanges tiver sido chamado no DataRow; Ao invocar o método AcceptChanges para um DataRow, o método EndEdit é implicitamente chamado para encerrar qualquer edição realizada. Se o valor da propriedade RowState de uma linha for igual a Added ou Modified, o valor da propriedade RowState torna-se igual a Unchanged. Se o valor de RowState for igual a Deleted a linha é removida. A classe Datatable também possui um método AcceptChanges o qual afeta as alterações feitas para a toda a tabela.
220 221
O procedimento exato para atualizar uma fonte de dados pode variar dependendo das necessidades do seu negócio mas sua aplicação deverá realizar os seguintes passos:
222 223 224
1. Chamar o método Update do adaptador dentro de um bloco Try/Catch; 2. Se uma exceção for capturada, localize a linha de dados que causou o erro; 3. Corrija o erro na linha de dados e tente atualizar novamente; Para localizar linhas que possuem erros em seu DataSet faça o seguinte: • •
Verifique a propriedade HasErrors e veja se existe qualquer erro no seu dataset; Se a propriedade HasErrors for igual a true, então percorra a coleção de tabelas e a seguir de linhas para encontrar a linha com erro:
Private Sub encontraErros() Dim table As Data.DataTable Dim row As Data.DataRow If DataSet1.HasErrors Then For Each table In DataSet1.Tables If table.HasErrors Then For Each row In table.Rows If row.HasErrors Then ' Processar o erro End If Next End If Next End If End Sub 225 226 227
Para salvar os dados para o banco de dados chame o método Update do TableAdapter passando o nome da tabela que contém os valores que deverão ser escritos no banco de dados.
228
O trecho de código que pode ser usado para realizar tal operação: Try Me.Validate() Me.CustomersBindingSource.EndEdit() Me.CustomersTableAdapter.Update(Me.NorthwindDataSet.Customers) MsgBox("Atualização realizada com sucesso...") Catch ex As Exception MsgBox("A atualização falhou...") End Try
229 230 231 232
- EndEdit - aplica as alterações pendentes a fonte de dados - Update(NortwhindDataSet.Customers) - envia as alterações para o banco de dados, informando o dataset e a tabela a ser atualizada;(Existem outros métodos Updates sobrecarregados onde a assinatura é diferente e com isso os parâmetros informados podem variar)
233
Atualizando tabelas relacionadas
234 235 236
Quando você precisar atualizar tabelas relacionadas em um dataset é importante atualizar as tabelas na sequência correta a fim de reduzir a chance de gerar um erro relacionado integridade referencial.
237 238 239 240 241 242
A ordem de execução do comando também seguira os índices da coleção DataRowCollection no dataset. Para evitar erros relacionados a integridade dos dados ocorram a melhor maneira é atualizar o banco de dados usando a seguinte sequência: 1. Tabela filha - deletar os registros; 2. Tabela Pai - inserir , atualizar e deletar registros; 3. Tabela Filha - inserir e atualizar registros; Um DatarowCollection é o componente principal de um objeto DataTable; enquanto que DataColumnCollection define o esquema da tabela , DataRowCollection contém os dados atuais da tabela, onde cada DataRow que compõe um DataRowCollection representa uma linha única (registro).
243 244 245 246
Se você esta atualizando duas ou mais tabelas relacionadas deverá incluir toda a lógica de atualização em uma transação. Uma transação é um processo que assegura que todas as mudanças relacionadas feitas no banco de dados tenham sido completadas com sucesso antes de confirmar, através do comando commit, qualquer mudança. Transações são grupos de operações combinadas em uma unidade lógica de trabalho. Elas são usadas para controlar e manter a consistência e integridade de cada ação na transação, a despeito dos erros que possam ocorrer no sistema.
247 248 249 250 251 252 253 254 255 256 257 258
Para saber mais sobre transações veja o artigo : • • •
ADO.NET - Usando Transações ADO - Usando Transações - BeginTrans, CommitTrans e RollBack. O Processamento de Transações: BeginTrans, CommitTrans e RollBack.
A seguir temos um exemplo de realização de tal operação. As etapas a serem cumpridas são : 1. Crie três tabelas temporárias para tratar os registros diferentes; 2. Chame o método Update para cada subconjunto de linhas usando um bloco try/catch. Se ocorrem erros, verifique e corrija; 3. Confirme as alterações para o banco de dados (Commit); 4. Libere os recursos alocados quando da criação das tabelas temporárias; O exemplo abaixo trata com as tabelas Orders e Customers. Essas tabelas possui um relacionamento mostrado a seguir: A tabela Customers é a tabela Pai e a tabela Orders a tabela filha; - Criamos uma tabela para os registros deletados; - Uma tabela para os novos registros; - Uma tabela para os registros modificados;
Private Sub AtualizaBD()
'cria as tabelas para tratar os registros diferentes: deletados, novos e modificados Dim deletedChildRecords As NorthwindDataSet.OrdersDataTable = _ CType(NorthwindDataSet.Orders.GetChanges(Data.DataRowState.Deleted), NorthwindDataSet.OrdersDataTable) Dim newChildRecords As NorthwindDataSet.OrdersDataTable = _ CType(NorthwindDataSet.Orders.GetChanges(Data.DataRowState.Added), NorthwindDataSet.OrdersDataTable) Dim modifiedChildRecords As NorthwindDataSet.OrdersDataTable = _ CType(NorthwindDataSet.Orders.GetChanges(Data.DataRowState.Modified), NorthwindDataSet.OrdersDataTable) 'Atualiza a tabela filha -> Orders Try If deletedChildRecords IsNot Nothing Then OrdersTableAdapter.Update(deletedChildRecords) End If 'atualiza a tabela Pai -> Customers CustomersTableAdapter.Update(NorthwindDataSet.Customers) If newChildRecords IsNot Nothing Then OrdersTableAdapter.Update(newChildRecords) End If If modifiedChildRecords IsNot Nothing Then OrdersTableAdapter.Update(modifiedChildRecords) End If 'salva as alterações no banco de dados NorthwindDataSet.AcceptChanges() Catch ex As Exception MessageBox.Show("Ocorreu um erro durante o processo de atualização") Finally 'libera os recursos alocados If deletedChildRecords IsNot Nothing Then deletedChildRecords.Dispose() End If If newChildRecords IsNot Nothing Then newChildRecords.Dispose() End If If modifiedChildRecords IsNot Nothing Then modifiedChildRecords.Dispose() End If End Try End Sub
260
Com isso temos um panorama geral sobre como atualizar dados usando um TableAdapter.
261 262 263 264
Além das instruções InsertCommand, UpdateCommand, and DeleteCommand, o componente é criado com métodos que podem ser executados diretamente no banco de dados. Estes métodos podem ser chamados diretamente para manipular dados. Os métodos são: TableAdapter.Insert, TableAdapter.Update, e TableAdapter.Delete.
265
VB 2005 - Manipulando o DataGridView
266 267 268
O DataGridView é um controle com 1001 utilidades, flexível e poderoso se comparados com controles grids das versões anteriores do VB (lembra do DBGrid, MSFlexGrid, DataGrid, etc...)
269 270 271 272
Embora não seja complicado de usar como toda novidade desperta curiosidade e dúvidas, e, por este motivo este artigo procurar mostrar as maneiras mais comuns e úteis de usar o controle DataGridView.
273
Para começar você vai ter que ter instalado os seguintes recursos:
274
•
Visual Basic 2005 Express Edition (Aproveite é grátis)
275 276
O primeiro passo e abrir o VB 2005 Express e criar uma aplicação Windows Forms via opção File->New Project com o nome de datagridViewTotal
277
Aqui é o ponto de partida para a nossa jornada, vamos lá...
278
Usando DataGridView com Arrays
279 280
Vamos definir um array chamado vetor com dois elementos e vincular o array ao DataGridView usando a propriedade DataSource: Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load '========================================== 'outras maneiras de declarar e iniciar um array '(a) 'Dim vetor(2) As String 'vetor(0) = "Super CD VB 40,00" 'vetor(1) = "Super DVD.NET 50,00" '(b) 'Dim vetor() As String 'vetor = New String() {"Super CD VB 40,00", "Super DVD .NET 50,00"} '============================================= Dim vetor() As String = {"Super CD VB 40,00", "Super DVD .NET
50,00"} DataGridView1.DataSource = vetor End Sub
281
Opa ! mas o que aconteceu ??? O resultado não é o esperado. Por que ?
282 283
Você esperava que os elementos do array fossem exibidos mas somente o tamanho de cada elemento foi exibido.
284 285 286
O motivo deste comportamento é que o DataGridView procura pela primeira propriedade pública do objeto ao qual esta vinculado e a primeira propriedade pública de um array de strings é o tamanho de cada elemento contido no array.
287 288 289
Para fazer da maneira correta devemos envolver o array de string em uma classe que exponha propriedades públicas que retornem o conteúdo de cada um dos elementos que desejamos exibir.
290 291
Podemos fazer isso criando uma classe e definindo um construtor e uma propriedade pública para ter acesso ao valor de cada elemento do vetor:
292 293
No menu Project -> Add Class selecione o template Class e informe o nome vetor.vb para o nome da classe a seguir inclua o seguinte código na classe:
294
Voltando ao formulário form1.vb e alterando o código para usar a classe criada temos:
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load 'Dim vetor() As String = {"Super CD VB 40,00", "Super DVD .NET 50,00"} '========================================== 'outras maneiras de declarar e iniciar um array '(a) 'Dim vetor(2) As String 'vetor(0) = "Super CD VB 40,00" 'vetor(1) = "Super DVD.NET 50,00" '(b) 'Dim vetor() As String 'vetor = New String() {"Super CD VB 40,00", "Super DVD .NET 50,00"} '============================================= Dim valores() As Vetor = {New Vetor("Super CD VB 40,00"), New Vetor("Super DVD .NET 50,00")} DataGridView1.DataSource = valores End Sub
295
Da mesma forma podemos vincular o controle DataGridView a um objeto mais complexo.
296
Usando DataGridView com DataSets Tipados
297 298
Um uso muito comum do controle DataGridView é a vinculação a uma tabela de um banco de dados. Podemos efetuar esta tarefa usando um DataSet tipado.
299 300 301
Vamos incluir um dataset tipado ao projeto clicando sobre o nome do projeto com o botão direito do mouse e seleciona a opção Add New Item. Na janela selecione o template DataSet e clique Add;
302 303 304
Habilite o DataBase Explorer no menu View e localize o banco de dados Northwind.mdf , expanda o objeto Tables e em seguida arraste e solte a tabela Customers no descrito DataSet1.xsd conforme a figura abaixo:
305 306
No próximo passo vamos vincular o dataset ao DataGridView e podemos fazer isto das seguintes formas:
307
1- Vincular o DataGridView diretamente ao adapter da tabela Customers:
308
Inclua o projeto a seguinte declaração :
309
Imports dataGridViewTotal.DataSet1TableAdapters
310 311
A seguir inclua um botão de comando no formulário e inclua o código abaixo no evento Click do botão: Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click 'cria uma instância da TableAdapter Dim da As New CustomersTableAdapter 'vincula o TableAdapter ao DataGridView DataGridView1.DataSource = da.GetData End Sub
312
Executando o projeto temos:
313
2- Vinculando o DataGridView a um BindginSource
314 315 316
Para este exemplo você deve criar um TableAdapter para a tabela Customers. Para fazer isso inclua um novo DataSet no projeto e arraste a partir da janela DataBase Explorer a tabela Customers do banco de dados Northwind.mdb.
317
A seguir Inclua no projeto a seguinte declaração (se ainda não o fez) :
318
Imports dataGridViewTotal.DataSet1TableAdapters
319
Agora insira um novo botão de comando e no evento Click do botão insira o código: Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click 'cria uma instância da TableAdapter Dim da As New CustomersTableAdapter 'cria uma instância de um BindingSource Dim bindsrc As New BindingSource 'define a fonte de dados para o bindingsource e obtém os dados do método GetData do TableAdapter bindsrc.DataSource = da.GetData 'vincula o BindingSource ao DataGridView DataGridView1.DataSource = bindsrc End Sub
320
Usando o DataGridView com DataSets não tipados
321 322
Você também pode definir o dataset via código vinculando em seguida o componente ao DataGridView.
323 324
Primeiro temos que criar e preencher um dataset para em seguida atribuir à propriedade DataSource do DataGridView o dataset gerado.
325 326 327 328
No código estou atribuindo à propriedade DataMember a tabela gerada no dataset. Uma outra maneira de obter o mesmo resultado seria atribuir diretamente a propriedade DataSource a tabela gerada que no caso seria a primeira tabela (pois só temos uma) : ds.tables(0). Neste caso não necessitaríamos de definir o Datamember.
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click 'define a string de conexao Dim connStr As String = "Data Source=.\SQLEXPRESS;Initial Catalog=Northwind;Integrated Security=True" 'define a instrução sql Dim sql As String = "SELECT * FROM Customers" 'define os objetos connecton, command e dataadapter Dim conn As SqlConnection = New SqlConnection(connStr) Dim comm As SqlCommand = New SqlCommand(sql, conn) Dim dataadapter As SqlDataAdapter = New SqlDataAdapter(comm) 'define o dataset Dim ds As DataSet = New DataSet() Try '---abre a conexao--conn.Open() '---preenche o dataset--dataadapter.Fill(ds, "Clientes") '---fecha a conexao--conn.Close() '---vincula o dataset ao DataGridView--DataGridView1.DataSource = ds 'ou ds.tables(0) '---define a tabela a ser exibida--DataGridView1.DataMember = "Clientes" Catch ex As Exception MsgBox(ex.Message) End Try End Sub
330
Obtendo o valor da célula selecionada e Atribuindo a célula atual
331 332
Para obter o valor da célula clicada pelo usuário em um DataGridView usamos o evento CellEnter:
329
Private Sub DataGridView1_CellEnter(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewCellEventArgs) Handles DataGridView1.CellEnter '---Quando o usuário clicar no controle , exibe o conteudo da célula MsgBox(DataGridView1.Rows(e.RowIndex).Cells(e.ColumnIndex).Value) End Sub
333 334
Neste código estamos obtendo o valor da célula pelo índice da linha (e.RowIndex) e da coluna
335 336
Se desejar obter valor da primeira coluna quando o usuário selecionar uma linha o código ficaria assim :
(e.ColumnIndex).
Private Sub DataGridView1_CellEnter(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewCellEventArgs) Handles DataGridView1.CellEnter '---Quando o usuário clicar no controle , exibe o conteudo da célula referente a primeira coluna (Column=0) MsgBox(DataGridView1.Rows(e.RowIndex).Cells(0).Value) End Sub
338 339 340
Para atribuir a célula atual via código podemos atribuir um valor a propriedade CurrentCell do DataGridView . No código abaixo estou atribuindo a célula atual como sendo a primeira linha e a segunda coluna ( row=0 e column=1) Private Sub setCurrentCellButton_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles setCurrentCellButton.Click ' Define a célula atual para a célula na coluna 1 e linha 0 Me.dataGridView1.CurrentCell = Me.dataGridView1(1, 0) End Sub
341
Validando a entrada de dados em uma célula
342 343
Podemos usar o evento CellValidating para verificar se a entrada de um usuário quando da edição dos dados de uma célula estiver ocorrendo é valida ou não.
344 345
No exemplo acima iremos efetuar a validação da coluna CompanyName para isso devemos implementar o tratamento dos eventos CellValidating e CellEndEdits.
346 347
O evento CellValidating ocorre quando a célula perde o foco de entrada habilitando a validação do seu conteúdo.
348 349
O evento CellEndEdits ocorre quando o modo de edição é encerrado para a atual célula selecionada.
350 351 352 353
No evento CellValidating é onde você determina se o valor de uma célula para um determinada coluna é válida. Se a validação da célula falha defina a propriedade Cancel da classe System.Windows.Forms.DataGridViewCellValidatingEventArgs para true. Isto faz com que o controle DataGridView não permita que o cursor deixe a célula.
354 355
Definindo a propriedade ErrorText na linha para exibir uma mensagem para o usuário exibe um ícone de erro com uma dica que contém o texto para o erro.
356 357 358
No evento CellEndEdit defina a propriedade ErrorText na linha para uma string vazia. Este evento ocorre somente quando a célula existe no modo edit o qual não pode ocorrer se a validação falhar.
359
No exemplo vamos verificar se a coluna CompanyName esta vazia para a entrada do usuário: Private Sub dataGridView1_CellValidating(ByVal sender As Object, ByVal e As DataGridViewCellValidatingEventArgs) Handles DataGridView1.CellValidating ' Valida o entrada para o CompanyName não permitindo valores em branco If DataGridView1.Columns(e.ColumnIndex).Name = "CompanyName" Then If String.IsNullOrEmpty(e.FormattedValue.ToString()) Then DataGridView1.Rows(e.RowIndex).ErrorText = "O nome da Companhia não pode ser vazio." e.Cancel = True End If End If End Sub Private Sub dataGridView1_CellEndEdit(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewCellEventArgs) Handles DataGridView1.CellEndEdit ' Limpa o erro da linha no caso do usuário pressionar ESC DataGridView1.Rows(e.RowIndex).ErrorText = String.Empty End Sub
360
Tratando ocorrências de erros em um DataGridView
361 362 363
Podemos efetuar o tratamento de erros para o controle DataGridView usando o evento DataError o qual é disparado quando a fonte de dados detecta uma violação de restrição ou quebra de regra de negócio.
364 365 366
A seguir temos um exemplo que quando ocorrer um valor para o campo CustomerID duplicado em uma nova linha ou linha sendo editada o evento DataError irá ocorrer e será tratado pela exibição de uma mensagem que descreve o erro. Private Sub dataGridView1_DataError(ByVal sender As Object, ByVal e As DataGridViewDataErrorEventArgs) Handles DataGridView1.DataError ' Se a fonte de dados levanta uma exceção quando uma célula esta comitda
exibe um erro. If e.Exception IsNot Nothing AndAlso e.Context = DataGridViewDataErrorContexts.Commit Then MessageBox.Show("O código do cliente - CustomerID - não pode ser duplicado.") End If End Sub
367
Exibindo imagens em células de um DataGridView
368 369 370 371
Podemos exibir uma figura ou um gráfico em uma linha de dados. Para exibir imagens em um controle DataGridView não há muito segredo pois ele trata nativamente qualquer imagem suportada pela classe Image bem como o ormato de imagem OLE usado por alguns banco de dados.
372 373
Se a fonte de dados do controle DataGridView possuir uma coluna com imagens , elas serão exibida automaticamente exibidas no controle DataGridView.
374
Filtrando e ordenando colunas via código
375 376 377
Para filtrar os dados exibidos em um DataGridView podemos usar um objeto DataView. A seguir temos um exemplo onde estamos filtrando os dados para o código do cliente iniciado pela letra B:
378 379 380
Nota: Para este exemplo você deve criar um TableAdapter para a tabela Customers. Para fazer isso inclua um novo DataSet no projeto e arraste a partir da janela DataBase Explorer a tabela Customers do banco de dados Northwind.mdb.
381
Você deverá declarar os seguintes namespaces no projeto para que o código abaixo funcione:
382 383
Imports System.Data.sqlclient Imports datagridviewTotal.DataSet1TableAdapters Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click '---crria uma instância de um tableadapter --Dim adapter As New CustomersTableAdapter '---cria uma instância de um dataview--Dim dv As New DataView(adapter.GetData) 'filtra usando o criterio escolhido: clientes com código contendo B no início
With dv .AllowNew = False .AllowDelete = True .Sort = "ContactTitle ASC, Address ASC" .RowFilter = "CustomerID LIKE 'B*'" End With ' atribui o dataview ao datagridview DataGridView1.DataSource = dv End Sub
384
O resultado da execução deste código será:
385 386 387
O dataView é obtido a partir do adapter chamando o método getData que retorna um DataTable preenchido conforme a consulta SQL definida.
388 389
No código acima o objeto DataView permite aos usuário incluir novas linhas , via propriedade AllowNew no controle DataGridView e também excluir linhas , via propriedade AllowDelete.
390 391
Podemos ainda ordenar as linhas especificando o campo e a ordem correspondente que será aplicada usando a propriedade Sort. (ASC ordem ascendente DESC ordem descendente)
392
O filtro é feito pela expressão SQL usando a expressão LIKE via propriedade RowFilter.
393
Uma outra maneira de ordenar colunas é usar o método Sort do próprio controle DataGridView: Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles Button3.Click DataGridView1.Sort(DataGridView1.Columns(0), System.ComponentModel.ListSortDirection.Descending) End Sub
394 395
O código esta ordenando pela primeira coluna do componente (Columns(0)) usando a ordem descendente.
396
Definindo um texto em ToolTips em células individuais
397 398 399 400 401
De forma geral usamos o recurso ToolTips para exibir valores em células do DataGridView que são muito pequenas para exibir todo o conteúdo. Podemos reescrever este comportamento de forma a definir textos para ToolTips para células individuais. Isto é útil para exibir informação adicional sobre a célula ou para fornecer ao usuário uma descrição mais detalhada sobre o conteúdo da célula.
402 403
Para isto eu vou usar o o evento CellFormatting que ocorre quando o conteúdo de uma célula precisa ser formatado para exibição.
404 405 406
A tabela Customers não possui um campo muito adequado para um exemplo mais convincente ,vou usar portanto o campo City de e escolher algumas cidades de forma que exibam o nome do pais a qual pertençam. O código é o seguinte: 'Define o texto da propriedade ToolTip para células da coluna especificada , no caso a coluna: City Sub dataGridView1_CellFormatting(ByVal sender As Object, ByVal e As DataGridViewCellFormattingEventArgs) _ Handles DataGridView1.CellFormatting If e.ColumnIndex = Me.DataGridView1.Columns("City").Index AndAlso (e.Value IsNot Nothing) Then With Me.DataGridView1.Rows(e.RowIndex).Cells(e.ColumnIndex) If e.Value.Equals("London") Then .ToolTipText = "< Inglaterra >" ElseIf e.Value.Equals("Sao Paulo") Then .ToolTipText = "< Brasil > " ElseIf e.Value.Equals("Madrid") Then .ToolTipText = "< Espanha >" ElseIf e.Value.Equals("Buenos Aires") Then .ToolTipText = "< Argentina >" End If End With End If End Sub
407
O resultado pode ser visto na figura abaixo:
408
Exibindo uma combobox em uma célula
409 410 411 412
Você pode exibir uma combobox em uma célula de forma a permitir que o usuário selecione valores determinados de uma lista existente. Neste caso você precisa incluir uma ComboBox na célula da coluna desejada. O código abaixo faz exatamente isto usando o controle BindingSource: Private Sub Form2_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load '---inclui colunas no controle DataGridView--DataGridView1.Columns.Add("ID", "Codigo") DataGridView1.Columns.Add("Nome", "Nome Aluno") '---define um controle bindingsource--Dim bindingsource As New BindingSource '---inclui itens no controle--bindingsource.Add("Matemática") bindingsource.Add("Português") bindingsource.Add("História") '---cria uma coluna do tipo combobox--Dim comboBoxCol As New DataGridViewComboBoxColumn '---define o cabecalho (header) --comboBoxCol.HeaderText = "Disciplinas" '---vincula os dados--comboBoxCol.DataSource = bindingsource '---Inclui a coluna combobox ao DataGridView--DataGridView1.Columns.Add(comboBoxCol) End Sub
413 414
Se você não quiser usar um controle BindingSource pode incluir os itens diretamente no controle DataGridViewComboBoxColumn : Private Sub Form2_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load '---inclui colunas no controle DataGridView---
DataGridView1.Columns.Add("ID", "Codigo") DataGridView1.Columns.Add("Nome", "Nome Aluno") '---cria uma coluna do tipo combobox--Dim comboBoxCol As New DataGridViewComboBoxColumn '---define o cabecalho (header) --comboBoxCol.HeaderText = "Disciplinas" '---inclui itens no controle--comboBoxCol.Items.Add("Matemática") comboBoxCol.Items.Add("Português") comboBoxCol.Items.Add("História") '---Inclui a coluna combobox ao DataGridView--DataGridView1.Columns.Add(comboBoxCol) End Sub
415 416 417 418 419 420 421
Se você deseja permitir que os usuários possam incluir novos valores no controle ComboBox. Neste caso você terá que fazer o seguinte : 1-) Usar o evento EditingControlShowing que ocorre quando o usuário vai tentar editar dados no controle Combobox: Private Sub DataGridView1_EditingControlShowing(ByVal sender As Object, ByVal e As System.Windows.Forms. DataGridViewEditingControlShowingEventArgs) _ Handles DataGridView1.EditingControlShowing Dim comboBoxColumn As DataGridViewComboBoxColumn = DataGridView1.Columns(2) If (DataGridView1.CurrentCellAddress.X = comboBoxColumn.DisplayIndex) Then Dim cb As ComboBox = e.Control If (cb IsNot Nothing) Then cb.DropDownStyle = ComboBoxStyle.DropDown End If End If End Sub
422 423 424 425 426 427 428 429
Neste código estou verificando se a célula que esta sendo editada é do tipo ComboBox. Neste caso estou definindo o estilo do ComboBox como DropDown de forma que o usuário possa digitar o novo item a ser incluído. 2-) Usar o evento CellValidating do controle DataGridView que ocorre sempre que o usuário termina de digitar e deixa a célula: Private Sub DataGridView1_CellValidating(ByVal sender As Object, ByVal e As System.Windows.Forms. DataGridViewCellValidatingEventArgs) Handles DataGridView1.CellValidating Dim comboBoxColumn As DataGridViewComboBoxColumn = DataGridView1.Columns(2) If (e.ColumnIndex = comboBoxColumn.DisplayIndex) Then If (Not comboBoxColumn.Items.Contains(e.FormattedValue)) Then comboBoxColumn.Items.Add(e.FormattedValue) End If End If End Sub
430 431 432 433 434 435
Aqui estou verificando e incluindo o novo item na ComboBox. Para que a inclusão seja possível a propriedade DataSource do coluna DataGridViewComboBoxColumn não pode estar definida; assim não podemos vincular o bindingsource e incluir itens na combobox tendo que usar o código que inclui os dados diretamente na combobox.
436 437 438
Eu poderia estender este artigo, mas são tantos os recursos do DataGridView a explorar que vamos continuar a falar sobre assunto mais adiante... Aguarde.
439
VB.NET 2005 - Agenda com acesso a dados
440 441 442 443 444 445
Se você esta começando agora a aprender o VB 2005 e tem dúvidas em como criar uma aplicação para acesso a dados que realize as tarefas de incluir, exclui, alterar e listar os dados esta pequena agenda feita no Visual Basic 2005 é exatamente o que você procura: simples , com código sem complicações , realizando as principais tarefas de manutenção (as famosas operações CRUD).
446
Ao estudar esta aplicação você vai aprender a:
447 448 449 450 451 452
• • • • • •
Criar um projeto de acesso a dados usando o Microsoft Access; Criar uma interface com o usuário simples e funcional(Menus de opções com ícones); Realizar as operações de inclusão, alteração e exclusão de dados; Trabalhar com exibição de imagens em formulário; Salvar , remover e exibir as imagens em um banco de dados Access; Acessar a internet a partir da sua aplicação VB;
453 454
Vamos usar um banco de dados do Microsoft Access que foi criado com o nome de Agenda.mdb e que possui a tabela Contatos contendo a seguinte estrutura:
455
A aplicação terá apenas dois formulários: o formulário principal que é mostrado abaixo:
456 457 458 459 460 461
Os namespaces usados na aplicação são: Imports System.Data.OleDb Imports System.io Imports System.drawing
462 463
O banco de dados esta localizado na pasta bin e possui a seguinte definição para a conexão do tipo OledbConnection :
464 465
Public con As New System.Data.OleDb.OleDbConnection("Provider = Microsoft.jet.OleDB.4.0;Data Source = " & Application.StartupPath & "\Agenda.mdb;")
466
As operações CRUD (Create, Update, Delete) são feitas via comandos SQL : Incluir
Alterar Excluir
467
INSERT INTO Contatos(nome,endereco,fone,celular,email,nascimento,[imagem])VALUES('" & tb1.Text & "','" & tb2.Text & "','" & tb3.Text & "','" & tb4.Text & "','" & tb5.Text & "','" & tb6.Text & "', ?)" UPDATE Contatos SET nome='" & tb1.Text & "',endereco='" & tb2.Text & "',fone='" & tb3.Text & "',celular='" & tb4.Text & "',email='" & tb5.Text & "',nascimento='" & tb6.Text & "',[imagem]=? WHERE nome='" & tb8.Text & "'" DELETE * FROM Contatos WHERE nome = '" & cb1.SelectedItem & "'"
O código que faz a chamada a um site da web é o seguinte: Private Sub wbtn_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles wbtn.Click
System.Diagnostics.Process.Start("http://www.macoratti.net")
End Sub
468
A cara da projeto em execução para exibição dos dados de um registro é a seguinte :
469 470
Como estou disponibilizando o código completo creio que já escrevi demais. Baixe os fontes e bom estudo...
471
VB 2005 - Criando uma classe para acesso a dados
472 473 474
É uma prática recomendável criar uma camada de acesso a dados e encapsular o seu código. Você ganha em produtividade e facilita a manutenção.
475 476
A seguir apresento algumas sugestões de classes com código de acesso a dados que você pode usar em seus projetos.
477 478
Abra o Visual Basic 2005 Express e crie um projeto do tipo Windows Application onde serão criadas as classes.
479 480 481
No menu Project clique na opção Add Class e na janela Add New Item selecione o template Class informando o nome acessoBD. Será criado o arquivo acessoBD.vb onde podemos criar as nossas classes para acesso a dados. Neste arquivo podemos criar uma ou várias classes.
482 483 484
Começamos criando a classe AcessoBD com um construtor vazio e outro construtor onde definimos a string de conexão. O método getConexao retorna a conexão aberta e o método closeConexao fecha a conexão;
Nota: O modelo de configuração de formulário (Configuration Forms) não esta disponível em projetos Class Library pois não temos um arquivo App.Config para a DLL. Para ler o arquivo de configuração App.Config em sua aplicação VB 2005 , e exibir o resultado no console , você pode usar o seguinte código: Private Shared Sub ShowConfig() For Each key As String In ConfigurationManager.AppSettings Dim value As String = ConfigurationManager.AppSettings(key) Console.WriteLine("Chave: {0}, Value: {1}", key, value) Next End Sub
486 487 488
Vamos criar a seguir dois métodos sobrecarregados onde poderemos passar o nome de um procedimento armazenado - Stored Procedure - com parâmetros e no outro uma instrução SQL retornando um DataReader:
489 490
Veremos a seguir um exemplo de como usar as classes acima em um formulário Windows Forms.
491 492 493
Aproveitando o mesmo projeto onde criamos a classe AcessoBD inclua no formulário form1.vb um controle ListBox e um botão de comando. No evento Click do botão de comando inclua o seguinte código: Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click 'obtem a string de conexão do arquivo de configuração App.Config Dim strCon = My.Settings.NORTHWNDConnectionString
'cria uma instância da classe AccessBD usando o construtor 'que usa a string de conexao Dim oDB As New AcessoDB(strCon) Dim dr As SqlDataReader 'chama o método retornaDataReader passando uma instrução SQL dr = oDB.retornaDataReader("Select * from Customers") 'percorre o datareader e exibe os dados no listbox Do While dr.Read ListBox1.Items.Add(dr(0) & " - " & dr(1)) Loop End Sub
494
O resultado será o preenchimento do ListBox conforme figura abaixo:
495 496
Vamos agora criar um método que retorna um DataSet e que recebe o nome da stored procedure , o nome do DataTable a ser preenchido e a coleção de parâmetros:
497 498 499 500
Para usar o exemplo acima irei acessar o banco de dados Northwind.mdf e usar a stored procedure CustOrderHist existente. Esta stored procedure possui o parâmetro @CustomerID que deve ser informado para o método juntamente como valor de retorno desejado. O DataTable retornado irá ser exibido em um controle DataGridView no formulário;
501
Nota: A stored procedure CustOrderHist possui o seguinte código:
502
A seguir inclua o código abaixo no evento Load do formulário: Private Sub Form2_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load 'obtem a string de conexão do arquivo de configuração App.Config Dim strCon = My.Settings.NORTHWNDConnectionString 'cria instância da classe acessoBD Dim oDados As New AcessoDB(strCon) 'define um dataset Dim ds As New DataSet 'obtem o dataset passando o nome da Stored Procedure, o parametro e o
valor do parametero (codigo do cliente=ALFKI) ds = oDados.retornaDataSet("CustOrderHist", "CustOrderHist", New SqlParameter("@CustomerID", "ALFKI")) 'se há dados preenche o datagridview If ds.Tables(0).Rows.Count > 0 Then DataGridView1.DataSource = ds.Tables(0) Else MsgBox("Não há dados para este criterio") End If End Sub
503
Executando o projeto para a stored procedure CustOrderHist e o cliente ALFKI iremos obter:
504 505 506 507
Note que a classe definida efetua o acesso ao banco de dados SQL Server e que eu não efetuei um tratamento de exceção nas mesmas. Deixo esta tarefa para você (dica: você pode apenas lançar a exceção (throw ex) ). Você pode criar mais métodos ou adaptar os métodos definidos ao seu projeto.
508
VB.NET 2005 - Conectando com objetos de dados
509 510 511 512 513
Este artigo apresenta como criar objetos para gerenciar informações de negócios e em seguida mostra como criar um objeto como fonte de dados para estes objetos. Mostra também como usar TableAdapters para obter dados a partir de um banco de dados e preencher os objetos de dados.
514 515 516 517
O objeto da fonte de dados é criado pela execução do assistente de configuração de fonte de dados selecionando como tipo de dados a opção Object. Depois de completar o assistente as propriedades públicas do objeto estarão disponíveis na janela Data Source para que você possa efetuar a vinculação dos objetos com controles em formulário Windows.
518
As tarefas a serem realizadas neste artigo são as seguintes:
519 520 521 522 523 524 525 526 527
• • • • • •
Criar uma novo projeto do tipo Windows Application; Criar objetos de negócio que vão representar clientes; Criar e configurar um objeto de fonte de dados na aplicação baseado nos objetos criados acima usando o assistente de configuração de fonte de dados; Incluir controles em um formulário que serão vinculados aos dados nos objetos definidos; Criar um dataset com os TableAdapter para mover os dados entre os objetos e o banco de dados; Preencher os objetos com os dados do banco de dados.
528
Desenhando o cenário para a nossa aplicação:
529 530 531 532 533
Você possui um banco de dados que contém uma tabela chamada Clientes e deseja criar uma aplicação Windows, usando o VB 2005, para gerenciar os seus dados através da criação de objetos de negócio que representam os Clientes. Deseja também poder exibir em um formulário os dados desta tabela e também preencher os seus objetos de dados com os dados do banco de dados.
534 535 536
Nota: Não importa qual seja o seu banco de dados desde que haja um provedor através do qual possamos efetuar uma conexão com ele. Neste artigo eu vou usar o banco de dados Microsoft Access.
537
Na figura abaixo temos a estrutura da tabela Clientes do banco de dados Vendas.mdb :
Obs: A tabela foi criada com apenas 3 campos para facilitar o entendimento.
538
1- Criando um o projeto Windows
539 540
Abra o Visual Basic 2005 Express Edition e crie um novo projeto do tipo Windows Application chamado vendasNetObjetos;
541
2- Criando os objetos de Negócio : Clientes e Pedidos
542 543
Vamos criar agora os objetos de negócio que irão representar as informações da tabela Clientes.
544
No menu Project selecione a opção Add Class;
545 546
Na janela Add New Item selecione o template Class e informe o nome Clientes.vb clicando a seguir no botão Add;
547
A seguir inclua o seguinte código na classe Clientes: Public Class Clientes Public Sub New() End Sub Public Sub New(ByVal clienteID As Integer, _ ByVal nome As String, _ ByVal endereco As String) clienteID_ = clienteID nome_ = nome endereco_ = endereco End Sub Private clienteID_ As Integer Public Property clienteID() As Integer Get Return clienteID_ End Get Set(ByVal value As Integer) clienteID_ = value End Set End Property Private nome_ As String Public Property nome() As String Get
Return nome_ End Get Set(ByVal Value As String) nome_ = Value End Set End Property Private endereco_ As String Public Property endereco() As String Get Return endereco_ End Get Set(ByVal Value As String) endereco_ = Value End Set End Property Public Overrides Function ToString() As String Return Me.nome & " (" & Me.clienteID & ")" End Function End Class
548 549 550
A classe Clientes possui como membros os campos definidos na tabela Clientes. Além disso estamos sobrescrevendo a função ToString para poder exibir o nome do cliente seguido do seu código.
551
Neste ponto já temos a classe Clientes.vb pronta. Ela representa os dados da tabela Clientes.
552
Criando um objeto de fonte de dados
553 554
Podemos criar uma fonte de dados baseada nos objetos criados previamente através do assistente de configuração de Data Source. Vejamos como fazer isso:
555 556
557
•
Abra a janela Data Sources clicando no menu Data e escolhendo a opção Show Data Sources;
558 559
• •
Clique no link Add new Data Source; Na janela Choose a Data Source Type selecione a opção Object e clique em Next;
•
Na janela Select the Object You Wish do Bind To , expanda o nó vendasNetObjetos e selecione a classe Clientes;
•
Clique no Botão Next > ;
560 561 562
563 564
565 566 567
•
Finalmente clique no botão Finish e você verá o objeto Clientes na janela Data Sources;
568 569
Criando o formulário para vinculação dos dados
570 571 572
Os controles que serão vinculados ao ao objeto Clientes podem ser criados arrastando os items da janela Data Sources no formulário. Desta forma para criar um formulário com controles vinculados as propriedades do objeto Clientes devemos fazer o seguinte:
573 574
• •
Na janela Soluction Explorer, selecione Form1 e clique em View Designer; Arraste e solte o item Clientes a partir da janela Data Source para o formulário Form1;
575 576 577 578
Ao final do processo você verá os controles serem criados no formulário bem com o objeto ClientesBindingNavigator para navegação e o objeto ClientesBindingSource para vinculação dos controles com a fonte de dados.
579 580
Criando um TableAdapter para carregar os dados da tabela no objeto
581 582 583
Para mover os dados entre os objetos e o banco de dados vamos usar o recurso TableAdapters. Para criar um TableAdapter para a tabela Clientes vamos usar o assistente de configuração de Data Source;
584 585 586 587 588 589 590
• • •
•
A partir do menu Data, selecione a opção Add New Data Source; Selecione a opção DataBase e clique em Next> ; Na janela para escolher a conexão de dados clique no botão New Connection e na janela Add Connection selecione o Data Source Microsoft Access DataBase File e selecione o caminho onde o banco de dados esta localizado(no nosso caso c:\dados\Vendas.mdb) Clique no botão Next> ;
591 592 593 594
• •
Salve a string de conexão com o nome padrão VendasConnectionString e clique no botão Next> ; Selecione a tabela Clientes e clique no botão Finish;
595 596 597
Neste momento será criado o dataset VendasDataSet e exibido na janela Data Sources contendo a tabela Clientes;
598 599 600 601
602
Vamos agora incluir instâncias dos objetos ClientsTableAdapters e VendasDataSet ao formulário arrastando e soltando estes objetos a partir da ToolBox para o formulário form1.vb conforme a figura abaixo:
603 604
Se executarmos o projeto neste momento qual será o resultado ? Veja abaixo o resultado obtido:
605 606 607 608 609
Como você pode notar embora tenhamos os objetos criados e as instâncias do dataset e do tableAdapter também criados falta mover os dados da tabela clientes para os controles vinculados no formulário. Para isso teremos que criar uma rotina em nosso projeto para carregar os dados nos objetos usando o TableAdapter.
610
Inclua o código abaixo no formulário form1.vb: Private Sub carregaClientes() Dim clientesDados As VendasDataSet.ClientesDataTable = ClientesTableAdapter1.GetData Dim clientesLinha As VendasDataSet.ClientesRow For Each clientesLinha In clientesDados Dim clienteAtual As New Clientes() With clienteAtual .clienteID = clientesLinha.clienteID .nome = clientesLinha.Nome If Not clientesLinha.IsEnderecoNull Then .endereco = clientesLinha.Endereco End If End With ClientesBindingSource.Add(clienteAtual) Next End Sub
611 612 613 614 615
No código da rotina carregaClientes() criamos um DataTable chamado ClientesDados onde obtemos os dados da tabela Clientes através do método GetData do TableAdapter. Em seguida percorremos o DataTable e atribuímos os valores de cada linha (clientesLinha) ao objeto clienteAtual que é uma instância da classe Clientes. Para finalizar efetuamos a vinculação do objeto via BindingSource para exibir os dados no formulário.
616 617
Para chamar a rotina criada inclua uma chamada à mesma no evento Load do formulário form1: Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load carregaClientes() End Sub
618 619
Agora ao executar o projeto o formulário irá exibir os dados permitindo a navegação pelos registros:
620 621 622 623 624 625 626
Eu removi os botões para incluir, excluir e alterar os dados visto que não implementei estas funcionalidades no projeto. Isso fica como um melhoramento que você pode fazer e que em artigos futuros estarei abordando.