55
1 2 3 4 5 6 7 8 9 10 11 12 Visual Basic 2005 13 Express Edition 14 15 16 17 18 19 20 21 22 23 Autor: 24 Alexandro Vieira de Souza 25

Visual Basic

  • Upload
    pierors

  • View
    80

  • Download
    3

Embed Size (px)

Citation preview

Page 1: Visual Basic

1

2 3

4

5

6

7

8

9

10

11

12

Visual Basic 2005 13

Express Edition 14

15

16

17

18

19

20

21

22

23

Autor: 24

Alexandro Vieira de Souza 25

Page 2: Visual Basic

• Visual Basic 2005 Express Edition 26 27 28 29 Iniciando um Projeto – Ambiente VB 2005 30 31 32

33 34 35 36 Para iniciar um projeto você deve ir no menu superior do VB 2005, clicar em "File" e escolher a opção 37 "New Project", quando clicar, vai aparecer essa tela, então você escolhe a opção "Windows Application", 38 para uma aplicação ao Windows e clica em Ok. 39 40 41 Ambiente de Trabalho – Ambiente VB 2005 42 43

44

Page 3: Visual Basic

45 46 • 1 – È o formulário onde você vai criar suas aplicações, como adicionar botões, imagens, labels, etc. 47 • 2 – Esse menu são as opções da ToolBox, encontrada no menu 3, que ajuda você á adicionar os botões, 48 labels, imagens e várias outras coisas. 49 • 3 – Menu 2 Superior, é responsável por boa parte do trabalho, que tem as seguintes opções de trabalho : 50 51

-• New Project – Para você iniciar um novo projeto, como foi mostrado no inicio da aula. 52 53

-• Open File – Para abrir algum projeto. 54 55

-• Add New Item – Para você adicionar um novo item, por exemplo : Um novo formulário, um novo 56 banco de dados. 57 58

-• Save "Arquivo" – Para salvar o projeto que está aberto no momento. 59 60

-• Save All – Para salvar todos os arquivos que estão abertos nas abas. 61 62

-• Cut – Recortar algo no formulário. 63

-• Copy – Para copiar algo do projeto. 64 65

-• Paste – Para colar algo que foi copiado. 66 67

-• Find – Serve para procurar algo no projeto. 68

Page 4: Visual Basic

69

-• Coment – Comentário para fora as linhas selecionadas. 70 71

-• Uncoment – (Não Conheço) 72 73

-• Undo – Desfazer algo. 74 75

-• Redo – Refazer algo. 76 77 -•Start Debugging – Para você fazer um teste do projeto, para ver se deu algum debug. 78 79 -•Break All – Para pausar o teste de projeto. 80 81 -•Stop Debugging – Para parar o teste de projeto. 82 83 -•Step Into – Pisar em...(Tradução do Google) 84 85 -•Step Over – Etapa sobre...(Tradução do Google) 86 87 -•Step Out – Etapa para fora...(Tradução do Google) 88 89 -•Solution Explorer – Explora os projetos apresentados. 90 91 -•Properties Window – Propriedades da Janela. 92 93 -•Object Browser – Importar algum objeto do browser. 94 95 -•ToolBox – Caixa de ferramente, para adicionar labels, botões, etc. 96 97 -•Error List – Mostra a lista dos erros encontrados. 98 99 • 4 – È o menu superior onde você pode, salvar, abrir, iniciar um novo projeto, etc. 100 • 5 – È tipo o Windows Explorer, com todas as partes do seu projeto dividida. 101 • 6 – Nesse local, são as propriedades do ferramenta utilizada, onde pode mudar, adicionar imagem, 102 mudar fonte, cor das letras, etc. 103 • 7 – Aí são as abas, onde ficam guardadas os projetos abertos ao mesmo tempo. 104

Page 5: Visual Basic

VB 2005 - Criando um Formulário de Pedidos com os 105

Assistentes 106

107

Neste artigo eu vou mostrar como você pode criar um formulário para efetuar o pedido de 108 venda de um produto em uma aplicação Windows Forms usando somente os assistentes de 109 configuração para Data Source. 110

Suponha que você tenha que criar um formulário de pedidos para vendas em uma aplicação 111 Windows Forms usando o VB 2005 Express Edition. 112

O modelo relacional das tabelas usadas pelo sistema é o seguinte: 113

Nota: Não vou entrar no mérito do modelo nem nos detalhes de criação do banco de dados, 114 das tabelas e dos relacionamentos. É importante efetuar a modelagem de forma correta 115 definindo as chaves primárias as chaves estrangeiras e os relacionamentos. 116

A representação do modelo relacional acima, feito para as tabelas usadas neste artigo, foi 117 obtido a partir do diagrama do banco de dados criado na IDE do Visual Basic 2005 Express 118 Edition. Abaixo temos a figura onde exibimos o diagrama criado: 119

Page 6: Visual Basic

Além disso você terá que criar uma interface que irá usar, como tabelas principais, as tabelas 120 Pedido e Itens, e que deverá receber os pedidos dos clientes e discriminar os itens destes 121 pedidos. 122

Para saber mais leia o artigo : VB.NET - Usando DataBase Diagrama 123

Abra o Visual Basic 2005 Express Edition e crie uma nova aplicação Windows Forms com o 124 nome Vendas. 125

Você deverá criar um banco de dados contendo as tabelas com a estrutura acima. No exemplo 126 mostrado neste artigo o banco de dados é identificado pelo nome livraria.mdf. 127

Altere o título do formulário form1.vb para Pedidos. Abaixo você tem uma visão do projeto 128 no VB 2005. 129

Page 7: Visual Basic

Vamos incluir um novo Data Source selecionando a partir do menu Data ou da janela Data 130 Source a opção Add New Data Source... 131

Na janela do Assistente de configuração para Data Source selecione a opção Database pois 132 estaremos efetuando a conexão um banco de dados relacional SQL Server. 133

Page 8: Visual Basic

134

Escolha a seguir a conexão com a fonte de dados. Se ela não existir clique no botão New 135 Connection e selecione o tipo da fonte de dados e sua localização; 136

Em seguida será apresentada a janela contendo os objetos do banco de dados livraria.mdf, 137 expanda o objeto Tables e selecione as tabelas Itens e Pedido, pois vamos trabalhar somente 138 com essas tabelas e altere o nome do dataset que será gerado para PedidosDS; 139

Page 9: Visual Basic

Na janela DataSource você verá o DataSet - PedidosDS exibindo as tabelas itens e Pedido. 140 Perceba que a tabela Pedido possui um vinculo com a tabela Itens decorrente do 141 relacionamento feito pela chave pedidoID; 142

A janela Solution Explorer também exibe o DataSet onde é possível visualizar o esquema 143 criado com base nas tabelas do banco de dados. 144

Page 10: Visual Basic

Na janela Data Sources vamos expandir a tabela Pedido e alterar o modo de exibição de 145 alguns dos seus campos, para isso basta selecionar o campo e escolher a opção desejada a 146 partir do menu; 147

• clienteID altere o modo para ComboBox 148 • formaPagamentoID altere para o modo ComboBox 149

A seguir vamos definir o modo de visualização dos campos da tabela como Details. Clique na 150 tabela e selecione este modo a partir do menu; 151

Arraste e solte a tabela no formulário form1.vb do projeto. Você deverá ver cada campo 152 sendo exibido no formato definido no DataSet; verá também a criação dos objetos abaixo na 153 bandeja do formulário; 154

• PedidoDS (dataset) 155 • PedidoBindingSource 156 • PedidoTableAdapter 157 • PedidoBindingNavigator 158

Page 11: Visual Basic

Em seguida, ainda na janela Data Sources, selecione a tabela itens que esta vinculada a 159 tabela Pedido conforme a figura (Não confunda com a tabela Itens que também foi criada no 160 dataset) e altere o modo de exibição para DataGridView 161

Arraste e solte a tabela no mesmo formulário form1.vb , logo abaixo do local onde os itens da 162 tabela pedido foram exibidos; 163

Page 12: Visual Basic

Vamos selecionar o DataGridView criado e clicar na opção Edit Columns; 164

165

Remova o campo PedidoID e selecione a coluna LivroID. Em seguida na propriedade 166 Columntype altere o seu valor para DataGridViewComboBoxColumn e clique em OK; 167

Obs: Para Remover o campo PedidoID selecione o campo e clique no botão Remove. 168

Vamos criar outro Data Source a partir da tabela livros para que possamos usar no formulário 169 de pedidos. A partir da janela Data Sources ou no menu Data Selecionando a opção Add New 170 Data Source , selecione DataBase, aceite a conexão já criada com o banco de dados 171 livraria.mdf e na janela onde são exibidos as tabelas do banco de dados selecione a tabela 172 Livros informando nome LivrosDS para o dataset a ser criado; 173

Page 13: Visual Basic

Vamos repetir o procedimento e criar mais dois novos Data Sources : ClientesDS e 174 PagmentosDS. Iremos usar estes DataSources no formulário de pedidos logo em seguida. 175

Veremos a seguir como usar os Data Sources criados. Lembra que no formulário , alteremos o 176 tipo de coluna do campo LivroID no DataGridView para DataGridViewComboBoxColumn. Pois 177 bem, agora na propriedade DataSource vamos indicar o nome LivrosDS referente ao Data 178 Source que acabamos de criar definindo as propriedades DisplayMember como titulo e 179 ValueMember como livroID; 180

Page 14: Visual Basic

Vamos agora selecionar a comboBox definida para o campo ClienteID e a partir da janela Data 181 Sources arrastar e soltar a tabela Clientes do data source ClientesDS criado. Em seguida 182 repita o procedimento para a comboBox do campo forma pagamento ID arrastando a tabela 183 Pagamentos do data source PagamentosDS; 184

Page 15: Visual Basic

Perceba que na bandeja do formulário os objetos DataSet, BindingSource e TableAdapter 185 são criados para cada Data Source usado no formulário. 186

Execute o projeto pressionando F5 e vejamos o resultado: 187

1- Note que no lugar de exibir o código do livro o DataGridView exibe uma coluna contendo 188 os títulos de cada livro; 189

Page 16: Visual Basic

2- A combobox referente a forma de pagamento agora exibe a descrição do pagamento e não 190 o seu código; 191

3- A combobox referente ao campo ClienteID exibe o nome do cliente; 192

Page 17: Visual Basic

Nota: Eu poderia ter criado um único dataset usando todas as tabelas mas resolvi mostrar 193 esta alternativo que pode ser usada se você pretende usar os data sources criados em mais de 194 um formulário. 195

E temos então o formulário completo pronto para ser usado no cadastramento de pedidos 196 usando um interface amigável que foi criada sem você ter que digitar praticamente nenhuma 197 linha de código. 198

Naturalmente faltou espaço para falar das validações e outros recursos que podem ser usados 199 para tornar a aplicação mais robusta e funcional. Essa é deixa para você atuar melhorando o 200 exemplo acima... 201

Até o próximo artigo VB.NET... 202

203

José Carlos Macoratti 204

Page 18: Visual Basic

VB 2005 - Atualizando dados com TableAdapter 205

206

Como atualizar os dados usando o TableAdapter ? 207

Após você realizar as alterações no seu DataSet você deve enviar os dados para o banco de 208 dados. Lembre-se que um DataSet trabalha no modo desconectado e se você não enviar as 209 atualizações para o banco de dados ele não refletirá as operações feitas no DataSet. 210

Se estiver usando um TableAdapter você deve usar o comando Update deste componente 211 para atualizar as tabelas correspondentes no banco de dados. 212

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.

O componente TableAdapter ira executar os comandos : INSERT, UPDATE E DELETE tendo 213 como base os valores obtidos para a propriedade RowState. 214

A propriedade RowState obtém um dos valores da enumeração DataRowState da classe 215 DataRow. Os valores possíveis para esta enumeração são: 216

Nome do membro Descrição

Added A linha foi adicionada ao DataRowCollection e o método AcceptChanges não foi chamad

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 DataRowimediatamente após ele ter sido criada e para que ela seja adicionada a uma coleç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 última vez.

Estes valores dependem de dois fatores: 217

1. Do tipo de operação que foi realizada na linha; 218 2. Se o método AcceptChanges tiver sido chamado no DataRow; 219

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.

O procedimento exato para atualizar uma fonte de dados pode variar dependendo das 220 necessidades do seu negócio mas sua aplicação deverá realizar os seguintes passos: 221

Page 19: Visual Basic

1. Chamar o método Update do adaptador dentro de um bloco Try/Catch; 222 2. Se uma exceção for capturada, localize a linha de dados que causou o erro; 223 3. Corrija o erro na linha de dados e tente atualizar novamente; 224

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

Para salvar os dados para o banco de dados chame o método Update do TableAdapter 225 passando o nome da tabela que contém os valores que deverão ser escritos no banco de 226 dados. 227

O trecho de código que pode ser usado para realizar tal operação: 228

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

- EndEdit - aplica as alterações pendentes a fonte de dados 229 - Update(NortwhindDataSet.Customers) - envia as alterações para o banco de dados, informando o dataset e a 230 tabela a ser atualizada;(Existem outros métodos Updates sobrecarregados onde a assinatura é diferente e com 231 isso os parâmetros informados podem variar) 232

Atualizando tabelas relacionadas 233

Quando você precisar atualizar tabelas relacionadas em um dataset é importante atualizar as 234 tabelas na sequência correta a fim de reduzir a chance de gerar um erro relacionado 235 integridade referencial. 236

Page 20: Visual Basic

A ordem de execução do comando também seguira os índices da coleção DataRowCollection 237 no dataset. Para evitar erros relacionados a integridade dos dados ocorram a melhor maneira 238 é atualizar o banco de dados usando a seguinte sequência: 239

1. Tabela filha - deletar os registros; 240 2. Tabela Pai - inserir , atualizar e deletar registros; 241 3. Tabela Filha - inserir e atualizar registros; 242

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).

Se você esta atualizando duas ou mais tabelas relacionadas deverá incluir toda a lógica de 243 atualização em uma transação. Uma transação é um processo que assegura que todas as 244 mudanças relacionadas feitas no banco de dados tenham sido completadas com sucesso antes 245 de confirmar, através do comando commit, qualquer mudança. 246

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.

Para saber mais sobre transações veja o artigo : 247

• ADO.NET - Usando Transações 248 • ADO - Usando Transações - BeginTrans, CommitTrans e RollBack. 249 • O Processamento de Transações: BeginTrans, CommitTrans e RollBack. 250

A seguir temos um exemplo de realização de tal operação. As etapas a serem cumpridas são : 251

1. Crie três tabelas temporárias para tratar os registros diferentes; 252 2. Chame o método Update para cada subconjunto de linhas usando um bloco try/catch. 253

Se ocorrem erros, verifique e corrija; 254 3. Confirme as alterações para o banco de dados (Commit); 255 4. Libere os recursos alocados quando da criação das tabelas temporárias; 256

O exemplo abaixo trata com as tabelas Orders e Customers. Essas tabelas possui um 257 relacionamento mostrado a seguir: 258

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()

Page 21: Visual Basic

'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

Com isso temos um panorama geral sobre como atualizar dados usando um TableAdapter. 260

Além das instruções InsertCommand, UpdateCommand, and DeleteCommand, o componente 261 é criado com métodos que podem ser executados diretamente no banco de dados. Estes 262 métodos podem ser chamados diretamente para manipular dados. Os métodos são: 263 TableAdapter.Insert, TableAdapter.Update, e TableAdapter.Delete. 264

Page 22: Visual Basic

VB 2005 - Manipulando o DataGridView 265

266

O DataGridView é um controle com 1001 utilidades, flexível e poderoso se comparados com 267 controles grids das versões anteriores do VB (lembra do DBGrid, MSFlexGrid, DataGrid, etc...) 268

269

Embora não seja complicado de usar como toda novidade desperta curiosidade e dúvidas, e, 270 por este motivo este artigo procurar mostrar as maneiras mais comuns e úteis de usar o 271 controle DataGridView. 272

Para começar você vai ter que ter instalado os seguintes recursos: 273

• Visual Basic 2005 Express Edition (Aproveite é grátis) 274

O primeiro passo e abrir o VB 2005 Express e criar uma aplicação Windows Forms via opção 275 File->New Project com o nome de datagridViewTotal 276

Aqui é o ponto de partida para a nossa jornada, vamos lá... 277

Usando DataGridView com Arrays 278

Vamos definir um array chamado vetor com dois elementos e vincular o array ao 279 DataGridView usando a propriedade DataSource: 280

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

Page 23: Visual Basic

50,00"} DataGridView1.DataSource = vetor End Sub

Opa ! mas o que aconteceu ??? O resultado não é o esperado. Por que ? 281

Você esperava que os elementos do array fossem exibidos mas somente o tamanho de cada 282 elemento foi exibido. 283

O motivo deste comportamento é que o DataGridView procura pela primeira propriedade 284 pública do objeto ao qual esta vinculado e a primeira propriedade pública de um array de 285 strings é o tamanho de cada elemento contido no array. 286

Para fazer da maneira correta devemos envolver o array de string em uma classe que exponha 287 propriedades públicas que retornem o conteúdo de cada um dos elementos que desejamos 288 exibir. 289

Podemos fazer isso criando uma classe e definindo um construtor e uma propriedade pública 290 para ter acesso ao valor de cada elemento do vetor: 291

No menu Project -> Add Class selecione o template Class e informe o nome vetor.vb para o 292 nome da classe a seguir inclua o seguinte código na classe: 293

Voltando ao formulário form1.vb e alterando o código para usar a classe criada temos: 294

Page 24: Visual Basic

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

Da mesma forma podemos vincular o controle DataGridView a um objeto mais complexo. 295

Usando DataGridView com DataSets Tipados 296

Um uso muito comum do controle DataGridView é a vinculação a uma tabela de um banco de 297 dados. Podemos efetuar esta tarefa usando um DataSet tipado. 298

Vamos incluir um dataset tipado ao projeto clicando sobre o nome do projeto com o botão 299 direito do mouse e seleciona a opção Add New Item. Na janela selecione o template DataSet 300 e clique Add; 301

Habilite o DataBase Explorer no menu View e localize o banco de dados Northwind.mdf , 302 expanda o objeto Tables e em seguida arraste e solte a tabela Customers no descrito 303 DataSet1.xsd conforme a figura abaixo: 304

Page 25: Visual Basic

No próximo passo vamos vincular o dataset ao DataGridView e podemos fazer isto das 305 seguintes formas: 306

1- Vincular o DataGridView diretamente ao adapter da tabela Customers: 307

Inclua o projeto a seguinte declaração : 308

Imports dataGridViewTotal.DataSet1TableAdapters 309

A seguir inclua um botão de comando no formulário e inclua o código abaixo no evento Click 310 do botão: 311

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

Executando o projeto temos: 312

Page 26: Visual Basic

2- Vinculando o DataGridView a um BindginSource 313

Para este exemplo você deve criar um TableAdapter para a tabela Customers. Para fazer isso 314 inclua um novo DataSet no projeto e arraste a partir da janela DataBase Explorer a tabela 315 Customers do banco de dados Northwind.mdb. 316

A seguir Inclua no projeto a seguinte declaração (se ainda não o fez) : 317

Imports dataGridViewTotal.DataSet1TableAdapters 318

Agora insira um novo botão de comando e no evento Click do botão insira o código: 319

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

Usando o DataGridView com DataSets não tipados 320

Você também pode definir o dataset via código vinculando em seguida o componente ao 321 DataGridView. 322

Primeiro temos que criar e preencher um dataset para em seguida atribuir à propriedade 323 DataSource do DataGridView o dataset gerado. 324

No código estou atribuindo à propriedade DataMember a tabela gerada no dataset. Uma 325 outra maneira de obter o mesmo resultado seria atribuir diretamente a propriedade 326 DataSource a tabela gerada que no caso seria a primeira tabela (pois só temos uma) : 327 ds.tables(0). Neste caso não necessitaríamos de definir o Datamember. 328

Page 27: Visual Basic

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

Obtendo o valor da célula selecionada e Atribuindo a célula 329

atual 330

Para obter o valor da célula clicada pelo usuário em um DataGridView usamos o evento 331 CellEnter: 332

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

Neste código estamos obtendo o valor da célula pelo índice da linha (e.RowIndex) e da coluna 333 (e.ColumnIndex). 334

Se desejar obter valor da primeira coluna quando o usuário selecionar uma linha o código 335 ficaria assim : 336

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

Page 28: Visual Basic

Para atribuir a célula atual via código podemos atribuir um valor a propriedade CurrentCell 338 do DataGridView . No código abaixo estou atribuindo a célula atual como sendo a primeira 339 linha e a segunda coluna ( row=0 e column=1) 340

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

Validando a entrada de dados em uma célula 341

Podemos usar o evento CellValidating para verificar se a entrada de um usuário quando da 342 edição dos dados de uma célula estiver ocorrendo é valida ou não. 343

No exemplo acima iremos efetuar a validação da coluna CompanyName para isso devemos 344 implementar o tratamento dos eventos CellValidating e CellEndEdits. 345

O evento CellValidating ocorre quando a célula perde o foco de entrada habilitando a 346 validação do seu conteúdo. 347

O evento CellEndEdits ocorre quando o modo de edição é encerrado para a atual célula 348 selecionada. 349

No evento CellValidating é onde você determina se o valor de uma célula para um 350 determinada coluna é válida. Se a validação da célula falha defina a propriedade Cancel da 351 classe System.Windows.Forms.DataGridViewCellValidatingEventArgs para true. Isto faz com 352 que o controle DataGridView não permita que o cursor deixe a célula. 353

Definindo a propriedade ErrorText na linha para exibir uma mensagem para o usuário exibe 354 um ícone de erro com uma dica que contém o texto para o erro. 355

Page 29: Visual Basic

No evento CellEndEdit defina a propriedade ErrorText na linha para uma string vazia. Este 356 evento ocorre somente quando a célula existe no modo edit o qual não pode ocorrer se a 357 validação falhar. 358

No exemplo vamos verificar se a coluna CompanyName esta vazia para a entrada do usuário: 359

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

Tratando ocorrências de erros em um DataGridView 360

Podemos efetuar o tratamento de erros para o controle DataGridView usando o evento 361 DataError o qual é disparado quando a fonte de dados detecta uma violação de restrição ou 362 quebra de regra de negócio. 363

A seguir temos um exemplo que quando ocorrer um valor para o campo CustomerID duplicado 364 em uma nova linha ou linha sendo editada o evento DataError irá ocorrer e será tratado pela 365 exibição de uma mensagem que descreve o erro. 366

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

Page 30: Visual Basic

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

Exibindo imagens em células de um DataGridView 367

Podemos exibir uma figura ou um gráfico em uma linha de dados. Para exibir imagens em um 368 controle DataGridView não há muito segredo pois ele trata nativamente qualquer imagem 369 suportada pela classe Image bem como o ormato de imagem OLE usado por alguns banco de 370 dados. 371

Se a fonte de dados do controle DataGridView possuir uma coluna com imagens , elas serão 372 exibida automaticamente exibidas no controle DataGridView. 373

Filtrando e ordenando colunas via código 374

Para filtrar os dados exibidos em um DataGridView podemos usar um objeto DataView. A 375 seguir temos um exemplo onde estamos filtrando os dados para o código do cliente iniciado 376 pela letra B: 377

Nota: Para este exemplo você deve criar um TableAdapter para a tabela Customers. Para 378 fazer isso inclua um novo DataSet no projeto e arraste a partir da janela DataBase Explorer a 379 tabela Customers do banco de dados Northwind.mdb. 380

Você deverá declarar os seguintes namespaces no projeto para que o código abaixo funcione: 381

Imports System.Data.sqlclient 382 Imports datagridviewTotal.DataSet1TableAdapters 383

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 O resultado da execução deste código será: 384

Page 31: Visual Basic

385 O dataView é obtido a partir do adapter chamando o método getData que retorna um DataTable preenchido 386 conforme a consulta SQL definida. 387

No código acima o objeto DataView permite aos usuário incluir novas linhas , via propriedade AllowNew no 388 controle DataGridView e também excluir linhas , via propriedade AllowDelete. 389

Podemos ainda ordenar as linhas especificando o campo e a ordem correspondente que será aplicada usando a 390 propriedade Sort. (ASC ordem ascendente DESC ordem descendente) 391

O filtro é feito pela expressão SQL usando a expressão LIKE via propriedade RowFilter. 392

Uma outra maneira de ordenar colunas é usar o método Sort do próprio controle DataGridView: 393

Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As

Page 32: Visual Basic

System.EventArgs) Handles Button3.Click

DataGridView1.Sort(DataGridView1.Columns(0), System.ComponentModel.ListSortDirection.Descending)

End Sub

O código esta ordenando pela primeira coluna do componente (Columns(0)) usando a ordem 394 descendente. 395

Definindo um texto em ToolTips em células individuais 396

De forma geral usamos o recurso ToolTips para exibir valores em células do DataGridView que 397 são muito pequenas para exibir todo o conteúdo. Podemos reescrever este comportamento de 398 forma a definir textos para ToolTips para células individuais. Isto é útil para exibir informação 399 adicional sobre a célula ou para fornecer ao usuário uma descrição mais detalhada sobre o 400 conteúdo da célula. 401

Para isto eu vou usar o o evento CellFormatting que ocorre quando o conteúdo de uma célula 402 precisa ser formatado para exibição. 403

A tabela Customers não possui um campo muito adequado para um exemplo mais convincente 404 ,vou usar portanto o campo City de e escolher algumas cidades de forma que exibam o nome 405 do pais a qual pertençam. O código é o seguinte: 406

'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

O resultado pode ser visto na figura abaixo: 407

Page 33: Visual Basic

Exibindo uma combobox em uma célula 408

Você pode exibir uma combobox em uma célula de forma a permitir que o usuário selecione 409 valores determinados de uma lista existente. Neste caso você precisa incluir uma ComboBox 410 na célula da coluna desejada. O código abaixo faz exatamente isto usando o controle 411 BindingSource: 412

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

Se você não quiser usar um controle BindingSource pode incluir os itens diretamente no 413 controle DataGridViewComboBoxColumn : 414

Private Sub Form2_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load '---inclui colunas no controle DataGridView---

Page 34: Visual Basic

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 Se você deseja permitir que os usuários possam incluir novos valores no controle ComboBox. 416 Neste caso você terá que fazer o seguinte : 417 418 1-) Usar o evento EditingControlShowing que ocorre quando o usuário vai tentar editar dados 419 no controle Combobox: 420 421 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 Neste código estou verificando se a célula que esta sendo editada é do tipo ComboBox. Neste 423 caso estou definindo o estilo do ComboBox como DropDown de forma que o usuário possa 424 digitar o novo item a ser incluído. 425 426 2-) Usar o evento CellValidating do controle DataGridView que ocorre sempre que o usuário 427 termina de digitar e deixa a célula: 428 429 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 Aqui estou verificando e incluindo o novo item na ComboBox. Para que a inclusão seja 431 possível a propriedade DataSource do coluna DataGridViewComboBoxColumn não pode estar 432 definida; assim não podemos vincular o bindingsource e incluir itens na combobox tendo que 433 usar o código que inclui os dados diretamente na combobox. 434 435

Page 35: Visual Basic

436 Eu poderia estender este artigo, mas são tantos os recursos do DataGridView a explorar que 437 vamos continuar a falar sobre assunto mais adiante... Aguarde. 438

Page 36: Visual Basic

VB.NET 2005 - Agenda com acesso a dados 439

440

Se você esta começando agora a aprender o VB 2005 e tem dúvidas em como criar uma 441 aplicação para acesso a dados que realize as tarefas de incluir, exclui, alterar e listar os 442 dados esta pequena agenda feita no Visual Basic 2005 é exatamente o que você procura: 443 simples , com código sem complicações , realizando as principais tarefas de manutenção (as 444 famosas operações CRUD). 445

Ao estudar esta aplicação você vai aprender a: 446

• Criar um projeto de acesso a dados usando o Microsoft Access; 447 • Criar uma interface com o usuário simples e funcional(Menus de opções com ícones); 448 • Realizar as operações de inclusão, alteração e exclusão de dados; 449 • Trabalhar com exibição de imagens em formulário; 450 • Salvar , remover e exibir as imagens em um banco de dados Access; 451 • Acessar a internet a partir da sua aplicação VB; 452

Vamos usar um banco de dados do Microsoft Access que foi criado com o nome de 453 Agenda.mdb e que possui a tabela Contatos contendo a seguinte estrutura: 454

A aplicação terá apenas dois formulários: o formulário principal que é mostrado abaixo: 455

Page 37: Visual Basic

456 Os namespaces usados na aplicação são: 457 458 Imports System.Data.OleDb 459 Imports System.io 460 Imports System.drawing 461

O banco de dados esta localizado na pasta bin e possui a seguinte definição para a conexão do 462 tipo OledbConnection : 463

Public con As New System.Data.OleDb.OleDbConnection("Provider = Microsoft.jet.OleDB.4.0;Data Source = " & 464 Application.StartupPath & "\Agenda.mdb;") 465

As operações CRUD (Create, Update, Delete) são feitas via comandos SQL : 466

Incluir INSERT INTO Contatos(nome,endereco,fone,celular,email,nascimento,[imagem])VALUES('" & tb1.Text & "','" & tb2.Text & "','" & tb3.Text & "','" & tb4.Text & "','" & tb5.Text & "','" & tb6.Text & "', ?)"

Alterar 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 & "'"

Excluir DELETE * FROM Contatos WHERE nome = '" & cb1.SelectedItem & "'"

O código que faz a chamada a um site da web é o seguinte: 467

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")

Page 38: Visual Basic

End Sub

A cara da projeto em execução para exibição dos dados de um registro é a seguinte : 468

Como estou disponibilizando o código completo creio que já escrevi demais. Baixe os fontes e 469 bom estudo... 470

Page 39: Visual Basic

VB 2005 - Criando uma classe para acesso a dados 471

472

É uma prática recomendável criar uma camada de acesso a dados e encapsular o seu código. 473 Você ganha em produtividade e facilita a manutenção. 474

A seguir apresento algumas sugestões de classes com código de acesso a dados que você pode 475 usar em seus projetos. 476

Abra o Visual Basic 2005 Express e crie um projeto do tipo Windows Application onde serão 477 criadas as classes. 478

No menu Project clique na opção Add Class e na janela Add New Item selecione o template 479 Class informando o nome acessoBD. Será criado o arquivo acessoBD.vb onde podemos criar 480 as nossas classes para acesso a dados. Neste arquivo podemos criar uma ou várias classes. 481

Começamos criando a classe AcessoBD com um construtor vazio e outro construtor onde 482 definimos a string de conexão. O método getConexao retorna a conexão aberta e o método 483 closeConexao fecha a conexão; 484

Page 40: Visual Basic

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

Vamos criar a seguir dois métodos sobrecarregados onde poderemos passar o nome de um 486 procedimento armazenado - Stored Procedure - com parâmetros e no outro uma instrução 487 SQL retornando um DataReader: 488

Page 41: Visual Basic

Veremos a seguir um exemplo de como usar as classes acima em um formulário Windows 489 Forms. 490

Aproveitando o mesmo projeto onde criamos a classe AcessoBD inclua no formulário form1.vb 491 um controle ListBox e um botão de comando. No evento Click do botão de comando inclua o 492 seguinte código: 493

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

Page 42: Visual Basic

'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

O resultado será o preenchimento do ListBox conforme figura abaixo: 494

Vamos agora criar um método que retorna um DataSet e que recebe o nome da stored 495 procedure , o nome do DataTable a ser preenchido e a coleção de parâmetros: 496

Page 43: Visual Basic

Para usar o exemplo acima irei acessar o banco de dados Northwind.mdf e usar a stored 497 procedure CustOrderHist existente. Esta stored procedure possui o parâmetro @CustomerID 498 que deve ser informado para o método juntamente como valor de retorno desejado. O 499 DataTable retornado irá ser exibido em um controle DataGridView no formulário; 500

Page 44: Visual Basic

Nota: A stored procedure CustOrderHist possui o seguinte código: 501

A seguir inclua o código abaixo no evento Load do formulário: 502

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

Page 45: Visual Basic

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

Executando o projeto para a stored procedure CustOrderHist e o cliente ALFKI iremos obter: 503

Note que a classe definida efetua o acesso ao banco de dados SQL Server e que eu não efetuei 504 um tratamento de exceção nas mesmas. Deixo esta tarefa para você (dica: você pode apenas 505 lançar a exceção (throw ex) ). Você pode criar mais métodos ou adaptar os métodos 506 definidos ao seu projeto. 507

Page 46: Visual Basic

VB.NET 2005 - Conectando com objetos de dados 508

509

Este artigo apresenta como criar objetos para gerenciar informações de negócios e em 510 seguida mostra como criar um objeto como fonte de dados para estes objetos. Mostra 511 também como usar TableAdapters para obter dados a partir de um banco de dados e 512 preencher os objetos de dados. 513

O objeto da fonte de dados é criado pela execução do assistente de configuração de fonte de 514 dados selecionando como tipo de dados a opção Object. Depois de completar o assistente as 515 propriedades públicas do objeto estarão disponíveis na janela Data Source para que você 516 possa efetuar a vinculação dos objetos com controles em formulário Windows. 517

As tarefas a serem realizadas neste artigo são as seguintes: 518

• Criar uma novo projeto do tipo Windows Application; 519 • Criar objetos de negócio que vão representar clientes; 520 • Criar e configurar um objeto de fonte de dados na aplicação baseado nos objetos 521

criados acima usando o assistente de configuração de fonte de dados; 522 • Incluir controles em um formulário que serão vinculados aos dados nos objetos 523

definidos; 524 • Criar um dataset com os TableAdapter para mover os dados entre os objetos e o banco 525

de dados; 526 • Preencher os objetos com os dados do banco de dados. 527

Desenhando o cenário para a nossa aplicação: 528

Você possui um banco de dados que contém uma tabela chamada Clientes e deseja criar uma 529 aplicação Windows, usando o VB 2005, para gerenciar os seus dados através da criação de 530 objetos de negócio que representam os Clientes. Deseja também poder exibir em um 531 formulário os dados desta tabela e também preencher os seus objetos de dados com os dados 532 do banco de dados. 533

Nota: Não importa qual seja o seu banco de dados desde que haja um provedor através do 534 qual possamos efetuar uma conexão com ele. Neste artigo eu vou usar o banco de dados 535 Microsoft Access. 536

Na figura abaixo temos a estrutura da tabela Clientes do banco de dados Vendas.mdb : 537

Obs: A tabela foi criada com apenas 3 campos para facilitar o entendimento.

1- Criando um o projeto Windows 538

Abra o Visual Basic 2005 Express Edition e crie um novo projeto do tipo Windows Application 539 chamado vendasNetObjetos; 540

Page 47: Visual Basic

2- Criando os objetos de Negócio : Clientes e Pedidos 541

Vamos criar agora os objetos de negócio que irão representar as informações da tabela 542 Clientes. 543

No menu Project selecione a opção Add Class; 544

Na janela Add New Item selecione o template Class e informe o nome Clientes.vb clicando a 545 seguir no botão Add; 546

A seguir inclua o seguinte código na classe Clientes: 547

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

Page 48: Visual Basic

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

A classe Clientes possui como membros os campos definidos na tabela Clientes. Além disso 548 estamos sobrescrevendo a função ToString para poder exibir o nome do cliente seguido do 549 seu código. 550

Neste ponto já temos a classe Clientes.vb pronta. Ela representa os dados da tabela Clientes. 551

Criando um objeto de fonte de dados 552

Podemos criar uma fonte de dados baseada nos objetos criados previamente através do 553 assistente de configuração de Data Source. Vejamos como fazer isso: 554

• Abra a janela Data Sources clicando no menu Data e escolhendo a opção Show Data 555 Sources; 556

557

Page 49: Visual Basic

• Clique no link Add new Data Source; 558 • Na janela Choose a Data Source Type selecione a opção Object e clique em Next; 559

560

• Na janela Select the Object You Wish do Bind To , expanda o nó vendasNetObjetos e 561 selecione a classe Clientes; 562

563

• Clique no Botão Next > ; 564

Page 50: Visual Basic

565

• Finalmente clique no botão Finish e você verá o objeto Clientes na janela Data 566 Sources; 567

568

Criando o formulário para vinculação dos dados 569

Os controles que serão vinculados ao ao objeto Clientes podem ser criados arrastando os 570 items da janela Data Sources no formulário. Desta forma para criar um formulário com 571 controles vinculados as propriedades do objeto Clientes devemos fazer o seguinte: 572

• Na janela Soluction Explorer, selecione Form1 e clique em View Designer; 573 • Arraste e solte o item Clientes a partir da janela Data Source para o formulário Form1; 574

Page 51: Visual Basic

575

Ao final do processo você verá os controles serem criados no formulário bem com o objeto 576 ClientesBindingNavigator para navegação e o objeto ClientesBindingSource para vinculação 577 dos controles com a fonte de dados. 578

Criando um TableAdapter para carregar os dados da tabela 579

no objeto 580

Para mover os dados entre os objetos e o banco de dados vamos usar o recurso 581 TableAdapters. Para criar um TableAdapter para a tabela Clientes vamos usar o assistente de 582 configuração de Data Source; 583

• A partir do menu Data, selecione a opção Add New Data Source; 584 • Selecione a opção DataBase e clique em Next> ; 585 • Na janela para escolher a conexão de dados clique no botão New Connection e na 586

janela Add Connection selecione o Data Source Microsoft Access DataBase File e 587 selecione o caminho onde o banco de dados esta localizado(no nosso caso 588 c:\dados\Vendas.mdb) 589

• Clique no botão Next> ; 590

Page 52: Visual Basic

591

• Salve a string de conexão com o nome padrão VendasConnectionString e clique no 592 botão Next> ; 593

• Selecione a tabela Clientes e clique no botão Finish; 594

595

Neste momento será criado o dataset VendasDataSet e exibido na janela Data Sources 596 contendo a tabela Clientes; 597

Page 53: Visual Basic

598

Vamos agora incluir instâncias dos objetos ClientsTableAdapters e VendasDataSet ao 599 formulário arrastando e soltando estes objetos a partir da ToolBox para o formulário form1.vb 600 conforme a figura abaixo: 601

602

Page 54: Visual Basic

Se executarmos o projeto neste momento qual será o resultado ? Veja abaixo o resultado 603 obtido: 604

605

Como você pode notar embora tenhamos os objetos criados e as instâncias do dataset e do 606 tableAdapter também criados falta mover os dados da tabela clientes para os controles 607 vinculados no formulário. Para isso teremos que criar uma rotina em nosso projeto para 608 carregar os dados nos objetos usando o TableAdapter. 609

Inclua o código abaixo no formulário form1.vb: 610

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

No código da rotina carregaClientes() criamos um DataTable chamado ClientesDados onde 611 obtemos os dados da tabela Clientes através do método GetData do TableAdapter. Em 612 seguida percorremos o DataTable e atribuímos os valores de cada linha (clientesLinha) ao 613 objeto clienteAtual que é uma instância da classe Clientes. Para finalizar efetuamos a 614 vinculação do objeto via BindingSource para exibir os dados no formulário. 615

Para chamar a rotina criada inclua uma chamada à mesma no evento Load do formulário 616 form1: 617

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load carregaClientes() End Sub

Agora ao executar o projeto o formulário irá exibir os dados permitindo a navegação pelos 618 registros: 619

Page 55: Visual Basic

620

Eu removi os botões para incluir, excluir e alterar os dados visto que não implementei estas 621 funcionalidades no projeto. Isso fica como um melhoramento que você pode fazer e que em 622 artigos futuros estarei abordando. 623

624

625 626