Você está na página 1de 0

I www.juliobattisti.com.

br
CAPTULO 8: VALIDATION SERVER CONTROLS
Jlio Battisti
Aprovado em 30 Exames de
Certicificao Microsoft:
MCP 2000 e 2003, MCP+I, MCSE +I,
MCSE 2000, MCSE 2003, MCSA 2000,
MCSA 2003, MCSD, MCDBA e MCDST
Site: www.juliobattisti.com.br
e-mail: webmaster@juliobattisti.com.br
ASP.NET
Uma Revoluo na
Construo de Sites e
Aplicaes Web
II www.juliobattisti.com.br
ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB
Nota sobre direitos autorais:
Este ebook de autoria de Jlio Battisti, sendo comercializado diretamente atravs do site
www.juliobattisti.com.br ou atravs do site de leiles Mercado Livre: www.mercadolivre.com.br, pelo
usurio GROZA. Nenhum outro usurio, pessoa ou site est autorizado a vender este ebook.
Ao adquirir este ebook voc tem o direito de l-lo na tela do seu computador e de imprimir quantas cpias
desejar. vetada a distribuio deste arquivo, mediante cpia ou qualquer outro meio de reproduo, para
outras pessoas. Se voc recebeu este ebook atravs do e-mail ou via ftp de algum site da Internet, ou
atravs de um CD de Revista, saiba que voc est com uma cpia pirata, no autorizada. A utilizao
de uma cpia pirata, no autorizada, crime de Violao de Direitos Autorais, sujeita a pena de
Cadeia.
O valor cobrado por este arquivo praticamente simblico, pelas horas e horas de trabalho que ele representa.
Novos e-books somente podero ser desenvolvidos pela honestidade de pessoas que adquirem o arquivo
do e-book e no o distribuem livremente para outras pessoas. Se voc recebeu uma cpia deste arquivo
sem t-la adquirido diretamente com o autor, seja honesto, entre em contato com o autor, atravs do e-mail
webmaster@juliobattisti.com.br, para regularizar esta cpia.
Ao regularizar a sua cpia voc estar remunerando, mediante uma pequena quantia, o trabalho do autor
e incentivando que novos trabalhos sejam disponibilizados.
Se voc tiver sugestes sobre novos cursos que gostaria de ver disponibilizados, entre em contato pelo e-
mail: webmaster@juliobattisti.com.br.
Visite periodicamente o site www.juliobattisti.com.br para ficar por dentro das novidades:
Cursos de informtica.
Artigos e dicas sobre Certificaes da Microsoft.
Artigos sobre Carreira e Trabalho.
Dicas de livros e sites sobre diversos assuntos.
Simulados gratuitos, em portugus, para os exames da Microsoft.
PIRATARIA CRIME, COM PENA DE CADEIA. EU AGRADEO
PELA SUA HONESTIDADE. SE VOC COMPROU UMA CPIA
DESTE CURSO, DIRETAMENTE COM O AUTOR, NO
DISTRIBUA CPIAS PARA OUTRAS PESSOAS. SE VOC
RECEBEU UMA CPIA ILEGAL DESTE ARQUIVO, NO
ADQUIRIDA DIRETAMENTE COM O AUTOR JLIO BATTISTI,
ENTRE EM CONTATO E REGULARIZE A SUA CPIA.
III www.juliobattisti.com.br
CAPTULO 8: VALIDATION SERVER CONTROLS
Agradecimentos
Escrever sobre um assunto novo e empolgante como ASP.NET , ao mesmo tempo, estimulante e
desafiador. Estimulante porque representa uma mudana de paradigma e desafiador porque explicar de
uma maneira clara e objetiva um assunto como ASP.NET uma tarefa rdua.
Aos heris, muitas vezes annimos, que se lanaram na aventura de entender o ASP.NET e,
principalmente, divulgar suas descobertas e vitrias, em inmeros sites gratuitos e listas de discusso
da Internet, ficam os meus sinceros agradecimentos. O esprito de colaborao e coleguismo destas
pessoas realmente admirvel.
minha esposa Lu, pelo carinho, amor, dedicao, companheirismo e tolerncia.
dona Lucy, minha me, por sempre me apoiar e ser uma grande admiradora e incentivadora de tudo
o que fao.
A meu Pai, em memria, pelo jeito simples e pacato, que me ensinou a parar e refletir nos momentos
difceis. Aos meus irmos agradeo pelos bons momentos que juntos passamos.
Aos amigos de Boqueiro do Leo, pelas poucas horas de lazer e diverso que pude usufruir neste ano de
tanto trabalho. A vocs gostaria de dizer que sinto sinceras saudades da companhia de todos.
equipe editorial da Axcel por acreditar e produzir mais um trabalho de minha autoria. Tambm no
posso deixar de agradecer aos demais membros da Axcel Books, pela sua pacincia em produzir, corrigir
e revisar mais este trabalho, sempre com sugestes para a melhoria do mesmo.
A Deus por nos dar a inteligncia e a determinao na busca de cada vez fazer as coisas de uma maneira
melhor e mais simples.
Sobre o Autor
Jlio Battisti profissional certificado da Microsoft, tendo sido aprovado em 21 Exames da Microsoft,
com os quais obteve certificaes como: MCP, MCP+I, MCSE 2000, MCSE+I, MCDBA 2000 e MCSD.
Trabalha como Gerente de rede na Secretaria da Receita Federal, e trabalha com o Framework .NET e o
ASP.NET desde a verso Beta 1 do Framework .NET, lanada em Junho de 2000. Tambm autor de
artigos de informtica e trabalha com o desenvolvimento e administrao de Web Sites. Atua como
instrutor de cursos de informtica tanto na Secretaria da Receita Federal como para turmas em
Universidades e outros cursos.
IV www.juliobattisti.com.br
Conhea Outros Livros do Autor Jlio Battisti
Chega ao mercado editorial mais um aguardado lanamento da Axcel Books
Editora - Certificao Microsoft - Guia de Estudos Para o MCSE - Exame 70-
217, onde o autor Jlio Battisti descreve, de forma detalhada e com exemplos
passo-a-passo, todos os tpicos que fazem parte do programa oficial da Microsoft
para o exame de certificao 70-217. A obra apresenta e explica desde os
princpios bsicos, incluindo os fundamentos do Active Directory; passando
por servios tais como DNS, gerenciamento de compartilhamentos, Master Op-
erations, permisses NTFS, Grupos de Usurios, Unidades Organizacionais e
Group Policy Objects, os GPOs; alm de ainda tratar de questes como a
configurao de Auditoria de Objetos, o gerenciamento do Schema, entre outros.
Um curso completo de Active Directory para o Windows 2000 Server
Manual de Estudos Para o Exame 70-217 752 pginas
O livro ensina desde os fundamentos bsicos do Active Directory, passando
pela instalao do Windows Server 2003 e por dicas sobre o projeto,
implementao e migrao do Windows 2000 Server para o Windows Server
2003. Voc aprender, em detalhes, sobre os servios de compartilhamento
de arquivos e impressoras, segurana, como tornar o Windows Server 2003
um servidor Web, aprender sobre os servios de rede: DNS, DHPC, WINS,
RRAS, IPSec, Anlise de Segurana, Group Policy Objects e muito mais.
Confira, vale a pena.
Windows Server 2003 Curso Completo 1568 pginas
Manual de Estudos Para o Exame 70-216 712 pginas
Neste aguardado lanamento da Axcel Books Editora - Certificao Microsoft
- Guia de Estudos Para o MCSE - Exame 70-216, o autor Jlio Battisti descreve,
de forma detalhada e com exemplos passo-a-passo, todos os tpicos que fazem
parte do programa oficial da Microsoft para o exame de certificao. A obra
apresenta e explica desde os princpios bsicos, incluindo os fundamentos do
protocolo TCP/IP; passando por instalao, configurao e administrao do
DNS, DHCP, WINS e RRAS; alm de ainda tratar de questes quanto ao
roteamento, NAT, Certificados Digitais, IPSec, entre outros.
V www.juliobattisti.com.br
O novo mundo do Windows XP, que representa a nova era do sistema
operacional para usurios e administradores est reunido nesta obra. Jlio
Battisti apresenta a nova interface do sistema, completamente redesenhada e
com a experincia de um profissional certificado da Microsoft. Na obra, os
leitores iro aprender a implementar, configurar e utilizar o Windows XP,
desvendando as funcionalidades, alm das configuraes de segurana, de
desempenho e de estabilidade do sistema. O livro aborda ainda toda a parte
de Internet do Windows XP - conectando e usando a Internet; configurando
o firewall de conexo; alm dos novos recursos do correio eletrnico. Veja
tambm os detalhes sobre o Active Directory, as configuraes de rede e
protocolo TCP/IP, criptografia, registry do Windows, entre tantos outros
assuntos. O leitor ainda vai poder contar com um captulo exclusivo e um
simulado com 100 questes/respostas destinados aos interessados no exame
de Certificao 70-270 da Microsoft.
Windows XP Home & Professional 840 pginas
Manual de Estudos Para o Exame 70-290 1021 pginas
SQL Server 2000: Administrao & Desenvolvimento Curso Completo - 816 pginas
O lanamento destinado aos usurios/leitores da verso anterior do SQL
Server, o SQL 7, alm de redes de computadores em geral, Windows 2000
Server, TCP/IP, Bancos de Dados em geral, do Microsoft Access e do Visual
Basic. O leitor aprender na obra destinada do iniciante ao avanado detalhes
sobre o modelo de dados relacional, como instalar o SQL Server 2000 em
diferentes plataformas, alm da criao e administrao de bancos de dados,
tabelas e outros objetos. Aprenda ainda Como criar pginas ASP que acessam
os dados do SQL Server 2000.
Um Manual de Estudos Completo para o Exame 70-290: Gerenciando e Mantendo
um Ambiente Baseado no Windows 2000 Server. (Managing and Maintaining a
Microsoft Windows Server 2003 Environment). Este o exame de Administrao
do Windows 2000 Server, equivalente ao Exame 70-215 para o Windows 2000
Server. O Exame 70-290 um exame obrigatrio para o candidato que deseja obter
a certificao MCSE-2003.UM GUIA INDISPENSVEL PARA QUEM QUER
PASSAR NO EXAME 70-290 Este manual apresenta as seguintes caractersticas:
Curso em Portugus, baseado no Windows Server 2003 em Portugus, Completo,
abrangente, abordando todos os tpicos do programa oficial, Repleto de exemplos
prticos, passo-a-passo, detalhadamente explicados, Simulado com 60 questes,
Questes com respostas e comentrios detalhados.
DISPONVEL S EM PDF
VI www.juliobattisti.com.br
ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB
Sumrio
Introduo: Uma Nova Revoluo no Desenvolvimento de Software? 1
Quem Deveria Ler Este Livro? 2
Equipamento e Software Necessrios 2
Instalando e Testando o IIS 5.0 4
Como Obter e Instalar o Microsoft .NET Framework SDK 9
Configuraes do Servidor Utilizado Neste Livro 12
Uma Viso Geral do Contedo do Livro 13
Hora de Comear 13
PARTE 1: O Framework .NET e a Linguagem C# 14
Captulo 1: Entendendo a Nova Proposta da Microsoft o Framework .NET 15
Introduo 15
O Primeiro Contato com o Framework .NET 16
Apresentando o Conceito de Servios Web Services 16
Apresentando o CLR Common Language Runtime 18
.NET Framework Class Library 19
Um Pequeno Parnteses Para falar mal dos Modelos Anteriores 21
Ai que Saudade do MS-DOS??? 21
Prazer. Eu Sou o Windows! 22
Redes e Internet Mais Problemas (ou Solues) Vista! 23
Modelo em 2 Camadas 23
Aplicaes em 3 Camadas 25
Aplicaes em Quatro Camadas 26
Questes a Considerarmos nos Modelos de 3 ou Mais Camadas Utilizados Atualmente 28
De Volta ao Framework .NET: os Demais Elementos 29
Linguagens Habilitadas ao .NET 29
Um Rpida Apresentao do VB.NET 30
Uma Rpida Apresentao do C# 30
Common Type System 32
Metadata 33
Assemblies 34
Interfaces com o Usurio 35
Windows Forms 35
Web Forms 36
Os Servidores .NET 37
VII www.juliobattisti.com.br
SUMRIO
SQL Server 2000 39
Exchange Server 2000 39
BizTalk Server 2000 39
Commerce Server 2000 40
Application Center 2000 40
Host Integration Server 2000 40
Internet Security and Acceleration Server 2000 40
Mobile Information 2001 Server 40
ADO.NET 41
Concluso 43
Captulo 2: Entendendo o CLR 45
Introduo 45
CLR Common Language Runtime 46
Compilar ou no Compilar, eis a Questo? 47
O Papel dos Metadados (Metadata) 47
Integrao Entre Diferentes Linguagens: Promessa ou Realidade? 47
O Processo de Execuo de Cdigo do CLR 48
Mais Algumas Observaes Sobre o JIT 49
Assemblies 50
Uma Definio em Poucas Palavras 51
Funes do Assembly 51
Componentes do Assembly 52
O que Temos no Manifesto? 54
CTS Common Type System 54
Classificao dos Tipos do CTS 55
.NET Framework Class Library Biblioteca de Classes do Framework .NET 55
Conceitos Bsicos de Orientao a Objetos 60
O que um Objeto? 61
Mensagens 62
Classes 62
Herana 64
Reutilizao de Cdigo 68
Mais Alguns Detalhes Antes de Iniciarmos a Parte Prtica 69
Concluso 72
Captulo 3: Apresentando o C# 73
Introduo 73
Mais uma Linguagem de Programao? 74
Como a cara de um Programa Escrito em C#? 75
VIII www.juliobattisti.com.br
ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB
Tipos da Linguagem C# 82
Value Types 83
O Tipo Struct 86
Os Tipos de Enumerao 90
Reference Types 92
O Tipo String 92
O Tipo Arrays 96
Instrues de Fluxo de Controle no C# 99
Instrues de Seleo 100
A Instruo If 100
A Instruo Switch 105
Instrues de Repetio 109
A Instruo For 110
A Instruo While 114
A Instruo do/while 117
A Instruo Foreach 120
Instrues de Salto (Jump) 123
A Instruo Break 123
A Instruo Continue 123
A Instruo Goto 123
A Instruo Return 124
A Instruo Throw 124
Concluso 124
Captulo 4: Classes, Mtodos, Herana e Polimorfismo com o C# 125
Introduo 125
Operadores e Mais Operadores 126
Built-in Operators 126
Operadores Aritmticos 127
Operador de Incremento: ++ 130
Operador de Decremento 131
Operadores Relacionais e Lgicos 131
Operadores de Atribuio (Assignment) 133
Precedncia de Operadores 134
Classes 137
Para Comear um Exemplo Simples 137
Membros de uma Classe 140
Campos (Fields) 140
Mtodos (Methods) 140
Propriedades (Properties) 141
Constantes (Constants) 141
IX www.juliobattisti.com.br
SUMRIO
Indexadores (Indexers) 141
Eventos (Events) 141
Construtores e Destrutores de uma Classe 141
Modificadores Para os Membros de uma Classe 144
Adicionando Funcionalidade a uma Classe Mtodos 144
O Polimorfismo Posto em Prtica Override 155
Concluso 159
Captulo 5: Tpicos Diversos em C# 160
Introduo 160
A Classe System.Math Operaes Matemticas 161
Campos da Classe System.Math 161
Mtodos da Classe System.Math 162
A Estrutura System.DateTime Datas e Horas 174
Campos da Estrutura System.DateTime 176
Propriedades da Estrutura System.DateTime 176
O Namespace System.IO Operaes com Arquivos e Pastas 178
A Classe System.IO.File Operaes com Arquivos 178
Mtodos da Classe System.IO.File 179
A Classe System.IO.FileInfo Informaes Sobre Arquivos 182
Propriedades da Classe System.IO.FileInfo 182
O Tratamento de Excees 184
Utilizando try e catch 185
Utilizando try e finally 188
Concluso 195
PARTE 2: Fundamentos do ASP.NET 196
Captulo 6: Uma Introduo ao ASP.NET 197
Introduo 197
Mais uma Verso? 197
Uma Introduo Tecnologia ASP 198
Contedo Dinmico na Internet 200
Novidades e Melhorias do ASP.NET 202
Faz Parte do Framework .NET 202
Suporte a Mltiplas Linguagens 202
Menos Cdigo Para Mais Trabalho 203
Separao Entre o Cdigo HTML e o Cdigo ASP 203
Maiores Facilidades Para Criao e Utilizao de Componentes 207
Compatibilidade com Qualquer Navegador 207
X www.juliobattisti.com.br
ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB
Check List Para Acompanhar os Exemplos Deste Livro 207
ASP e ASP.NET Podem Rodar no Mesmo Servidor? 209
Enfim Vamos Iniciar com ASP.NET 209
A Extenso do Arquivo Mudou .aspx 209
Inserindo Cdigo ASP.NET 210
Um Pequeno Exemplo, s Para Comear 212
Exemplo 1 212
Banco de Dados do SQL Server 2000 Para os Exemplos Deste Livro 216
O Segundo Exemplo Conectando com um Banco de Dados 216
Cad o meu Objeto Recordset? 219
Conectando com o Banco de Dados 219
Um Controle Poderoso Para Exibir os Dados 220
Posso Ter um Comando que Ultrapassa uma Linha? 220
O Bom e Velho SQL Continua o Mesmo? 220
Concluso 221
Captulo 7: HTML Server Controls 223
Introduo 223
Uma Classe Chamada Page 224
Eventos ao Carregar uma Pgina ASP.NET 224
A Classe Page 225
Os Eventos da Classe Page 225
As Propriedades da Classe Page 227
Mtodos da Classe Page 234
O Processamento de uma Pgina ASP.NET 235
Manuteno de Estado Fundamental 236
HTML Server Controls 236
Uma Definio Para HTML Server Controls 237
HTML Server Controls Disponveis 238
A Classe Base System.Web.UI.HtmlControls.HtmlControl 238
HTMLForm Control 239
HTMLInputText Control 242
HTMLInputCheckBox 244
HtmlTextArea Control 250
HTMLInputRadioButton Control 251
Controles Para a Criao de Tabelas: HtmlTable, HtmlTableRow e HtmlTableCell Controls 254
O Controle HtmlTable 254
O Controle HtmlTableRow 255
O Controle HtmlTableCell 256
Um Exemplo Prtico 256
HTMLSelect Control 263
XI www.juliobattisti.com.br
SUMRIO
HTMLAnchor Control 267
HtmlInputButton Control 269
HtmlButton Control 270
HtmlImage Control 273
Concluso 277
Introduo 279
Captulo 8: Validation Server Controls 279
Validation Controls: Definio e Propriedades Gerais 280
Como que Utilizamos os Controles de Validao? 281
A Me de Todos? Ou Seria o Pai de Todos? 282
Principais Propriedades da Classe BaseValidator 282
Principais Mtodos da Classe BaseValidator 282
Um Exemplo, s Para Comear 283
O Controle RequiredFieldValidator 287
O Controle CompareValidator 293
O Controle RangeValidator 297
O Controle CustomValidator 300
O Controle RegularExpressionValidator 305
Concluso 308
Captulo 9: Web Form Controls 309
Introduo 309
A Classe Bsica WebControl 310
Principais Propriedades da Classe WebControl 310
Principais Mtodos da Classe WebControl 311
Principais Eventos da Classe WebControl 312
TextBox Web Server Control 312
Label Web Server Control 318
CheckBox Web Server Control 320
RadioButton Web Server Control 324
Button Web Server Control 326
ListBox Web Server Control 329
Table, TableCell e TableRow Web Server Controls 331
Panel Web Server Control 337
Image Web Server Control 343
HyperLink Web Server Control 345
LinkButton Web Server Control 347
ImageButton Web Server Control 350
Concluso 353
XII www.juliobattisti.com.br
ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB
Captulo 10:Acessando Bancos de Dados com ASP.NET Parte 1 355
Introduo 355
Uma Viso Geral do Acesso a Dados 356
Quais as Principais Diferenas do ADO.NET em Relao ao ADO? 358
Bancos de Dados Utilizados nos Exemplos 359
O Banco de Dados do Microsoft Access NorthWind.mdb 359
O Banco de Dados do SQL Server Pubs 360
Uma Introduo ao ADO.NET 362
Informando que Voc Deseja Utilizar Classes de um Determinado Namespace 362
Classe ou Objeto; Objeto ou Classe? 363
Estabelecendo Conexes 363
Estabelecendo uma Conexo com o SQL Server 2000 SqlConnection 364
Estabelecendo uma Conexo com o Microsoft Access OleDbConnection 369
Uma Viso Geral do Processo de Acesso a Dados 374
Criando Objetos Command 376
Retornando Dados com DataAdapter 380
O Objeto DataSet 382
O Objeto DataView 388
Um Pouco Mais Sobre o Controle DataGrid 405
Primeira Maravilha do DataGrid: Paginao 405
Segunda Maravilha do DataGrid: Mais do que um Conjunto de Dados na Mesma Pgina 407
Concluso 413
Captulo 11:Acessando Bancos de Dados com ASP.NET Parte 2 414
Introduo 414
Um tal de Data Binding 415
Maneira Antiga: Criando uma Lista Dinmica com ASP 3.0 415
A Evoluo: Data Binding com ASP.NET. 418
Data Binding de Valores Simples 422
Sintaxe Para o Data Binding 422
Data Binding de Mltiplos Valores. repeated-value-binding 425
O Controle CheckBoxList 425
O Controle DropDownList 434
O Controle RadioButtonList 435
Mais um Pouco Sobre o Controle DataGrid 440
Ordenao com o Controle DataGrid 440
Filtrando Dados com o Controle DataGrid 446
O Controle DataGrid em Detalhes 456
Um Exemplo de Criao Manual de Colunas BoundColumn 460
Implementando Paginao com o Controle DataGrid 465
XIII www.juliobattisti.com.br
SUMRIO
Concluso 473
Captulo 12: Acessando Bancos de Dados com ASP.NET Parte 3 474
Introduo 474
No Esquea, Estamos em um Modelo Desconectado 475
O Objeto DataTable Alteraes nos Dados Desconectados 475
Inserindo, Excluindo e Adicionando Dados com o Objeto DataTable 477
Sincronizando Dados com o Banco de Dados 511
Excluindo Registros a Propriedade DeleteCommand 529
Adicionando Registros a Propriedade InsertCommand 531
Concluso 532
PARTE 3: Conceitos Avanados do ASP.NET e Segurana 533
Captulo 13: Web Services e Visual Studio .NET 534
Introduo 534
Uma Introduo aos Web Services 535
Possveis Utilizaes Para um Web Service 537
O que Diferencia Web Services das Tecnologias de Componentes Como COM ou CORBA? 538
Criando um Web Service 539
Sintaxe Para a Criao de um Web Service 539
Uma Maneira Fcil de Testar a Funcionalidade de um Web Service 541
Proxies: Conceito e Criao 545
Conceito 545
Criando o Proxy Utilizando o Utilitrio Wsdl.exe 546
Compilando o Arquivo CalculosLegais.cs Para Gerar a DLL Correspondente 549
Disponibilizando a DLL Para que a Mesma Possa Ser Utilizada 550
Utilizando o Web Service em uma Pgina ASP.NET 552
O Novo Ambiente Grfico de Desenvolvimento Visual Studio .NET 558
O que h de Novo no Visual Studio .NET 558
Concluso 577
Captulo 14: Segurana de Aplicaes Web com o IIS 5.0 e ASP.NET 579
Introduo 579
Autenticao de Usurios com o IIS 5.0 580
Autenticao Annima 581
Como Definir a Conta Para Acesso Annimo no IIS 5.0 583
Verificando as Configuraes da Conta Para Acesso Annimo no Windows 2000 Server 587
Configurando Permisses NTFS em Pastas do Servidor Web 592
XIV www.juliobattisti.com.br
ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB
Sistemas de Arquivos no Windows 2000 e Permisses NTFS 593
Definindo Permisses NTFS 596
Autenticao Bsica 603
Autenticao Integrada do Windows 604
Autenticao Utilizando Certificados 605
Mapeamento do Certificado Cliente 606
Configurando o Tipo de Autenticao no IIS 606
Mais Configuraes de Segurana do IIS 610
Configurando Opes Gerais de Segurana 610
Configurando de Segurana Para Aplicativos Web no IIS 613
Definindo Restries de Acesso em Nvel de Endereo IP 615
Mecanismos de Segurana do Banco de Dados 619
O que uma Aplicao Web no IIS? 620
Uma Aplicao Cliente/Servidor Tradicional 620
Aplicaes Web um Novo Paradigma 621
O que uma Aplicao Web no IIS? 622
Configuraes de Segurana com o Arquivo Web.Config 629
Impersonation 629
O Arquivo Web.Config 630
Definindo o Tipo de Autenticao 634
Definindo os Usurios e Grupos que Tm Permisso de Acesso Aplicao 634
Concluso 639
Captulo 15: Caixa de Ferramentas do ASP.NET 641
Introduo 641
Criao de Listas Dinmicas 642
Edio de Dados com o Controle DataGrid 655
Acessando Dados de uma Planilha do Excel 667
Um Conceito Importante: Code Behind 670
O Objeto HttpRequest 675
O Objeto HttpResponse 681
Diretivas de Pgina 682
A Diretiva @Page 682
A Diretiva @Import 683
Outras Diretivas 683
Configuraes de Segurana Atravs de Programao 684
Acessando Informaes Sobre o Usurio Autenticado 684
Concluso 691
XV www.juliobattisti.com.br
SUMRIO
Captulo 16: Tratamento de Erros e Gerenciamento de Estado 693
Introduo 693
Tratamento de Erros no Framework .NET 694
Excees e a Classe Exception 694
Revisando as Estruturas Try...Catch...Finally 696
Utilizando try e catch 696
Utilizando try e finally 700
Mltiplos Blocos Catch e Tratamento de Excees Especficas 703
Um Exemplo de Tratamento de Exceo do Tipo SqlException 704
Concluso 709
ANEXO 1: Principais Tags do HTML e Criao de Contas e Grupos no Windows 2000 710
Introduo 710
Um Passeio Pelo HTML 710
Criao de Contas de Usurios e Grupos no Windows 2000 712
A Estrutura Bsica de uma Pgina HTML 712
Relao das Principais Tags do HTML Utilizadas nos Exemplos do Livro 713
As Tags Para Criao de Ttulos 713
Tags Para a Criao de Tabelas 714
Inserindo uma Linha Horizontal 717
Tags Para Formatao Bsica do Texto 717
Formatao de Fonte 719
A Tag <A></A> 720
O Conceito de Contas de Usurios no Windows 2000 722
Alterando Propriedades Importantes das Contas de Usurios 727
Definindo as Polticas de Senhas 734
Grupos de Usurios e Tipos de Grupos Existentes no Windows 2000 Server 737
Criando Grupos de Usurios e Adicionando Usurios aos Grupos 740
Introduo 745
Anexo 2: O Modelo de Dados Relacional 745
Conceitos Bsicos de Bancos de Dados Relacionais 746
Entidades e Atributos 747
O Conceito de Chave Primria 749
Relacionamentos Entre Tabelas 750
Relacionamento do Tipo Um Para Um 751
Relacionamento do Tipo Um Para Vrios 752
Relacionamento do Tipo Vrios Para Vrios 753
Integridade Referencial 754
Normalizao de Tabelas 755
XVI www.juliobattisti.com.br
ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB
Primeira Forma Normal 755
Segunda Forma Normal 756
Terceira Forma Normal 757
Passos Para Projetar um Banco de Dados 758
Concluso 760
ANEXO 3: A Linguagem SQL 761
Introduo 761
Noes Bsicas da Linguagem SQL Structured Query Language 761
Conhecendo o SQL 761
A Instruo SELECT 762
A Instruo UPDATE 769
A Instruo INSERT 771
A Instruo DELETE 771
Comandos Avanados da Linguagem T-SQL 772
Pesquisando Dados em Mltiplas Tabelas Detalhes e Exemplos 772
Tipos de JOIN 774
JOIN com Mais do que Duas Tabelas 776
Utilizando Subconsultas 778
Concluso 781
ANEXO 4: Sites Sobre ASP.NET, C# e XML 782
Introduo 782
Concluso 785
1
INTRODUO
www.juliobattisti.com.br
I NT R ODU O
Uma Nova Revoluo no Desenvolvimento de
Software?
.NET, DOT.NET ou Microsoft.NET, no importa. O fato que uma grande
mudana est acontecendo. Esta mudana tem dois aspectos extremamente
relevantes:
promovida pela Microsoft
uma mudana de Paradigma
Desde Junho de 2000 que a Microsoft vem anunciando a sua iniciativa .NET.
Milhares de artigos j foram escritos sobre esta mais nova empreitada da gigante
de Seattle. A idia bsica por detrs desta iniciativa uma mudana, radical, no
modelo de desenvolvimento, comercializao e utilizao de Software. A iniciativa
.NET a viso da Microsoft para um mundo em que o software passa a ser
comercializado na forma de Servios, os quais so acessados atravs da Internet,
utilizando-se protocolos padro como XML (Extensible Markup Language) e
SOAP (Simple Object Access Protocol).
So muitos os elementos que do suporte ao .NET, dentre os quais destacam-se
uma linha de servidores conhecidos como Servidores .NET, o sistema operacional
Windows 2000 e suas futuras verses, alm de um novo conjunto de ferramentas
de desenvolvimento, conjunto este batizado de Visual Studio Next Generation ou
comercialmente conhecido como Visual Studio .NET.
Um mundo em que o Software visto como servios, os quais podem ser acessados,
atravs da Internet, por qualquer computador ou dispositivo autorizado, no
nenhuma novidade ou inveno da Microsoft. Empresas como IBM, Sun e ORA-
CLE possuem suas prprias ferramentas e iniciativas nesta direo, algumas in-
clusive em estgios bastante avanados de desenvolvimento.
A plataforma .NET a aposta da Microsoft nesta
direo. Porm todos sabemos que nenhuma
empresa no mundo sabe divulgar to bem suas
iniciativas e produtos como a Microsoft. Quando o
.NET foi anunciado em Junho de 2000, os elementos
que davam suporte iniciativa ainda encontravam-
se na verso Beta 1. Em Junho de 2001, portanto
um ano depois, foi lanada a verso Beta 2,
conhecida como Microsoft .NET Framework
SDK. A verso Beta 2 apresentou inmeras
alteraes, inclusive com a retirada de alguns
NOTA: Para uma relao
completa de todas as
alteraes da verso Beta
2 em relao Beta 1,
consulte o seguinte
endereo: http://
www.123aspx.com/
b1to2changes/
default.asp.
2 www.juliobattisti.com.br
ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB
componentes e a substituio por outros, o que fez com que cdigos criados para a verso Beta 1 no fossem compatveis
com a verso Beta 2.
Durante este ano entre o lanamento da verso Beta 1 e da verso Beta 2 , proliferaram inmeros sites na Internet,
com milhares de artigos sobre o .NET. Isso fez com que a iniciativa da Microsoft tivesse uma visibilidade e divulgao
jamais alcanadas por outras empresas. Inmeros livros foram lanados baseados na verso Beta 1, o que indica o
sucesso da iniciativa. Voc j viu algum livro de Excel, por exemplo, baseado em uma verso Beta 1 do Office?
Nesta introduo veremos o que voc precisa para iniciar com os estudos de .NET. Iremos mostrar qual o equipamento
mnimo de que voc dever dispor para poder instalar o Microsoft .NET Framework SDK e acompanhar os exemplos
deste livro. Tambm iremos orient-lo sobre a obteno e instalao do Microsoft .NET Framework SDK.
Quem Deveria Ler Este Livro?
Mesmo que voc no conhea nada sobre .NET, C# ou ASP.NET, voc ser capaz de acompanhar todos os captulos
deste livro. Os captulos foram organizados de tal maneira que os conceitos e exemplos so apresentados em uma
ordem natural e intuitiva. Em outras palavras, procurei imaginar o que faria um leitor que nada conhecesse sobre
.NET, C# e ASP.NET e quisesse iniciar os seus estudos. Com esta idia em mente, procurei organizar os captulos em
uma seqncia que facilitasse o aprendizado de tais tecnologias. O conhecimento da tecnologia ASP pode facilitar e
acelerar o aprendizado de alguns conceitos, porm no um pr-requisito obrigatrio. Ainda que o amigo leitor nada
conhea sobre as verses anteriores do ASP, mesmo assim voc ser capaz de acompanhar todo o contedo deste livro.
Para usurios que j trabalham com as verses anteriores do ASP, o livro oferece a
possibilidade de conhecer os fundamentos bsicos de uma nova linguagem C#, bem
como os elementos bsicos do .NET e a nova verso do ASP ASP.NET.
Em resumo, nos captulos e anexos deste livro, voc encontrar todas as informaes
necessrias para entender o modelo .NET. Tambm apresentaremos os elementos bsicos
da nova linguagem C#. Uma vez conhecendo o modelo .NET e a linguagem C#, estaremos
aptos a criar aplicaes utilizando ASP.NET.
Neste livro estarei utilizando as vrias denominaes, indiscriminadamente.
Equipamento e Software Necessrios
Para acompanhar todos os exemplos propostos no livro, precisamos de um computador com Windows 2000 Server ou
Windows 2000 Professional instalado. O IIS 5.0 Internet Information Services tambm deve estar instalado. Mais
adiante veremos como confirmar se o IIS est instalado e, caso o mesmo no esteja instalado, como proceder
instalao do mesmo.
NOTA: So vrias as
maneiras de se referir
nova plataforma .NET da
Microsoft: DOT.NET, .NET,
Plataforma .NET,
Iniciativa .NET, Frame-
work .NET
3
INTRODUO
www.juliobattisti.com.br
A configurao mnima necessria depende de uma srie de fatores, conforme descrito
a seguir.
Se o equipamento vai ser utilizado como um servidor Web na Internet, vrios so os
aspectos a serem considerados, tais como:
Aplicaes implementadas e recursos de hardware necessrios, tais como memria,
disco e processador.
Nmero estimado de acessos simultneos e dirios, sendo esta uma das estimativas
mais difceis de se obter, uma vez que o sucesso de um site pode ser determinado
por um nmero muito grande de fatores, nem todos de fcil mensurao.
Grau de segurana necessrio e desejvel. Neste caso, entram questes como criptografia,
uso de certificados digitais, criao de VPN Virtual Private Networks (Redes Privadas
Virtuais), procedimentos de recuperao falha, plano de contingncia, etc.
Percentual de folga desejado para recursos tais como: memria, processador, disco. Ao projetar um site,
bastante comum utilizar hardware que atenda as necessidades atuais com uma certa folga, para que seja possvel
atender a crescimentos maiores do que os estimados. Alguns sites famosos j enfrentaram problemas de
crescimentos maiores do que o esperado. Quando isso acontece, mais recursos de hardware precisam ser
adicionados com o site em funcionamento.
Para maiores informaes sobre como planejar a capacidade de hardware para um servidor Web com o IIS 5.0, consulte
o captulo Capacity Planning do livro Internet Information Services Resource Guide, o qual parte integrante do
Windows 2000 Server Resource Kit.
Como equipamento para ser utilizado em casa, ou em um laboratrio de teste na sua empresa, aconselho a seguinte
configurao:
Processador Pentium 450 ou superior.
128 MB de RAM, sendo 256 MB, altamente recomendveis.
6 GB de Disco rgido.
Com menos de 128 MB de RAM, o desempenho, mesmo para uma mquina de testes, fica muito comprometido.
Alm do Windows 2000 Server e do IIS 5.0, tambm precisaremos ter os seguintes programas e servios instalados,
para que possamos acompanhar os exemplos deste livro:
Internet Explorer 5.01 ou superior.
Microsoft .NET Framework SDK Beta 2. Veremos como fazer o download e instalar este Framework mais
adiante, nesta introduo.
Em cada um dos captulos, estaremos apresentando uma srie de exemplos prticos. Atravs destes exemplos, voc
poder entender melhor a aplicao dos conceitos tericos apresentados. Em muitas situaes, a melhor maneira de
NOTA: Poderamos
utilizar o Windows 98 ou
Me, porm algumas
opes no estariam
disponveis, uma vez que
o servidor Web para esta
plataforma o PWS
Personal Web Server, o
qual possui um nmero
reduzido de
funcionalidades em
relao ao IIS.
4 www.juliobattisti.com.br
ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB
entender um determinado assunto atravs da utilizao do mesmo para resoluo de um problema prtico do dia-a-
dia. Muitos dos exemplos apresentados podem ser facilmente adaptados para uso em aplicaes que voc esteja
desenvolvendo. Situaes como acesso a Banco de dados atravs de pginas Web, indexao e pesquisa de contedos,
implementao de mecanismos de segurana, etc.; so comuns na maioria das aplicaes Web atuais. Agora vamos
verificar se o IIS 5.0 est instalado e, caso o mesmo no esteja, aprenderemos a fazer a instalao.
Instalando e Testando o IIS 5.0
Caso voc no tenha instalado o IIS 5.0, quando da instalao do Windows 2000 Server ou Professional, possvel
fazer a instalao a qualquer momento. Agora aprenderemos, passo a passo, a instalar o IIS 5.0. Nunca demais
lembrar que, sem o IIS 5.0, no ser possvel testar os exemplos prticos, propostos neste livro.
Para instalar o IIS 5.0:
1. Faa o logon no Windows 2000 Server ou Professional.
2. Abra o Painel de controle (Iniciar -> Configuraes -> Painel de controle).
3. Abra a opo Adicionar ou remover programas.
4. Surgir a janela indicada na Figura 1.
Figura 1: A janela Adicionar ou remover programas.
5. No lado esquerdo da janela, d um clique na opo Adicionar ou remover componentes do Windows.
5
INTRODUO
www.juliobattisti.com.br
6. Surgir a janela indicada na Figura 2.
7. D um clique no boto Componentes.
8. Ser exibida, por breves instantes, uma mensagem Aguarde.... Depois surge a janela Assistente de componentes
do Windows, conforme indicado na Figura 3.
9. Utilizando o Assistente de componentes do Windows, podemos adicionar novos servios, ou remover servios
que no sejam mais necessrios.
10. V descendo com a barra de rolagem vertical, at localizar o item Internet Information Services (IIS), conforme
indicado pela Figura 4.
Figura 2: A janela para alterar a instalao do Windows.
Figura 3: O Assistente de componentes do Windows.
6 www.juliobattisti.com.br
ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB
11. Se esta opo estiver marcada, o IIS 5.0 j est instalado. Neste caso clique no boto Cancelar. Depois s fechar
a janela Adicionar ou remover programas e o Painel de controle.
12. Se esta opo estiver desmarcada, significa que o IIS 5.0 no foi instalado quando da instalao do Windows
2000. Marque esta opo para instalar o IIS 5.0.
13. Observe que, ao marcar a opo, o boto Detalhes habilitado. O IIS 5.0 formado por uma srie de componentes
e funcionalidades. Existe um servidor de pginas Web (servidor HTTP), um servidor de ftp, um servidor de
notcias (NNTP), etc.
Figura 4: Servio Internet Information Services (IIS).
14. Ao instalarmos o IIS 5.0, podemos escolher um ou mais dos seus componentes,
dependendo das necessidades do nosso site. No necessrio que todos os
componentes do IIS 5.0 sejam instalados. Por exemplo, se o servio de cpia de
arquivos no for necessrio, no temos por que instalar o servio de ftp.
15. Clique no boto Detalhes.
16. Na lista de opes disponveis, certifique-se de que somente as seguintes esto
marcadas:
Arquivos comuns.
Documentao.
Extenses de servidor do FrontPage 2000.
Gerenciador de Internet Services (HTML).
Servidor File Transfer Protocol (FTP).
Servidor World Wide Web.
DICA: Instale somente os
servios realmente
necessrios. No uma boa
idia instalar todos os
servios disponveis, mesmo
que somente alguns sejam
utilizados. Quanto mais
servios instalados, maiores
as possibilidades de ataque
e quebra da segurana do
site, por parte de um
hacker, alm de consumir
memria e processador
desnecessariamente.
7
INTRODUO
www.juliobattisti.com.br
Snap-In do Internet Information Services.
17. Observe que, aps ter selecionado os componentes a serem instalados, o Windows 2000 Server exibe o espao em
disco necessrio, conforme indicado pela Figura 5.
18. D um clique em OK. Voc estar de volta ao Assistente de componentes do Windows.
Figura 5: Indicao do espao necessrio no disco rgido.
19. D um clique no boto Avanar para ir para a prxima etapa do assistente.
20. O Windows 2000 Server exibe uma janela indicando o progresso da Instalao.
21. Caso o Windows 2000 Server no encontre os arquivos necessrios instalao, no Disco rgido, voc ser
solicitado a inserir o CD de instalao do Windows, conforme indicado pela Figura 6.
Figura 6: Mensagem solicitando o CD de instalao do Windows.
22. Insira o CD e d um clique em OK. O Windows 2000 inicia o processo de cpia dos arquivos.
23. Depois de concluda a cpia dos arquivos, o Assistente emite uma mensagem dizendo que o processo foi concludo
com sucesso.
8 www.juliobattisti.com.br
ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB
24. D um clique no boto Concluir, para encerrar o Assistente.
25. Voc estar de volta janela Adicionar ou remover programas. D um clique no boto Fechar para sair desta janela.
26. Voc estar de volta ao Painel de controle. Feche o Painel de controle.
27. Agora o IIS 5.0 est instalado e pronto para funcionar.
Agora que j temos o IIS 5.0 instalado, vamos testar se o mesmo est funcionando corretamente.
Para testar se o IIS 5.0 foi instalado com sucesso:
1. Abra o Internet Explorer.
2. Digite o seguinte endereo: http://localhost.
3. Deve surgir uma janela conforme indicado na Figura 7.
Figura 7: A pgina padro do IIS 5.0, logo aps a instalao.
4. Esta a pgina inicial padro, do IIS 5.0, logo aps a instalao.
5. Isto comprova que o IIS 5.0 foi instalado com sucesso.
6. Feche o Internet Explorer.
Agora que j temos o IIS 5.0 instalado e testado, temos que partir para a instalao do Microsoft .NET Framework
SDK. Este Framework instala todos os componentes necessrios para que possamos criar pginas ASP.NET, utilizar
a linguagem C#, alm de todos os demais componentes necessrios para o .NET. importante salientar que o Visual
9
INTRODUO
www.juliobattisti.com.br
Studio .NET no faz parte deste Framework. No Captulo 13 veremos a instalao e configurao do Visual Studio
.NET. No momento em que este livro estava sendo escrito, o Visual Studio .NET encontrava-se em Beta 2.
Como Obter e Instalar o Microsoft .NET Framework SDK
Para que seja possvel a criao de pginas ASP.NET no IIS 5.0 precisamos instalar o Microsoft .NET Framework
SDK. O mesmo pode ser obtido a partir do site da Microsoft, para Download, no seguinte endereo: http://
msdn.microsoft.com/downloads/default.asp?url=/downloads/sample.asp?url=/msdn-f iles/027/000/976/
msdncompositedoc.xml&frame=true
Neste endereo temos a opo de baixar um arquivo nico, com 126 MB ou dividir o download em diversas partes,
conforme indicado na Figura 8.
Figura 8: Pgina para download do Microsoft .NET Framework SDK.
10 www.juliobattisti.com.br
ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB
Se voc optar pelo download do arquivo completo, aps concludo o download voc ter um arquivo chamado Setup.exe
de 126 MB. Este o arquivo completo para a instalao do Framework .NET. Mais adiante veremos como proceder
instalao deste arquivo.
Para que o Microsoft .NET Framework SDK Beta 2 possa ser instalado com todas as suas funcionalidades, voc
tambm precisa instalar MDAC Microsoft Data Access Components 2.7, Beta 2. Voc pode fazer o download desta
verso do MDAC, no seguinte endereo: http://download.microsoft.com/download/platformsdk/MDAC2.7/1.0/
NT45XP/EN-US/MDAC_TYP_dnld.exe
O arquivo MDAC_TYP_dnld.exe possui cerca de 5MB. Antes de instalar o Framework .NET vamos instalar o MDAC
2.7 Beta 2.
Para instalar o MDAC 2.7 Beta 2 faa o seguinte:
1. Localize o arquivo MDAC_TYP_dnld.exe que voc copiou anteriormente.
2. D um clique duplo no mesmo para iniciar a instalao do MDAC 2.7.
3. Surge uma tela com o contrato de licena de uso do MDAC 2.7. D um clique no boto Yes para aceitar o contrato.
4. Surge uma tela perguntando em que pasta temporria voc deseja descompactar os arquivos. Digite C:\temp e d
um clique no boto OK. Os arquivos necessrios sero descompactados na pasta C:\temp.
5. V para a pasta C:\temp e execute o arquivo MDAC_TYP.EXE.
6. Surge uma tela onde voc precisa marcar uma caixa de controle para concordar com o contrato de licena. Marque
esta caixa de controle, conforme indicado na Figura 9 e d um clique no boto Avanar.
Figura 9: Contrato de licena para o MDAC 2.7.
11
INTRODUO
www.juliobattisti.com.br
7. Se existir algun servio que ser atualizado, em uso, o assistente de instalao avisa e pede para que o respectivo
servio seja parado. Para parar um servio voc pode utilizar o comando Iniciar -> Programas -> Ferramentas
Administrativas -> Servios.
8. Aps a verificao dos servios ser exibida uma tela informando que o MDAC 2.7 ser instalado. D um clique
no boto Concluir e a instalao ser iniciada.
9. Dentro de poucos minutos surge uma tela informando que o MDAC 2.7 foi instalado com sucesso. D um clique
no boto Close, para fechar esta tela.
Aps a instalao do MDAC 2.7, estamos prontos para iniciar a instalao do Microsoft .NET Framework SDK.
Para instalar o Microsoft .NET Framework SDK faa o seguinte:
1. Localize o arquivo Setup.exe que voc copiou anteriormente.
2. D um clique duplo no mesmo para iniciar a instalao.
3. Surge uma tela perguntando se voc deseja iniciar a instalao. D um clique no boto Sim para seguir adiante.
4. O programa de instalao iniciar a extrao dos arquivos necessrios instalao. Este procedimento demora
alguns minutos.
5. Encerrada e extrao, surgir a tela inicial do assistente de instalao. D um clique no boto Next para seguir
para a prxima etapa.
6. Na segunda etapa voc precisa marcar a opo I accept the agreement, para aceitar o contrato de licena do
Framework .NET e seguir adiante.
7. Marque a opo I accept the agreement e d um clique no boto Next para ir para a prxima etapa.
8. Nesta etapa temos a opo the instalar o SDK (Software Development Kit) que o Framework .NET propriamente
dito, os exemplos. Observe que a opo para instalar a Documentao j vem marcada e no pode ser desmarcada.
9. Por padro todas as opes j vm marcadas. Vamos aceitar este padro. D um clique no boto Next para ir para
a prxima etapa.
10. Nesta etapa devemos def inir a pasta de destino. Por padro selecionada a pasta: \Arquivos de
programas\Microsoft.NET\FrameworkSDK\ do drive onde est instalado o Windows 2000. Vamos aceitar a pasta
sugerida pelo Setup. D um clique no boto Next para ir para a prxima etapa.
11. Nesta etapa iniciada a instalao dos diversos componentes. Este processo demora alguns minutos. medida
que os componentes vo sendo instalados, o andamento da instalao vai sendo exibido, conforme indicado na
Figura 10.
12. No final surge uma mensagem dizendo que a instalao foi completada com sucesso. D um clique no boto OK
para fechar esta mensagem.
Agora o Microsoft .NET Framework est instalado e pronto para ser utilizado. Com isso instalamos todo o Software
necessrio para acompanhar os exemplos deste livro.
Apenas para confirmar, podemos verificar se a instalao ocorreu com sucesso. Selecione o comando Iniciar ->
Programas -> Microsoft .NET Framework SDK. Dentre as vrias opes exibidas selecione a opo Documentation.
12 www.juliobattisti.com.br
ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB
Esta opo nos d acesso Documentao completa sobre a plataforma .NET. A verso sempre atualizada desta
documentao pode ser encontrada no site MSDN da Microsoft, no seguinte endereo: http://msdn.microsoft.com/net
Figura 10: Andamento da instalao.
Configuraes do Servidor Utilizado Neste Livro
Para criar os exemplos deste livro, utilizei um servidor com as seguintes configuraes:
Pentium 450
256 MB RAM
Windows 2000 Server em Portugus
IIS 5.0
Microsoft .NET Framework SDK
Nome do servidor: Servidor
Endereo IP: 10.204.123.1
Mscara de sub-rede: 255.255.255.0
Domnio DNS: groza.com
O endereo para acessar a pgina inicial do servidor o seguinte: http://www.groza.com ou http://localhost. Sempre
que for feita referncia a um destes dois endereos, voc deve substituir pelo endereo do equipamento que voc est
utilizando para acompanhar os exemplos deste livro.
13
INTRODUO
www.juliobattisti.com.br
Uma Viso Geral do Contedo do Livro
O livro est dividido em trs partes, conforme descrito a seguir:
Parte 1 Captulos 1 a 5: Nesta parte trataremos sobre o Framework .NET, o que o mesmo apresenta de novo,
quais os seus principais componentes e como o mesmo pode tornar mais fcil, rpido e eficiente o
desenvolvimento de aplicaes. Tambm veremos os fundamentos bsicos da nova linguagem C# (leia-se C
Sharp).
Parte 2 Captulos 6 a 12: Veremos o que o ASP.NET, quais as novas caractersticas e como criar pginas
ASP.NET. Aprenderemos a conectar pginas com Bancos de Dados, utilizando ADO.NET e tambm a hierarquia
de classes do Framework .NET.
Parte 3 Captulo 13 em diante: Nesta parte final do livro veremos alguns exemplos de aplicativos utilizando
ASP.NET bem como diversas tcnicas e dicas teis para a criao de aplicativos com ASP.NET. Vamos aprender
a instalar o Visual Studio .NET e utiliz-lo para a criao e publicao de pginas ASP.NET. Veremos o que
so e como criar Web Services. Tambm trataremos sobre segurana.
Hora de Comear
Agora que j temos o nosso computador preparado para acompanhar os exemplos deste livro, hora de iniciarmos o
nosso aprendizado. Conforme veremos, o .NET representa uma mudana radical em relao aos modelos de programao
anteriores. Aprender um novo modelo uma tarefa desafiadora. Lembram do programador COBOL para o Main-
frame tendo que aprender programao estruturada e, depois, tendo que passar de programao estruturada para
orientao a objetos?
Se voc est justamente querendo aprender os conceitos deste novo modelo, ento este o livro certo. Apresentaremos
as principais dvidas para aqueles que esto iniciando com o .NET e com ASP.NET.
O cdigo-fonte para os exemplos em C# e para as pginas ASP.NET dos captulos deste livro esto disponveis para
download no site da editora Axcel Books em www.axcel.com.br.
Caso voc tenha sugestes sobre tpicos que gostaria de ver includos em futuras edies deste livro, ou queira relatar
algum erro encontrado no livro, basta entrar em contato atravs do e-mail: livroaspnet@juliobattisti.com.br.
Desejo a todos uma boa leitura e tenho certeza de que este trabalho ir ajud-los no entendimento deste novo paradigma
de programao, bem como ir ajud-los a, rapidamente, criar aplicaes Web baseadas em ASP.NET.
14 www.juliobattisti.com.br
ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB
P A R T E
1
O Framework .NET e a Linguagem C#
15
CAPTULO 1: ENTENDENDO A NOVA PROPOSTA DA MICROSOFT O FRAMEWORK .NET
www.juliobattisti.com.br
C A P T U L O
1
Entendendo a Nova Proposta
da Microsoft o Framework
.NET
Introduo
Neste captulo apresentaremos o Framework .NET. Veremos qual a proposta da
Microsoft com mais esta iniciativa.
Iniciaremos o captulo com uma viso geral, de alto nvel, sobre as propostas do
Framework .NET. Em outras palavras: A que veio e a que se prope o .NET?
Vamos mostrar quais os principais componentes e quais solues pode nos oferecer
o Framework .NET. Antes de entrarmos nos detalhes sobre cada elemento e das
funes de cada elemento, importante entendermos como este novo modelo
poder ajudar no desenvolvimento de Software e, em conseqncia, ajudar as
empresas a terem sistemas melhores, mais rpidos, mais econmicos e mais
sintonizados com as reais necessidades de cada empresa.
Uma vez devidamente apresentado o Framework .NET, falaremos sobre os
modelos atuais de desenvolvimento e utilizao de Software. Veremos quais os
problemas do modelo atual e quais as solues propostas para estes problemas,
pelo Framework .NET.
Um novo paradigma de desenvolvimento tem que mostrar que capaz de re-
solver, se no todos, pelo menos a grande maioria dos problemas dos modelos
existentes. J passou o tempo, se que um dia esta prtica foi aceitvel, de mudar
de tecnologia somente para estar atualizado com o mercado. Aprender novas
tcnicas e ferramentas envolve tempo, um longo aprendizado e, principalmente,
pesados investimentos financeiros. Para que uma empresa esteja disposta a fazer
todos estes investimentos, o Framework .NET ter que demonstrar que realmente
capaz de apresentar solues para os grandes problemas dos modelos atuais de
desenvolvimento de software.
Em seguida passaremos a apresentar os principais elementos que compem o
Framework .NET:
CLR Common Language Runtime
Metadata
Assemblies
Linguagens habilitadas ao .NET
Common Type System
Interoperabilidade entre diferentes linguagens
Web Services
Os servidores .NET
ADO.NET
16 www.juliobattisti.com.br
ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB
Veremos, de uma maneira genrica, o papel de cada um destes componentes no Framework .NET. Estaremos estudando,
detalhadamente, cada um destes itens nos demais captulos deste livro. Apresentamos uma viso geral de cada um
deles, para que o leitor j possa ter uma idia do Framewok .NET e de seus principais componentes, bem como da
funo de cada um.
Este captulo, embora bastante terico, forma a base para o entendimento dos conceitos apresentados ao longo de todo
o livro. Por isso importante que voc entenda os conceitos apresentados. A documentao atualizada, sobre os
conceitos apresentados, pode ser consultada no seguinte endereo: http://msdn.microsoft.com/net.
O Primeiro Contato com o Framework .NET
Definir exatamente o que o Framework .NET no uma tarefa das mais simples. Como no sou muito afeito a
definies formais, vou mostrar qual a proposta do Framework .NET, quais os componentes e qual a funo de cada
componente.
Em primeiro lugar podemos afirmar que, com a iniciativa .NET, a Microsoft est mudando radicalmente o modelo de
desenvolvimento e utilizao de software. No livro Introducing .NET, da editora Wrox (www.wrox.com), encontramos
duas afirmaes interessantes sobre o Framework .NET:
uma mudana to grande ou at maior do que a mudana do DOS para o Windows;
O Framework .NET foi todo projetado j tendo a Internet como objetivo, diferente de outras plataformas que
foram adaptadas para a Internet, medida que a rede mundial crescia de importncia.
Apresentando o Conceito de Servios Web Services
Realmente a mudana bastante grande. Programadores, analistas e gerentes de projeto precisaro de muito estudo e
tempo para absorver os conceitos desta nova plataforma. Tambm verdade que, desde a sua concepo, o .NET foi
projetado para a Internet. Em muitas publicaes especializadas aparece a seguinte afirmao: A iniciativa .NET a
viso da Microsoft de um mundo onde o Software se transforma em servios, na verdade pequenos componentes que
podem ser utilizados por qualquer aplicao.
Um software de uma empresa brasileira pode utilizar um servio que est residente em um servidor de uma empresa
do Japo, desde que tenha permisses para isso. Este servio pode oferecer, por exemplo, a funcionalidade para
validao de uma transao via carto de crdito. Um dispositivo mvel, como um celular WAP ou um Handled,
pode utilzar um servio de cotao de aes de um servidor da bolsa de valores de Londres. E como todos estes
componentes fazem para se comunicar? Evidentemente que atravs da Internet. Por isso a Internet como ponto
principal do projeto .NET.
Conforme veremos mais adiante, estes servios, que podem ser acessados via Internet ou atravs de qualquer Intranet,
so chamados de Web Services.
17
CAPTULO 1: ENTENDENDO A NOVA PROPOSTA DA MICROSOFT O FRAMEWORK .NET
www.juliobattisti.com.br
Ao invs de programas monolticos, em que toda a funcionalidade necessria faz parte do prprio programa,
construiremos programas como se fosse um jogo de montar. As diversas funcionalidades necessrias ao programa
podem ser oferecidas atravs do acesso a servios j implementados. Na Figura 1.1 temos uma pequena ilustrao
deste conceito.
No site da empresa www.minhaempresa.com, criamos, por exemplo, uma pgina ASP.NET para venda de livros. O
preo dos livros est em dlares e deve ser convertido para a moeda do pas do cliente, no momento da compra. No
exemplo da Figura 1.1, a pgina ASP.NET utiliza um Web Service do servidor www.cotacoes.com, para obter a
cotao atualizada do dlar em relao moeda do pas do cliente. A pgina ASP.NET recebe esta informao, faz os
clculos necessrios e exibe para o cliente. O prximo passo efetivar a venda. Agora o cliente digita o nmero do seu
carto de crdito. Para validar o nmero do carto de crdito do cliente, acessado um outro Web Service, o qual est
instalado no servidor www.validacao.com.
Figura 1.1: Um programa que utiliza diversos servios.
Com esta arquitetura, a criao de software fica bastante simplificada, uma vez que podemos agregar ao nosso programa
funcionalidades disponibilizadas atravs de Web Services que esto instalados em qualquer servidor da Internet.
Desta maneira somente precisamos criar o que especfico do nosso programa. Com isso estamos reaproveitando
cdigo ou como preferem os puristas: reutilizando cdigo.
Como diferentes Web Services, criados por diferentes empresas, podero se comunicar e trocar informaes? Esta
comunicao possvel, porque todo programa criado para a plataforma .NET utiliza um padro para troca de
informaes. No caso temos dois padres:
18 www.juliobattisti.com.br
ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB
Para o formato dos dados, o Framework .NET utiliza XML Extensible Markup Language. Conforme veremos
mais adiante, o XML vem ganhando fora como um padro para troca de informaes na Internet, principalmente
para troca de informaes entre empresas em sites de Comrcio Eletrnico.
Como protocolo de transporte, o Framework .NET utiliza o SOAP Single Object Access Protocol. Com
SOAP podemos fazer com que toda a comunicao entre diferentes Web Services e demais componentes de
um programa seja feita atravs do protocolo padro da Internet que o HTTP. O SOAP no um protocolo
criado pela Microsoft para ser utilizado pelo .NET. O SOAP um padro da indstria, sendo utilizado por
produtos de diversas empresas, como IBM, Sun e ORACLE.
Pode parecer que no existe nada de novo nesta abordagem, pois tecnologias para criar programas a partir de componentes
prontos j existem h um bom tempo: COM+, CORBA, etc. Porm a grande vantagem dos Web Services, no Frame-
work .NET, que os mesmos podem ser acessados, facilmente, atravs da utilizao de um protocolo padro: SOAP e
trocando informaes em um formato padro: XML. Esta abordagem torna a criao e utilizao dos Web Services
uma tarefa muito mais simples do que, por exemplo, a criao de componentes COM+ ou CORBA, os quais utilizam
formatos de dados e protocolos de comunicao proprietrios.
Falaremos mais sobre Web Services e tambm aprenderemos a cri-los, mais adiante neste livro.
Apresentando o CLR Common Language Runtime
O CLR um ambiente de execuo, e poderamos at dizer que o Corao do .NET, o qual d suporte a todas as
linguagens de programao habilitadas para o .NET. Ao instalarmos o Microsoft .NET Framework SDK, temos
disponveis as seguintes linguagens:
VB.NET (Visual Basic .NET)
C# (leia-se C Sharp)
ASP.NET
Jscript.NET
O Runtime (ambiente de execuo) o ambiente que d suporte execuo das aplicaes .NET. Quando um programa
.NET executado, todo o controle do mesmo feito atravs do CLR.
Para aplicaes anteriores, desenvolvidas utilizando COM/COM+, o programador era responsvel por inserir no cdigo
do programa uma srie de funes necessrias ao correto funcionamento do mesmo, como por exemplo o Gerenciamento
de memria, criao e destruio de objetos. A codificao destas funes no era uma tarefa fcil, o que exigia muito
tempo do programador, alm de conhecimentos avanados. Com aplicaes .NET, todas estas funes so executadas
pelo CLR, ou seja, o programador no precisa preocupar-se com as mesmas. Desta forma somente precisamos nos
preocupar com a funcionalidade do nosso programa, o que poupa tempo e agiliza o processo de desenvolvimento.
As aplicaes criadas em uma das linguagens habilitadas para o .NET (como VB.NET, C# ou ASP.NET), ao serem
compiladas, geram um cdigo intermedirio conhecido como MSIL Microsoft Intermediate Language, o qual
abreviado simplesmente como IL Intermediate Language. Este cdigo que executado pelo CRL. Vamos analisar
o diagrama apresentado na Figura 1.2:
19
CAPTULO 1: ENTENDENDO A NOVA PROPOSTA DA MICROSOFT O FRAMEWORK .NET
www.juliobattisti.com.br
Figura 1.2: O ambiente de execuo do CLR.
A partir da Figura 1.2 temos algumas observaes importantes:
Para que uma linguagem seja habilitada ao .NET, o seu compilador deve ser capaz de gerar cdigo MSIL.
O Cdigo MSIL gerado executado pelo CRL.
A prpria Microsoft no nega que a idia bastante semelhante ao ambiente de execuo para aplicaes desenvolvidas
em Java, onde temos um ambiente de execuo comum a Mquina Virtual Java, a qual executa byte code, que o
cdigo gerado pelas aplicaes Java.
Todas as linguagens habilitadas ao .NET tm a sua disposio um rico conjunto de classes e objetos, os quais fornecem
desde conexo com banco de dados at funes mais especficas, como funes grficas, de escrita em disco, etc. Este
conjunto de classes e objetos conhecido como .NET Framework class library.
Todo cdigo habilitado a rodar no CLR, ou seja, que pode ser compilado para MSIL conhecido como managed
code ou cdigo gerenciado. Cdigo antigo, como por exemplo COM ou COM+, os quais no esto habilitados para
rodar sob controle do CLR so chamados de unmanaged code ou cdigo no gerenciado. Veremos mais detalhes a
respeito destas definies no Captulo 2, onde trataremos o CLR em mais detalhes.
.NET Framework Class Library
Este o segundo elemento fundamental do Framework .NET. A .NET Framework class library (biblioteca de classes do
Framework .NET), como o prprio nome sugere, uma coleo de classes ou tipos completamente integrada com o
ambiente de execuo CLR. Quando falamos em um conjunto de Classes, estamos utilizando o conceito originado no
modelo de Programao Orientado a Objetos. Conforme veremos no decorrer deste livro, o Framework .NET fortemente
baseado nos conceitos de orientao a objetos, principalmente nos conceitos de Classes, Herana e Polimorfismo.
20 www.juliobattisti.com.br
ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB
Os programas criados em qualquer linguagem habilitada ao .NET podem utilizar este conjunto de tipos e classes. Por
exemplo, existe uma classe chamada System.Data, a qual oferece uma srie de objetos e mtodos para acesso s mais
variadas fontes de dados. Vamos a um exemplo mais especfico: existe uma classe chamada System.SqlCliente (na
verso Beta 1 existia uma classe chamada System.SQL, que foi descontinuada na verso Beta 2), a qual fornece uma
srie de mtodos para acesso nativo aos dados de um servidor Microsoft SQL Server. Podemos utilizar a classe
System.SqlCliente em um programa feito em VB.NET, C#, em uma pgina ASP.NET ou qualquer linguagem que
venha a ser habilitada para o .NET.
Ao fornecer um conjunto de classes e tipos, estamos facilitando a vida do programador, uma vez que grande parte da
funcionalidade necessria fornecida diretamente pelo Framework .NET e, o principal, utilizada de uma maneira
padronizada, pois a maneira de utilizar uma classe da biblioteca de classes do .NET a mesma, independente da linguagem.
So muitas as funes disponibilizadas pela biblioteca de classes do .NET, conforme veremos no decorrer deste livro.
Apenas a ttulo de exemplo, vamos citar algumas funes disponibilizadas:
NOTA: J existem
diversos fabricantes
trabalhando para
habilitar suas linguagens
de desenvolvimento para
o Framework .NET.
Manipulao de String
Conectividade com banco de dados
Acesso a arquivos
Segurana
Manipulao de dados
Na Figura 1.3, temos uma viso geral dos principais elementos que formam o Framework .NET.
Figura 1.3: Principais elementos do Framework .NET.
21
CAPTULO 1: ENTENDENDO A NOVA PROPOSTA DA MICROSOFT O FRAMEWORK .NET
www.juliobattisti.com.br
Um Pequeno Parnteses Para falar mal dos Modelos Anteriores
Vamos falar um pouco sobre o modelo de desenvolvimento atual, mais especificamente sobre o modelo baseado em
COM/COM+ da Microsoft. Para falar sobre este assunto vamos fazer um histrico sobre o desenvolvimento, desde os
bons e velhos tempos do MS-DOS.
Ai que Saudade do MS-DOS???
No, no saudade da poca do MS-DOS, apenas uma breve recapitulao. Para desenvolver aplicaes para o
ambiente MS-DOS, utilizamos diversas linguagens de programao, tais como:
Clipper
Pascal Turbo Pascal
Basic
C Turbo C
C++
Um programa para o ambiente MS-DOS, na grande maioria das vezes, era composto por um arquivo executvel (.exe).
Os demais arquivos necessrios ao funcionamento do programa, tais como imagens grficas ou arquivos de dados,
eram salvos, normalmente, no mesmo diretrio (na poca do MS-DOS no falvamos em Pastas) do arquivo executvel
e tudo funcionava perfeitamente bem.
Para instalar o programa em outro computador, bastava copiar o diretrio do programa e pronto, nada mais precisava
ser feito. Podemos ver que o processo de instalao era bastante simplificado, mas em contrapartida o desenvolvimento
era todo manual e as funcionalidades bastante limitadas. As redes locais ainda no eram realidade e a grande maioria
dos programas era feito para trabalhar em um nico computador, acessando dados locais.
Comunicao entre programas, reaproveitamento de cdigo e acesso via rede eram coisas raras ou inexistentes. Para
as necessidades da poca, era um modelo plenamente satisfatrio. A maior prova disso que, ainda hoje, facilmente
encontramos programas feitos em Clipper, para o ambiente MS-DOS, rodando em pequenos estabelecimentos, dando
suporte a todas as operaes dirias. Tente voc propor que estas pessoas substituam seus programas em Clipper, que
atendam perfeitamente s necessidades destes pequenos estabelecimentos, por programas para Windows com inter-
face grfica. Com certeza voc receber um sonoro NO.
Porm logo as redes comeariam a invadir as empresas, os programas a tornar-se mais complexos. Com o advento das
redes e do sucesso dos PCs, mais e mais pessoas comearam a utilizar computadores. A velha interface a caracter do
MS-DOS no atendia mais as necessidades. Neste momento que o Windows comea a surgir no mercado.
22 www.juliobattisti.com.br
ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB
Prazer. Eu Sou o Windows!
Com a chegada do Windows tivemos a popularizao das interfaces grficas e de termos como: mouse, cone, atalho
e janelas. As ferramentas para desenvolvimento no ambiente Windows custaram a chegar. No incio, a programao
tinha que ser feita em linguagem C, utilizando as APIs (Application Program Interface) do Windows.
Com o lanamento do Visual Basic 1.0 teve incio a era das ferramentas grficas para desenvolvimento de programas
para o Ambiente Windows.
Com o Windows j passou a existir o conceito de Instalar o programa. A instalao do programa no se limitava a uma
simples cpia de arquivos. Ao instalar um programa no Windows, o mesmo gravava uma srie de informaes de
configurao: no Windows 3.x em arquivos .ini e no Windows 9x na Registry do Sistema Operacional. Alm destas
informaes de configurao, partes do programa eram disponibilizadas no formato de arquivos .DLL (Dynamic Link
Library). Falando assim parecia um modelo, digamos, bastante elegante. Um local centralizado para informaes
sobre configurao e o programa dividido em partes menores, que no conjunto forneciam a funcionalidade do programa.
Porm o modelo de programao para o Windows comeou a apresentar uma srie de inconvenientes. Vamos falar
destes inconvenientes, atravs de exemplos:
Se alguma das configuraes, necessrias ao funcionamento do programa, fosse alterada, o programa deixava
de funcionar. Isto gerava uma chamada ao pessoal de suporte que, na maioria das vezes, somente conseguia
resolver a situao reinstalando o programa.
Os arquivos .DLL poderiam ser utilizados por mais do que um programa. Pode acontecer uma situao em que
um programa que esteja sendo instalado substitua uma determinada .DLL por uma verso mais nova do que a
verso da .DLL atualmente existente no sistema. O problema que podem existir programas que dependam da
verso mais antiga. Nesta situao os programas que dependem da verso mais antiga simplesmente deixaro
de funcionar. Pode tambm acontecer o contrrio, ou seja, um programa que est sendo instalado substitui uma
.DLL por uma verso mais antiga, fazendo com que outros programas deixem de funcionar. Em situaes mais
crticas poderia acontecer de o programa que est sendo instalado substituir uma .DLL vital para o Windows.
Nestas situaes todo o sistema deixaria de funcionar e, em alguns casos, somente uma reinstalao poderia
resolver o problema.
Vejam que o que parecia uma boa soluo acabou se mostrando um verdadeiro pesadelo para gerenciar e manter
em funcionamento. Nesta poca surge, inclusive, a expresso DLL Hell, que poderamos traduzir por: O
Inferno das DLLs.
Cada vez que um programa fosse alterado, o mesmo precisaria ser reinstalado em todos os computadores onde
fosse necessria a nova verso. E se, ao fazer a atualizao para a nova verso, fosse substituda alguma .DLL
necessria ao funcionamento de algum outro programa? Novos problemas para o pessoal do suporte. Vejam
que este modelo gera uma grande carga de suporte, o que encarece muito a manuteno em funcionamento de
uma estao de trabalho da empresa.
23
CAPTULO 1: ENTENDENDO A NOVA PROPOSTA DA MICROSOFT O FRAMEWORK .NET
www.juliobattisti.com.br
Redes e Internet Mais Problemas (ou Solues) Vista!
Com o advento das redes como uma realidade nas empresas e com a exploso da Internet como uma plataforma vivel
para fazer negcios, os modelos de desenvolvimento de aplicaes sofreram profundas mudanas.
Primeiro, com as redes, foi a poca da febre em descentralizar as estruturas de TI e migrar para o modelo Cliente/
Servidor, baseado em redes locais. Neste modelo, tambm conhecido como modelo de duas camadas, temos um ou
mais equipamentos de maior capacidade de processamento, atuando como Servidores. Nas estaes de trabalho dos
usurios, conhecidas como clientes, so instalados programas, que fazem acesso a recursos residentes nos servidores.
O exemplo mais tpico de aplicao Cliente/Servidor seria uma aplicao desenvolvida em Visual Basic ou Delphi, a
qual acessa dados de um servidor SQL Server 2000, instalado em um servidor da rede. Na Figura 1.4, temos uma
viso geral do modelo Cliente/Servidor.
Vamos falar um pouco mais sobre o modelo de duas camadas.
Figura 1.4: O modelo Cliente/Servidor.
Modelo em 2 Camadas
No incio da utilizao do modelo Cliente/Servidor, as aplicaes foram desenvolvidas utilizando-se um modelo de
desenvolvimento em duas camadas. Neste modelo, um programa, normalmente desenvolvido em um ambiente de
desenvolvimento, como o Visual Basic, Delphi ou Power Builder, instalado em cada estao de trabalho Cliente.
Este programa acessa dados em um servidor de banco de dados, conforme ilustrado na Figura 1.5.
Neste modelo, temos um programa que instalado no Cliente. Programa esse que faz acesso ao banco de dados que
fica residente no Servidor de Banco de dados. Na maioria dos casos, a mquina do cliente um PC rodando Windows,
e a aplicao Cliente desenvolvida utilizando-se um dos ambientes conhecidos, conforme citado anteriormente.
24 www.juliobattisti.com.br
ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB
Figura 1.5: O Modelo de desenvolvimento em duas camadas.
Sendo a aplicao cliente um programa para Windows (na grande maioria dos casos), a mesma deve ser instalada em
cada uma das estaes de trabalho da rede. o processo de instalao normal, para qualquer aplicao Windows. No
modelo de 2 camadas, a aplicao Cliente responsvel pelas seguintes funes:
Apresentao: O cdigo que gera a interface visvel do programa faz parte da aplicao cliente. Todos os
formulrios, menus e demais elementos visuais esto contidos no cdigo da aplicao cliente. Caso sejam
necessrias alteraes na interface do programa, faz-se necessria a gerao de uma nova verso do programa,
e todas as estaes de trabalho que possuem a verso anterior devem receber a nova verso, para que o usurio
possa ter acesso s alteraes da interface. A que comeam a surgir os problemas no modelo em 2 camadas:
uma simples alterao de interface suficiente para gerar a necessidade de atualizar a aplicao, em centenas
ou milhares de estaes de trabalho. O gerenciamento desta tarefa algo extremamente complexo e oneroso
financeiramente.
Lgica do Negcio: As regras que definem a maneira como os dados sero acessados e processados so
conhecidas como Lgica do Negcio. Fazem parte das Regras do Negcio, desde funes simples de validao
da entrada de dados, como o clculo do dgito verificador de um CPF, at funes mais complexas, como
descontos escalonados para os maiores clientes, de acordo com o volume da compra. Questes relativas a
legislao fiscal e escrita contbil tambm fazem parte da Lgica do Negcio. Por exemplo, um programa
para gerncia de Recursos Humanos, desenvolvido para a legislao dos EUA, no pode ser utilizado, sem
modificaes, por uma empresa brasileira. Isso acontece porque a legislao dos EUA diferente da legislao
brasileira. Em sntese, as regras para o sistema de recursos humanos so diferentes. Alteraes nas regras do
negcio so bastante freqentes, ainda mais com as repetidas mudanas na legislao do nosso pas. Com isso,
faz-se necessria a gerao de uma nova verso do programa, cada vez que uma determinada regra muda, ou
quando regras forem acrescentadas ou retiradas. Desta forma, todas as estaes de trabalho que possuem a
verso anterior devem receber a nova verso, para que o usurio possa ter acesso s alteraes. Agora temos
mais um srio problema no modelo de 2 camadas: qualquer alterao nas regras do negcio suficiente para
25
CAPTULO 1: ENTENDENDO A NOVA PROPOSTA DA MICROSOFT O FRAMEWORK .NET
www.juliobattisti.com.br
gerar a necessidade de atualizar a aplicao, em centenas ou milhares de computadores. O que j era complicado
piorou um pouco mais.
Com a evoluo do mercado e as alteraes da legislao, mudanas nas regras do negcio so bastante freqentes.
Com isso, o modelo de duas camadas demonstrou-se de difcil manuteno e gerenciamento, alm de apresentar um
TCO Total Cost Ownership (Custo Total de Propriedade) bastante elevado.
A outra camada, no modelo de 2 camadas, o Banco de dados, o qual fica armazenado no Servidor de banco de dados.
Sempre que um determinado modelo apresenta problemas, aparentemente intransponveis, a indstria de informtica
parte para a criao de novos modelos. Em busca de solues para os problemas do modelo de duas camadas que
surgiu a proposta do modelo de 3 camadas, conforme analisaremos a seguir.
Aplicaes em 3 Camadas
Como uma evoluo do modelo de 2 camadas, surge o modelo de trs camadas. A idia bsica do modelo de 3
camadas retirar as Regras do Negcio, da aplicao Cliente e centraliz-las em um determinado ponto, o qual
chamado de Servidor de Aplicaes. O acesso ao banco de dados feito atravs das regras contidas no Servidor de
Aplicaes. Ao centralizar as Regras do Negcio em um nico ponto, fica muito mais fcil a atualizao das mesmas.
A Figura 1.6 nos d uma viso geral do modelo em 3 camadas:
Figura 1.6: O modelo de desenvolvimento em trs camadas.
Todo o acesso do cliente, aos dados do servidor de Banco de dados, feito de acordo com as regras contidas no
Servidor de Aplicaes. O cliente no tem acesso aos dados do servidor de Banco de dados, sem antes passar pelo
servidor de aplicaes. Com isso, as trs camadas so as seguintes:
26 www.juliobattisti.com.br
ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB
Apresentao: Continua no programa instalado no cliente. Alteraes na Interface do programa ainda iro
gerar a necessidade de atualizar a aplicao em todas as estaes de trabalho, onde a aplicao estiver sendo
utilizada. Porm cabe ressaltar que alteraes na interface so menos freqentes do que alteraes nas regras
do negcio.
Lgica: So as regras do negcio, as quais determinam de que maneira os dados sero utilizados e manipulados.
Esta camada foi deslocada para o Servidor de Aplicaes. Desta maneira, quando uma regra do negcio for
alterada, basta atualiz-la no Servidor de Aplicaes. Aps a atualizao, todos os usurios passaro a ter
acesso nova verso, sem que seja necessrio reinstalar o programa em cada um dos computadores da rede.
Vejam que, ao centralizar as regras do negcio em um Servidor de Aplicaes, estamos facilitando a tarefa de
manter a aplicao atualizada. As coisas esto comeando a melhorar.
Dados: Nesta camada temos o servidor de Banco de dados, no qual reside toda a informao necessria para o
funcionamento da aplicao. Cabe reforar que os dados somente so acessados atravs do Servidor de
Aplicao, e no diretamente pela aplicao cliente.
Com a introduo da camada de Lgica, resolvemos o problema de termos que atualizar a aplicao, em centenas ou
milhares de estaes de trabalho, toda vez que uma regra do negcio for alterada. Porm continuamos com o problema
de atualizao da interface da aplicao, cada vez que sejam necessrias mudanas na Interface. Por isso que surgiram
os modelos de n-camadas.
No prximo tpico, iremos falar um pouco sobre o modelo de 4 camadas.
Aplicaes em Quatro Camadas
Como uma evoluo do modelo de trs camadas, surge o modelo de quatro camadas. A idia bsica do modelo de 4
camadas retirar a apresentao do cliente e centraliz-la em um determinado ponto, o qual na maioria dos casos um
servidor Web. Com isso o prprio Cliente deixa de existir como um programa que precisa ser instalado em cada
computador da rede. O acesso aplicao, feito atravs de um Navegador, como, por exemplo, o Internet Explorer
ou o Netscape Navigator. A Figura 1.7 nos d uma viso geral do modelo em quatro camadas.
Para acessar a aplicao, o cliente acessa o endereo da aplicao, utilizando o seu navegador, como no exemplo:
http://intranet.minhaempresa.com/sistemas/vendas.aspx.
Todo o acesso do cliente ao Banco de dados feito de acordo com as regras contidas no Servidor de aplicaes. O
cliente no tem acesso ao Banco de dados, sem antes passar pelo Servidor de aplicaes. Com isso temos as seguintes
camadas:
Cliente: Neste caso o Cliente o Navegador utilizado pelo usurio, quer seja o Internet Explorer, quer seja o
Netscape Navigator, ou outro navegador qualquer.
Apresentao: Passa para o Servidor Web. A interface pode ser composta de pginas HTML, ASP, PHP, Flash
ou qualquer outra tecnologia capaz de gerar contedo para o navegador. Com isso alteraes na interface da
aplicao so feitas diretamente no servidor Web, sendo que estas alteraes estaro, automaticamente,
disponveis para todos os Clientes. Com este modelo no existe a necessidade de reinstalar a aplicao em
27
CAPTULO 1: ENTENDENDO A NOVA PROPOSTA DA MICROSOFT O FRAMEWORK .NET
www.juliobattisti.com.br
todos os computadores da rede. Fica muito mais fcil garantir que todos esto tendo acesso verso mais
atualizada da aplicao. A nica coisa que o cliente precisa ter instalado na sua mquina o navegador.
Figura 1.7: O modelo de desenvolvimento em quatro camadas.
Lgica: So as regras do negcio, as quais determinam de que maneira os dados sero utilizados. Esta camada
est no Servidor de Aplicaes. Desta maneira, quando uma regra do negcio for alterada, basta atualiz-la no
Servidor de Aplicaes. Aps a atualizao, todos os usurios passaro a ter acesso nova verso, sem que
seja necessrio reinstalar o programa em cada estao de trabalho da rede. Vejam que, ao centralizar as regras
do negcio em um Servidor de Aplicaes, estamos facilitando a tarefa de manter a aplicao atualizada.
Dados: Nesta camada temos o servidor de Banco de dados, no qual reside toda a informao necessria para o
funcionamento da aplicao.
Com o deslocamento da camada de apresentao para um Servidor Web, resolvemos o problema de termos que
atualizar a aplicao, em centenas ou milhares de computadores, cada vez que uma interface precisar de alteraes.
Neste ponto a atualizao das aplicaes uma tarefa mais gerencivel, muito diferente do que acontecia no caso do
modelo em 2 camadas.
Os servidores de Aplicao, Web e banco de dados no precisam necessariamente ser servidores separados, isto ,
uma mquina para fazer o papel de cada um dos servidores. O conceito de servidor de Aplicao, servidor Web ou
servidor de Banco de dados um conceito relacionado com a funo que o servidor desempenha. Podemos ter, em um
mesmo equipamento, um Servidor de aplicaes, um servidor Web e um servidor de Banco de dados. Claro que
questes de desempenho devem ser levadas em considerao.
Tambm podemos ter a funcionalidade do Servidor de Aplicaes distribuda atravs de vrios servidores, com cada
servidor tendo alguns componentes que formam parte das funcionalidades da aplicao. Este modelo onde temos
28 www.juliobattisti.com.br
ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB
componentes em diversos equipamentos conhecido como Modelo de Aplicaes Distribudas. Tambm podemos
colocar os componentes em mais do que um servidor para obtermos um melhor desempenho, ou redundncia, no caso
de um servidor falhar.
Questes a Considerarmos nos Modelos de 3
ou Mais Camadas Utilizados Atualmente
Muitas so as vantagens dos modelos de 3 ou mais camadas, em relao facilidade de gerenciamento e atualizao
das aplicaes. Mas, se tudo funciona to bem, por que precisamos de um novo modelo de programao leia-se
Framework .NET?
Para responder a pergunta anterior, vamos continuar colocando alguns problemas com o modelo de desenvolvimento
em uso atualmente, que o modelo de n-camadas, com aplicaes que utilizam componentes distribudos atravs de
diversos servidores: Servidor Web, de aplicaes, de Banco de dados, etc.
O modelo de programao atual, para o ambiente Windows, fortemente baseado no conceito de componentes. No
exemplo do modelo de 4 camadas, quando uma aplicao cliente acessa uma regra de negcio, esta regra de negcio
implementada na forma de um componente COM/COM+. A regra de negcio pode utilizar um outro componente
para fazer a conexo com o Banco de dados e retornar os dados solicitados pela aplicao. Para que os diversos
componentes possam comunicar-se e trocar informaes, os mesmos precisam de um padro para a troca de mensagens.
O padro determina a estrutura interna do componente e a maneira como cada componente expe suas funcionalidades.
O padro para o ambiente Windows chamado, a partir do Windows 2000, de COM+. Para o Windows NT 4.0 e
verses anteriores, tnhamos o COM/DCOM trabalhando em conjunto com o MTS Microsoft Transaction Server.
Mas se existe um padro para troca de mensagens qual o problema? Acontece que a implementao de componentes
utilizando COM/COM+ no das tarefas mais simples. Se utilizarmos linguagens como o Visual C++, a criao e
disponibilizao de componentes uma tarefa que exige programadores altamente especializados. J com ferramentas
como o Visual Basic e Delphi, a criao de componentes para o padro COM+ um pouco mais fcil. Porm a grande
dificuldade fazer com que componentes implementados em diferentes linguagens sejam capazes de trabalhar em
conjunto e trocar mensagens entre si.
Agora imagine as dificuldades em um ambiente em que devemos criar aplicaes para a Internet, onde deve existir
uma maneira padronizada para que os diversos componentes sejam capazes de se comunicar. A Microsoft, com a sua
iniciativa DNA, procurou disponibilizar informaes para que seja possvel tirar o mximo do modelo COM+, na
criao de aplicaes em n-camadas para a Internet. Porm a prpria Microsoft reconheceu as limitaes e dificuldades
deste modelo, ao propor uma nova revoluo nos mtodos e prticas de desenvolvimento, revoluo essa que atende
pelo singelo nome de .NET.
Outro fator importante a considerar que o padro COM/COM+ um padro proprietrio, desenvolvido pela Microsoft.
Como fazer com que um padro proprietrio possa ser utilizado, sem maiores problemas para aplicaes distribudas
na Internet? Fica muito difcil, para no dizer impraticvel. J com o .NET, conforme comentamos anteriormente,
utiliza-se padres no proprietrios, como XML para os dados e SOAP sobre HTTP como protocolo de transporte.
Desta forma, a comunicao entre Web Services acontece de uma maneira fcil, sem maiores problemas.
29
CAPTULO 1: ENTENDENDO A NOVA PROPOSTA DA MICROSOFT O FRAMEWORK .NET
www.juliobattisti.com.br
Para que um componente COM/COM+ possa ser utilizado, o mesmo precisa ser registrado no servidor que ir
disponibilizar o componente para isso. Ao registrar o componente, so gravadas informaes sobre o mesmo, na
registry do Sistema Operacional. O programador precisa preocupar-se em garantir que o componente seja registrado
corretamente, pois, caso contrrio, o mesmo no poder ser acessado. J os servios do .NET no necessitam de
registro, sendo que toda a informao necessria para que os mesmos funcionem est contida no prprio servio, no
formato de metadados Metadata. Mais adiante falaremos um pouco mais sobre Metadata.
Com componentes COM/COM+, o programador precisa preocupar-se em carregar o componente na memria, retirar
o componente da memria quando o mesmo no for mais utilizado e uma srie de outras funes necessrias ao
funcionamento do componente. Com o .NET, todas estas preocupaes foram transferidas para o Framework .NET.
Isto faz com que o programador somente tenha que codificar a funcionalidade do servio que est sendo desenvolvido,
a parte mais, digamos assim, chata, ser de responsabilidade do Framework .NET, mais especificamente do CLR.
Isso aumenta a produtividade do programador e evita erros mais graves, os quais normalmente fazem com que o
componente no funcione corretamente.
J apresentamos os principais problemas do modelo atual; no restante deste captulo veremos os demais elementos
que compem o Framework .NET e como cada um destes elementos procura solucionar problemas que os modelos
anteriores no foram capazes de resolver.
De Volta ao Framework .NET: os Demais Elementos
Agora vamos falar um pouco mais sobre os diversos aspectos do Framework .NET e como cada um destes aspectos se
prope a solucionar problemas do modelo atual de desenvolvimento.
Linguagens Habilitadas ao .NET
O que significa uma linguagem ser habilitada ao .NET?
Significa que a linguagem capaz de gerar, como resultado da compilao, cdigo MSIL. Uma vez gerado o cdigo
MSIL, o mesmo executado sob o controle do CLR. Ou seja, para o Framework .NET, uma vez gerado o cdigo
MSIL, no importa a partir de qual linguagem o mesmo foi gerado, pois a maneira como o mesmo executado
sempre a mesma.
Juntamente com o Framework .NET, a Microsoft disponibiliza as seguintes linguagens:
Visual Basic .NET (VB.NET)
C++
C#
Podemos criar nossos programas em qualquer uma destas linguagens. Ao compilarmos o programa, o resultado ser
cdigo MSIL, o qual passa a ser executado pelo CLR. Quando a Inprise lanar o Delphi habilitado ao .NET, teremos
30 www.juliobattisti.com.br
ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB
a opo de compilar um programa Delphi para gerar cdigo MSIL. Uma vez gerado o cdigo MSIL, para o CLR no
importa em qual linguagem o programa foi codificado.
Mais adiante, nos captulos 3, 4 e 5 estaremos apresentando uma introduo aos principais elementos da linguagem
C#. Nos captulos restantes do livro, estaremos utilizando a linguagem C# para a criao de pginas ASP.NET.
Um Rpida Apresentao do VB.NET
Com exceo do C# que uma nova linguagem, o VB.NET a linguagem que mais sofreu modificaes em relao
s verses anteriores. Foram introduzidas algumas caractersticas h muito tempo esperadas, tais como:
Foram adicionadas mais caracterstica de orientao a objetos, tais como herana verdadeira, construtores
parametrizados e overriding de mtodos e propriedades.
Mais facilidades para o desenvolvimento de aplicaes Internet. Por exemplo, para criar pginas ASP.NET, ao
invs de VBScript utilizamos diretamente o VB.NET ou o C#.
Herana visual: Esta uma caractersticas que os desenvolvedores do Delphi j tinham h algum tempo. Com
o VB.NET podemos criar um formulrio com as caractersticas bsicas para todos os formulrios da aplicao.
Quando precisarmos de um formulrio com caractersticas adicionais, podemos construir este novo formulrio
baseado, isto , herdando as caractersticas do formulrio bsico; depois s adicionar os elementos necessrios.
Ao criarmos o nosso formulrio, herdando do formulrio bsico, o formulrio que est sendo criado ter,
automaticamente, todos os elementos do formulrio bsico. Alm dos elementos grficos, o cdigo para
tratamento de eventos tambm herdado. O melhor de tudo que, ao alterarmos o formulrio bsico, todas as
alteraes so refletidas nos formulrios herdados. A herana visual facilita, enormemente, a criao de
aplicaes que tenham uma interface consistente e de fcil alterao.
Tratamento estruturado de excees: com o VB.NET, temos muito mais recursos para o tratamento de erros e
excees do que o bom e velho On Error do Visual Basic. Isso faz com que possamos criar programas mais
confiveis.
Falar sobre as novidades do VB.NET assunto para um captulo inteiro. Ensinar o VB.NET: assunto para um livro
inteiro. Em um trabalho futuro estaremos tratando desta nova e excitante verso do VB.
Uma Rpida Apresentao do C#
O C# a nova linguagem da Microsoft, apresentada juntamente com o Framework .NET. O C# foi construdo com
base nos conceitos de Orientao a objetos. As diretivas bsicas para a criao do C# foram as seguintes:
Uma linguagem orientada a objetos e to poderosa quanto o C++.
Uma linguagem to fcil de utilizar quanto o VB.
O pessoal da Microsoft realmente conseguiu aliar estas duas caractersticas em uma s linguagem: Poder e Simplicidade.
Conforme veremos nos captulos 3, 4 e 5, o C# de fcil aprendizagem e utilizao, ao mesmo tempo que nos fornece
poderosos mecanismos, antes s encontrados no C++.
31
CAPTULO 1: ENTENDENDO A NOVA PROPOSTA DA MICROSOFT O FRAMEWORK .NET
www.juliobattisti.com.br
Como no poderia deixar de ser, vamos dar o tradicional exemplo do Hello World !!!, utilizando o C#. Apresentarei o
cdigo e os passos para compilar e rodar o nosso primeiro programa em C#. Nos demais captulos deste livro
aprenderemos mais sobre esta linguagem. Para criar o nosso primeiro programa, utilizaremos o Bloco de Notas do
Windows .
Abra o Bloco de Notas e digite o texto indicado na Listagem 1.1.
Listagem 1.1 Hello World !
using System;
class primeiroprograma
{
// Meu primeiro programa em C#
// O tradicional Hello World !!
public static void Main()
{
string umamensagem = Hello World !!!;
Console.WriteLine(umamensagem);
}
}
Salve este programa no disco com o nome de primeiroprograma.cs. Agora vamos compilar o programa e execut-lo.
Para compilar o programa, abra um Prompt de Comando (Iniciar -> Programas -> Acessrios -> Prompt de comando).
Na janela do prompt v para a pasta onde voc salvou o arquivo hello.cs e execute o seguinte comando:
csc primeiroprograma.cs
Com este comando estamos compilando o arquivo-fonte primeiroprograma.cs, para gerar um executvel .exe. O resultado
deste comando indicado na Figura 1.8, onde utilizamos o comando dir, para mostrar que a compilao gerou o
executvel primeiroprograma.exe.
Para executar o nosso programa, basta digitar primeiroprograma e pressionar Enter. O programa ser executado,
conforme indicado na Figura 1.9.
Bem, por enquanto isto, fizemos apenas uma pequena apresentao da linguagem C#. Teremos trs captulos deste
livro (3, 4 e 5), para tratar desta linguagem. Apenas um ltimo detalhe para o qual gostaria de chamar a ateno:
Observe, para aqueles que conhecem Java ou C++, a semelhana entre a estrutura de um programa em C# e um
programa em uma destas linguagens.
32 www.juliobattisti.com.br
ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB
Figura 1.8: Compilando o primeiro programa em C#.
Figura 1.9: Executando o primeiro programa em C#.
Common Type System
O Framework .NET disponibiliza, na forma de objetos, um conjunto de tipos de dados comuns, os quais podem ser
utilizados por todas as linguagens habilitadas ao .NET. Isso significa que uma varivel do tipo Long ter a mesma
estrutura e ocupar o mesmo nmero de bytes, quer seja no VB.NET, no C#, no C++ ou em qualquer outra linguagem
habilitada ao .NET. Este conjunto de tipos comuns, que pode ser utilizado por qualquer linguagem, chamado de
Common Type System, que a partir de agora abreviaremos por CTS.
Dentre outras coisas, o CTS que facilita a integrao entre os programas e servios criados, utilizando-se de diferentes
linguagens do .NET. No modelo antigo, uma das dificuldades de fazer com que um Componente COM+ criado com
o Visual C++ pudesse ser utilizado por um programa escrito em Visual Basic que as linguagens possuam um
diferente conjunto de tipos bsicos. Para que os componentes, escritos em diferentes linguagens, pudessem se comunicar,
33
CAPTULO 1: ENTENDENDO A NOVA PROPOSTA DA MICROSOFT O FRAMEWORK .NET
www.juliobattisti.com.br
o programador tinha que mapear os tipos de uma linguagem, para os tipos correspondentes em outra linguagem,
fazendo as converses necessrias. Vejam o quanto este procedimento trabalhoso. Com o CTS do .NET simplesmente
esta preocupao no existe, uma vez que todas as linguagens tm acesso a um conjunto de tipos comum a todas elas.
Conforme descrito na documentao do Framework .NET, so as seguintes as principais funes do CTS:
Fornece uma estrutura que possibilita a integrao entre diferentes linguagens habilitadas ao .NET, com uma
execuo mais rpida, uma vez que a sobrecarga para a converso entre os diferentes tipos de diferentes
linguagens deixa de existir.
Fornece uma estrutura de tipos com base em um modelo orientado a objetos, o que facilita a criao de novas
linguagens habilitadas ao .NET, favorecendo a utilizao de boas prticas de programao, como por exemplo
a herana. Uma vez que os tipos so objetos, podemos criar tipos derivados dos objetos bsicos, os quais
herdam todas as caractersticas dos objetos bsicos.
O CTS define algumas regras que toda linguagem deve seguir, para ser habilitada ao .NET. Por seguirem um
conjunto de regras comum, a interao entre programas escritos em diferentes linguagens fica bem mais fcil.
No Captulo 2, quando detalharemos o CLR, vamos detalhar um pouco mais sobre o CTS.
Metadata
Na seo Questes a considerarmos nos modelos de 3 ou mais camadas utilizados atualmente, descrevemos, como
uma das inconvenincias do modelo de componentes baseados em COM/COM+, o fato de que os mesmos, para
poderem ser utilizados, precisam ser registrados. Ao registrarmos um componente COM/COM+, uma srie de
informaes sobre o mesmo so gravadas na Registry do sistema. Estas informaes so utilizadas pelos programas
que precisam acessar o componente. Se alguma destas informaes estiver errada ou tiver sido alterada, o componente
no poder ser acessado e os programas que utilizam o componente deixaro de funcionar corretamente.
No Framework .NET, para utilizarmos os componentes .NET (.NET Componentes), no necessrio que os mesmos
sejam registrados. O prprio componente .NET possui todas as informaes necessrias ao seu funcionamento, bem
como as informaes necessrias para que outros aplicativos possam utiliz-los. Estas informaes, que fazem parte
do prprio componente .NET ficam gravadas no arquivo que compe componente, na forma de Metadata. Uma
traduo popularmente conhecida para Metadata seria: dados sobre dados. No nosso caso, Metadata seriam as
informaes que o componente .NET possui a respeito de si mesmo, informaes estas que podem ser utilizadas por
outros componentes e servios, para acessar o componente em questo.
Alm de fazer com que no seja necessrio o registro do componente, as informaes de Metadata facilitam a
interoperabilidade entre diferentes componentes, mesmo entre componentes escritos em diferentes linguagens. Estas
informaes so geradas, automaticamente, no momento da compilao do componente e so gravadas no arquivo
.DLL ou .EXE do componente. So muitas as informaes que podem ser inseridas no componente, na forma de
Metadata, tais como:
Nome e verso do componente.
34 www.juliobattisti.com.br
ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB
Uma chave pblica para verificao da origem e da autenticidade do componente.
Informaes sobre todas as classes ou componentes, dos quais o componente depende para funcionar
corretamente.
Tipos disponibilizados (exportados) pelo componente.
Permisses de segurana para o acesso ao componente, seus mtodos e propriedades.
Classes bsicas e interfaces do Framework .NET, utilizadas pelo componente.
Atributos personalizados, implementados no componente.
Membros do componente (mtodos, campos, propriedades, eventos, etc).
Quando o componente acessado, o CLR carrega os metadados do componente na memria e faz referncia a estes
metadados, para obter informaes sobre as classes, membros, herana e dependncias do componente.
So diversos os benefcios do uso de metadados, dentre os quais podemos destacar os seguintes:
Mdulos de cdigo auto descritivos: O prprio componente contm toda a informao necessria para interagir
com outros componentes. Desta forma o componente pode ser implementado como um nico arquivo, o qual
contm a sua definio (na forma de metadados) e a sua implementao, o cdigo do componente.
Nunca demais repetir: A utilizao de metadados facilita, enormemente, a interoperabilidade entre
componentes criados usando diferentes linguagens.
Assemblies
Uma aplicao .NET constituda de um conjunto de blocos chamados Assembly. Atravs dos Assemblies que
podemos controlar a distribuio de uma aplicao, fazer o controle de verses, alm de definir as configuraes de
segurana. Um assembly uma coleo de tipos e recursos que foram construdos para trabalharem juntos, formando,
com isso, uma unidade com funcionalidade e escopos bem definidos. Um assembly fornece ao CLR importantes
informaes sobre a implementao de tipos da aplicao. Para o CLR, um tipo somente existe no contexto de um
assembly. De uma maneira mais simples, poderamos dizer que um assembly o mecanismo utilizado pelo .NET, para
empacotar todos os elementos e informaes necessrias ao funcionamento de uma aplicao ou componente.
Vamos simplificar mais ainda: o assembly uma maneira de juntar e organizar os diversos elementos que formam
uma aplicao ou componente.
Os assemblies foram criados para simplificar a distribuio de aplicaes e resolver o problema de verses, existentes
em aplicaes baseadas em componentes. Lembram que no incio deste captulo falamos sobre o termo DLL Hell?.
Com este termo estvamos nos referindo ao problema de um programa, ao ser instalado, substituir uma DLL por uma
verso mais nova ou mais antiga, fazendo com que programas que dependiam da verso anterior da DLL deixassem de
funcionar. Atravs do uso de assemblies e dos metadados contidos em cada componente, possvel que diferentes
verses, do mesmo componente, estejam disponveis, ao mesmo tempo, em um computador. Desta forma, cada programa
utiliza a verso do componente para o qual o programa foi criado. Ao instalarmos uma nova verso do componente, o
qual vem embutido em um assembly, as verses anteriores sero mantidas, se as mesmas estiverem sendo utilizados
por outros programas. Isso faz com que o inferno das DLLs (DLL Hell) seja coisa do passado.
35
CAPTULO 1: ENTENDENDO A NOVA PROPOSTA DA MICROSOFT O FRAMEWORK .NET
www.juliobattisti.com.br
Para resolver o problema de verses e evitar o inferno das DLLs, o CLR utiliza assemblies da seguinte maneira:
Permite que o desenvolvedor defina regras sobre o uso de diferentes verses entre diferentes componentes .NET.
Fornece a infraestrutura necessria para que as regras de verso definidas pelo desenvolvedor sejam respeitadas.
Fornece a infraestrutura necessria, para que diferentes verses de um mesmo componente de software possam
rodar, simultaneamente. Esta execuo simultnea conhecida como syde-by-syde execution.
Um assembly composto de dois elementos bsicos:
Manifesto.
Um conjunto de mdulos.
Interfaces com o Usurio
No Framework .NET a nomenclatura utilizada para representar os elementos que
compem uma aplicao Web so diferentes dos termos utilizados para representar
uma aplicao tradicional para o Windows, tambm conhecidas como aplicaes
Win32. Alis, este um dos pontos que gostaria de destacar; o Framework .NET no
foi concebido apenas para a criao de aplicaes Web. Com Framework .NET,
podemos criar qualquer tipo de aplicao, desde aplicaes Web, passando por
aplicaes Win32 tradicionais, at aplicaes de Console, tambm conhecidas como
aplicaes de linha de comando.
Em termos de interface com o usurio, temos dois elementos a considerar:
Windows Forms
Web Forms
Windows Forms
Que o Framework .NET foi todo projetado tendo em vista a Internet nos j sabemos. Porm nem todas as aplicaes
so ou sero desenvolvidas para a Web. A utilizao de Windows Forms (Win Forms ou, se preferirem, Formulrios do
Windows) o mecanismo que nos permite criar as tradicionais aplicaes para Windows.
Win Forms o novo mecanismo para construo de aplicaes Windows, baseadas no Framework .NET.
Um Windows Form bastante semelhante ao conceito de formulrio utilizado pelas verses atuais do VB e do Delphi.
O formulrio o elemento bsico, sobre o qual adicionamos controles e cdigo para determinados eventos associados
com o formulrio e seus controles. O Windows Form tudo isso, porm com a diferena de poder utilizar todos os
mecanismos do Framework .NET. Dentre os principais mecanismos disponveis, destaca-se o mecanismo de herana,
o qual chamado, para o caso dos Win Forms, de herana visual. Anteriormente havamos comentado sobre herana
visual.
NOTA: Veremos mais
detalhes sobre assemblies
e seus elementos no
Captulo 2, onde
estaremos detalhando o
CLR Common Language
Runtime.
36 www.juliobattisti.com.br
ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB
Um Win Form, como tudo no Framework .NET, um objeto, o qual obtido a partir da instanciao de uma classe
bsica. Todos os formulrios no Framework .NET so baseados em uma das seguintes classes:
System.Windows.Forms.
So baseadas em um formulrio padro criado pelo usurio, atravs do mecanismo de herana.
Em resumo, o Win Form o elemento bsico de interao com o usurio; em outras palavras, o Win Form o elemento
visual das aplicaes, elemento este com o qual o usurio ir trabalhar.
Na Figura 1.10, temos uma viso geral dos elementos que compem uma aplicao Win32 tpica, construda com o
Framework .NET.
Web Forms
Para aplicaes Win32 a interface com o usurio so os Windows Forms, vistos no item anterior. Para aplicaes Web,
criadas com ASP.NET, as pginas so construdas utilizando-se Web Forms.
Um dos objetivos da utilizao de Web Forms trazer para o desenvolvimento Web as facilidades de arrastar e
soltar, existentes no desenvolvimento de aplicaes tradicionais. Com isso poderemos, com o uso do Visual Studio
.NET, criar pginas Web, simplesmente arrastando componentes sobre um Web Form.
Figura 1.10: Uma aplicao Win32 com o Framework .NET.
37
CAPTULO 1: ENTENDENDO A NOVA PROPOSTA DA MICROSOFT O FRAMEWORK .NET
www.juliobattisti.com.br
Com o uso de Web Forms, uma pgina ASP.NET dividida em dois componentes bsicos:
Um modelo (template), o qual contm os elementos visuais e de formatao da pgina, normalmente contedo
baseado em HTML, ou HTML gerado pelo cdigo ASP.NET.
Uma seo de cdigo, a qual responsvel por todo o processamento lgico dos elementos da pgina. Por
exemplo, na seo de cdigo podemos colocar os comandos necessrios para estabelecer uma conexo com um
banco de dados e um comando para retornar os dados que sero utilizados pela pgina. Tambm podemos colocar
comandos que atualizam os dados no banco de dados, de acordo com as informaes digitadas na pgina.
Observe que com estes dois elementos: template e seo de cdigo, temos uma separao entre o cdigo de
processamento e o contedo da pgina propriamente dito. Isso evita a criao de cdigos do tipo macarro, onde
temos sees de cdigo alternadas com sees de HTML, sucessivamente. O cdigo macarro bastante comum
nas verses anteriores do ASP (ASP 2.0 e ASP 3.0).
Com o Framework .NET so disponibilizados uma srie de novos controles para utilizao em pginas ASP.NET.
Estes novos controles apresentam novas caractersticas e propriedades que facilitam a criao de pginas, digamos,
mais inteligentes, onde podemos inserir cdigo em resposta a uma srie de eventos. O melhor disso tudo que o
funcionamento destes controles independente do Navegador utilizado pelo cliente, uma vez que os mesmos so
processados no servidor Web.
A seo de cdigo de um Web Form pode ser criada utilizando qualquer linguagem do Framework .NET, como por
exemplo: VB.NET, C# ou Jscript.NET.
Com a utilizao de Web Forms bem mais simples manter o estado de uma pgina, entre diferentes requisies do
usurio, isso tudo sem a necessidade de implementar a manuteno de estado utilizando os objetos Session e Application.
Alm disso, com o uso de Web Forms podemos construir aplicaes Web com interfaces
bastante sofisticadas e funcionais, de uma maneira fcil atravs da utilizao de
ferramentas de desenvolvimento como o Visual Studio .NET e outras que devero surgir
para o desenvolvimento para o Framework .NET.
Na Figura 1.11, temos uma viso geral dos elementos que compem uma aplicao Web
tpica, criada com ASP.NET, com a utilizao de Web Forms.
Os Servidores .NET
Alm do Framework .NET, a Microsoft vem disponibilizando novas verses dos servidores da famlia Back Office.
Estas novas verses vm sendo adaptadas para dar suporte ao modelo de desenvolvimento .NET. Por exemplo, os
servidores esto sendo adaptados para o padro XML, que o padro de dados para troca de informaes entre
componentes e servios do Framework .NET. Outra preocupao para esta linha de servidores com a escalabilidade
dos mesmos. Estes servidores foram projetados para atender um grande volume de usurios, alm de terem a capacidade
NOTA: Veremos mais
detalhes sobre a criao,
vantagens e os elementos
de Web Forms no Captulo
6 Uma Introduo ao
ASP.NET.
38 www.juliobattisti.com.br
ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB
de utilizar a tecnologia de Cluster e Balanceamento de Cargas do Windows 2000. Outras diretivas bsicas para estes
servidores so as seguintes:
Interoperabilidade: Ao contrrio do que muitos anunciaram, os Mainframes continuam vivos. Alm disso, o
ambiente de TI das empresas bastante heterogneo, onde convivem diferentes sistemas operacionais e diferentes
fontes e formatos de dados. O Framework .NET e os servidores .NET facilitam a tarefa de integrar dados das
mais variadas fontes, desde o tradicional Mainframe, passando por fontes de dados estruturados como o SQL
Server 2000 ou ORACLE e chegando a fontes no estruturadas, como mensagens de correio eletrnico, arquivos
de vdeo e imagens grficas.
Facilidade de gerenciamento: Dentro da filosofia da Microsoft de construir interfaces
de administrao intuitivas e fceis de utilizar. Todos os servidores utilizam interfaces
padronizadas, atravs do uso do MMC Microsoft Management Console e Snap-Ins
especficos para a administrao de cada servidor.
Neste tpico descreveremos, rapidamente, quais os servidores .NET e qual a funo de
cada um no ambiente empresarial. Veremos uma breve descrio dos seguintes servidores:
SQL Server 2000
Exchange Server 2000
BizTalk Server 2000
Commerce Server 2000
Figura 1.11: Uma aplicao Web com ASP.NET e Web Forms.
NOTA: Nota: Para
maiores informaes
sobre MMC e Snap-Ins,
consulte a Unidade IV do
livro: Srie Curso Bsico
& Rpido: Microsoft
Windows 2000 Server,
de minha autoria,
publicado pela editora
Axcel Books
(www.axcel.com.br).
39
CAPTULO 1: ENTENDENDO A NOVA PROPOSTA DA MICROSOFT O FRAMEWORK .NET
www.juliobattisti.com.br
Application Center 2000
Host Integration Server 2000
Internet Security and Acceleration Server 2000
Mobile Information 2001 Server
SQL Server 2000
O SQL Server 2000 o servidor de banco de dados relacionais da Microsoft. Oferece funcionalidades avanadas
como replicao, stored procedures, acesso a diferentes fontes de dados, mltiplas instncias em um nico servidor,
mecanismo de segurana refinado e integrado com o Windows 2000, transaes distribudas, etc. Podemos acessar os
dados de um servidor SQL Server 2000, no formato XML, utilizando um navegador, atravs do protocolo HTTP.
Para maiores informaes sobre o SQL Server 2000, consulte as seguintes fontes:
http://www.microsoft.com/sql
Livro: SQL Server 2000 Administrao e Desenvolvimento: Curso Completo, de minha autoria, publicado
pela editora Axcel Books (www.axcel.com.br).
Exchange Server 2000
um servidor de mensagens e correio eletrnico, alm de uma plataforma para desenvolvimento de aplicaes do
Workflow. Cada vez mais o Exchange vem ganhando mercado de concorrentes como o Lotus Notes da IBM e o Novel
Groupwise da Novel. O Exchange 2000 completamente integrado com o Active Directory do 2000, o que facilita a
criao e manuteno de contas de usurios. O suporte ao XML tambm foi introduzido nesta verso do Exchange.
Maiores informaes sobre Exchange podem ser encontradas nos seguintes endereos:
http://www.microsoft.com/exchange
http://www.swynk.com
BizTalk Server 2000
Com a consolidao do comrcio eletrnico, principalmente do chamado B2B Business to Business, que o comrcio
entre empresas, cada vez faz-se mais necessria a integrao entre sistemas de informao de diferentes empresas.
Um dos maiores problemas que estes diferentes sistemas de informao utilizam diferentes formatos de dados.
Durante muito tempo, uma das solues adotadas foi o EDI Exchange Data Interchange. Porm o EDI apresenta
algumas limitaes, alm de um custo elevado. Com o advento da Internet e do padro XML, a troca de informaes
entre empresas tem migrado para solues onde o XML o formato universalmente aceito, o que facilita a troca de
informaes. O Biztalk Server 2000 a soluo da Microsoft que facilita a criao, desde o modelo conceitual at a
implementao, de aplicaes baseadas em XML, para troca de informaes entre diferentes empresas. Maiores
informaes e uma verso de avaliao para download podem ser encontradas no seguinte endereo: http://
www.microsoft.com/biztalk
40 www.juliobattisti.com.br
ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB
Commerce Server 2000
O Commerce Server trabalha em conjunto com o IIS. Na verdade o Commerce Server facilita a criao de um site para
comrcio eletrnico, quer seja B2C Business to Consumer, quer seja B2B Business to Business. Atravs de uma
srie de modelos prontos e atravs da utilizao de assistentes, podemos rapidamente criar um site para comrcio
eletrnico. Aps a criao, possvel personalizar o site de acordo com as necessidades da empresa. Pode trabalhar
integrado com os demais servidores .NET. Por exemplo, pode utilizar o SQL Server 2000 para armazenar informaes
sobre o catlogo de produtos, preos e estoque Maiores informaes e uma verso de avaliao para download podem
ser encontradas no seguinte endereo: http://www.microsoft.com/commerceserver
Application Center 2000
O Application Center 2000 a ferramenta da Microsoft para a implementao e gerenciamento de Web sites que
devero suportar uma elevada carga de acesso, com um grande nmero de acessos simultneos. Tambm oferece
ferramentas para a distribuio de um site entre diversos servidores, com o objetivo de distribuir a carga entre diversos
equipamentos. Com o uso do Application Center fica mais fcil realizar tarefas como por exemplo manter sincronizado
o contedo dos diversos servidores, bem como fazer o gerenciamento e a distribuio de cargas.
Host Integration Server 2000
Esta a nova verso do antigo SNA Server da Microsoft, s que com o nome alterado. O Host Integration Server
possibilita a integrao de redes Windows com outros ambientes, como por exemplo, Mainframes baseados na arquitetura
SNA da IBM. Maiores informaes e uma verso de avaliao para download podem ser encontradas no seguinte
endereo: http://www.microsoft.com/hiserver
Internet Security and Acceleration Server 2000
De certa maneira o successor do Proxy Server 2.0 da Microsoft, com algumas melhorias. utilizado para conectar
a rede local da empresa, de uma maneira segura, Internet. Suas funes bsicas so as seguintes:
Firewall
Cache de pginas
Maiores informaes e uma verso de avaliao para download podem ser encontradas no seguinte endereo: http://
www.microsoft.com/isaserver
Mobile Information 2001 Server
O Framework .NET no foi concebido apenas para o desenvolvimento de aplicaes que sero acessadas atravs de
PCs ligados em rede ou computadores tradicionais. Com o Framework .NET, a Microsoft pretende fornecer uma
slida plataforma de desenvolvimento, tambm para os diversos dispositivos mveis existentes, tais como telefones
celulares, assistentes pessoais, Palm Pilots, etc. Dentro desta estratgia, o Mobile Information 2001 Server desempenha
um papel fundamental, fornecendo suporte ao protocolo WAP 1.1. Usando o Mobile Information 2001 Server ser
41
CAPTULO 1: ENTENDENDO A NOVA PROPOSTA DA MICROSOFT O FRAMEWORK .NET
www.juliobattisti.com.br
possvel, por exemplo, fazer com que as suas mensagens do Exchange sejam convertidas para o formato em que
possam ser lidas por um celular ou qualquer outro dispositivo habilitado ao WAP.
Maiores informaes e uma verso de avaliao para download podem ser encontradas no seguinte endereo: http://
www.microsoft.com/servers/miserver/default.htm
ADO.NET
Com o ASP 3.0, a tecnologia preferida para o acesso a diferentes fontes de dados a tecnologia ADO Activex Data
Objects, trabalhando em conjunto com OLE-DB, conforme ilustrado na Figura 1.12
Figura 1.12: Acessando dados com ASP 3.0.
Activex Data Objects para o Framework .NET (ADO.NET) um conjunto de classes que expem servios para acesso
a diversas fontes e formatos de dados, para os programadores, utilizando qualquer linguagem habilitada ao .NET.
Cabe ressaltar que ADO.NET no um substituto para o ADO, pois as duas verses de componentes para acesso a
dados podem continuar existindo em um mesmo servidor Web, por exemplo. Ao instalarmos o Framework .NET, o
mesmo instala, alm do suporte a pginas ASP.NET, todo o conjunto de classes do Framework .NET. Porm o acesso
a pginas ASP tradicionais continua disponvel, o que significa que, mesmo aps instalar o Framework .NET, todas as
aplicaes criadas com ASP 3.0 ou verses anteriores do ASP continuaro funcionando sem problemas, at que voc
possa migr-las para ASP.NET. Ento em um mesmo servidor Web podemos ter uma pgina ASP, que acessa dados de
42 www.juliobattisti.com.br
ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB
um arquivo .mdb do Access utilizando ADO, convivendo com um aplicativo criado com ASP.NET, o qual acessa
informaes de uma caixa de correio do Exchange, utilizando ADO.NET.
ADO.NET foi projetado pensando nos desafios de criar programas baseados no modelo de 3 camadas, para a Internet,
os quais precisam acessar dados de diferentes fontes. Alm disso, as aplicaes Internet atuais esto bem mais
sofisticadas, onde necessrio manter o conceito de estado, o que difcil em um mundo como o da Internet, conhecido
como Connection Less. Na Internet o usurio faz a conexo com o servidor, requisita a pgina, recebe o resultado e
desfaz a conexo. Para manter o estado entre uma conexo e outra, no ASP 3.0, utilizvamos os objetos Session e
Application. Conforme veremos nos exemplos prticos, a partir do Captulo 6, manter o estado ficou muito mais
simples com ASP.NET e ADO.NET.
Outro fator importante a ser considerado que, cada vez mais, as aplicaes esto utilizando dados no padro XML.
ADO.NET fornece meios de utilizar dados no padro XML.
Conforme veremos, os objetos e mtodos de ADO.NET so bastante diferentes dos utilizados com ADO. Um dos
primeiros objetos de que sentiremos falta o tradicional Recordset. Na Figura 1.13 temos uma viso geral da
arquitetura do ADO.NET.
Figura 1.13: Uma viso geral da arquitetura do ADO.NET.
Observe que no temos o tradicional objeto Recordset.
Para trabalharmos com ADO.NET, utilizaremos as seguintes classes da biblioteca de
classes do Framework .NET ( .NET Framework Class Library).
Ao longo deste livro, principalmente nos Captulos 10 e 11, estaremos utilizando ADO.NET em diversos exemplos de
conexo de pginas ASP.NET com fontes diversas de dados.
NOTA: Esta figura foi
retirada da documentao
do Framework .NET.
43
CAPTULO 1: ENTENDENDO A NOVA PROPOSTA DA MICROSOFT O FRAMEWORK .NET
www.juliobattisti.com.br
Concluso
Neste captulo apresentamos o .NET ao amigo leitor.
Iniciamos o captulo apresentando uma viso geral e uma definio genrica para a iniciativa .NET da Microsoft.
Tratamos de conceitos como Web Services, CLR Common Language Runtime e .NET Framework Class Library.
Vimos que o .NET a viso da Microsoft em um mundo onde o Software passa a ser desenvolvido e comercializado
na forma de servios. Os programas so construdos a partir de unidades menores, os assemblies. Dentro de um
assembly tenho todos os elementos que garantem uma funcionalidade especfica, para a qual o assembly foi projetado.
Dentro deste contexto podemos concluir que, mais do que uma atualizao tecnolgica, o .NET uma mudana de
Paradigma.
Destacamos os dois principais componentes do Framework .NET. Em primeiro lugar uma ambiente de execuo
comum a todas as linguagens habilitadas ao .NET CLR Common Language Runtime. Qualquer linguagem habilitada
ao .NET, ao ser compilada, gera cdigo MSIL Microsoft Intermediate Language, sendo que o cdigo MSIL que
executado pelo CLR.
Alm disso, fornecida uma biblioteca de classes que pode ser utilizada por qualquer linguagem habilitada ao .NET
.NET uma mudana de Paradigma. Ao colocar a disposio do programador um conjunto de classes padronizadas,
o Framework .NET est incentivando boas prticas de programao, como a herana e a conseqente reutilizao de
cdigo.
Em seguida apresentamos os problemas com o modelo de desenvolvimento atual, baseado em componentes que
seguem o padro COM/COM+. Vimos que, para que um componente possa ser utilizado, o mesmo precisa ser registrado
e que diferentes verses de um mesmo componente no podem coexistir em um mesmo computador, o que pode fazer
com que, ao instalarmos um programa, o mesmo substitua a verso atual do componente por uma verso diferente, a
qual no pode ser utilizada por outros programas que dependem da verso anteriormente instalada. Isto faz com que o
programa que depende da verso substituda deixe de funcionar. Esta situao tambm conhecida como DLL Hell.
Tambm fizemos uma reviso rpida dos modelos de desenvolvimento em 2, 3 ou n camadas. Apresentamos as
deficincias e vantagens de cada modelo.
Em seguida voltamos aos componentes do Framework .NET apresentando, em primeiro lugar, as linguagens que
fazem parte do Framework .NET, com destaque para a facilidade em fazer com que programas escritos em diferentes
linguagens possam se comunicar e trocar informaes. Fizemos uma descrio breve do VB.NET e da nova linguagem
C#. Neste livro estaremos utilizando o C# para a criao das pginas ASP.NET de exemplo.
Continuando nossa jornada pela Framework .NET apresentamos o CTS Common Type System. Vimos a importncia
de todas as linguagens utilizarem um conjunto padronizado de dados, principalmente para garantir a interoperabilidade
entre programas criados em diferentes linguagens.
Tambm tratamos do conceito de metadados (Metadata), o qual faz com que cada componente contenha todas as
informaes necessrias ao seu funcionamento, o que evita que o mesmo tenha que ser registrado, como acontecia
44 www.juliobattisti.com.br
ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB
com os componentes COM/COM+. Alm disso os metadados que possibilitam que diferentes verses de um
componente coexistam em um computador, podendo inclusive as diferentes verses serem executadas simultaneamente.
Vimos que a unidade bsica de empacotamento chamada de assembly. Um assembly contm todos os elementos
necessrios ao funcionamento de um componente. Falaremos mais sobre assemblies no prximo captulo.
Seguindo, passamos a tratar das interfaces com o usurio, onde vimos os conceitos de
Windows Forms e Web Forms, onde foram apresentados diagramas ilustrativos da
utilizao destes elementos. Voltaremos ao assunto Web Forms nos demais captulos
deste livro.
Tambm no poderamos deixar de fora uma breve apresentao dos servidores .NET.
Uma linha de servidores da Microsoft, para facilitar o desenvolvimento de aplicaes
.NET, os quais fornecem uma srie de funcionalidades, desde um servidor de Banco de
Dados Relacionais (SQL Server 2000), at um servidor para garantir a segurana na
Internet Internet Security and Acceleration Server 2000.
Para encerrar fizemos uma breve apresentao do ADO.NET. Voltaremos a tratar de
ADO.NET, principalmente nos captulos que tratam de conexo de pginas ASP.NET
com Bancos de dados e outras fontes de dados.
IMPORTANTE: Para a
documentao sempre
atualizada sobre o .NET,
no deixe de consultar o
endereo: http://
msdn.microsoft.com/net.
NOTA: Devido natureza
dinmica da Internet,
alguns dos links
apresentados podem ter
sido alterados e,
portanto, deixado de
funcionar.
45
CAPTULO 2: ENTENDENDO O CLR
www.juliobattisti.com.br
Introduo
Antes de iniciarmos o nosso aprendizado de C# (Captulos 3, 4 e 5) e de ASP.NET
(demais captulos deste livro), vamos apresentar mais alguns detalhes sobre o
CLR Common Language Runtime. O CLR, conforme descrevemos no Captulo
1, o componente principal do Framework .NET.
Iniciaremos o captulo apresentando mais alguns detalhes sobre a estrutura de
uma aplicao .NET e a maneira como os diversos elementos so empacotados,
atravs do uso de assemblies. Vamos apresentar informaes detalhadas sobre o
uso de assemblies, os benefcios da utilizao dos mesmos, questes de segurana,
questes sobre verso e utilizao de um cache de assemblies para acelerar a
execuo dos programas .NET.
Falaremos um pouco sobre as linguagens habilitadas ao .NET, a gerao do cdigo
MSIL, a compilao do cdigo MSIL para cdigo nativo JIT Compile e a
execuo deste cdigo. Estes aspectos so importantes para entendermos a maneira
como as aplicaes .NET so executadas e gerenciadas pelo CLR.
Detalharemos o conceito e a funo dos assemblies. Veremos que os mesmos
formam os blocos bsicos para a construo de aplicaes .NET. Tambm veremos
quais os componentes de um assembly, com destaque para a importncia do mani-
festo contido em um assembly.
Na seqncia apresentaremos mais detalhes sobre o CTS Common Type Sys-
tem. Veremos quais os principais benefcios de termos um sistema de tipos comum
a todas as linguagens habilitadas ao .NET. Tambm falaremos sobre as diferenas
entre value types e reference types.
Tambm apresentaremos as principais classes e tipos da .NET Framework Class
Library. Veremos os tipos bsicos, bem como as principais classes disponveis
para utilizao em nossos programas e pginas ASP.NET.
Na parte final do captulo faremos uma reviso dos conceitos bsicos de orientao
a objetos. Uma vez que o Framework .NET fortemente baseado em conceitos de
orientao a objetos, tambm a linguagem C# que utilizaremos neste livro para a
criao de pginas ASP.NET baseada nos conceitos de orientao a objetos;
bastante oportuno que revisemos os seguintes conceitos:
O que um objeto?
Mtodos e propriedades
O que so Classes?
Herana
C A P T U L O
2
Entendendo o CLR
46 www.juliobattisti.com.br
ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB
Polimorfismo e funes virtuais
Encapsulamento e visibilidade
Todo o Framework .NET foi criado com base nos conceitos de Orientao a Objetos. A linguagem C# totalmente
orientada a objetos, onde tudo so classes. Claro que alguns puristas poderiam dizer que o C# no completamente
orientado a objetos porque no suporta herana mltipla. Na verdade veremos que o C# foi projetado para conciliar
os benefcios da orientao a objetos e ao mesmo tempo ser simples e prtico. Para isso foram eliminadas algumas
caractersticas da orientao a objetos, caractersticas estas que mais causavam problemas do que propriamente
forneciam solues.
CLR Common Language Runtime
No Captulo 1 falamos rapidamente sobre o CLR. Agora chegou o momento de apresentarmos mais alguns detalhes
sobre este, que, com certeza, o principal elemento do Framework .NET.
O CLR o ambiente de execuo do Framework .NET. O CLR gerencia a execuo de qualquer aplicativo .NET, alm
de fornecer uma srie de servios que facilitam e agilizam o desenvolvimento de aplicaes. Conforme discutido no
Captulo 1, o maior benefcio do CLR que o mesmo fornece uma srie de servios e funcionalidades que nos
modelos de desenvolvimento anteriores ao .NET tinham que ser codificados na prpria aplicao. Ao fornecer este
conjunto de servios e funcionalidades, estamos evitando que o programador tenha que se preocupar como a maneira
com a aplicao vai ser executada, com a alocao de memria, com liberao de memria e tantos outros aspectos
que dificultavam o desenvolvimento de aplicaes. Com o suporte fornecido pelo CLR, o programador somente
precisa se preocupar com a lgica da sua aplicao e no com a infraestrutura necessria para a mesma funcionar.
O Cdigo que executado sob o controle do CLR chamado de Managed Code; vamos arriscar uma traduo:
Cdigo Gerenciado. Este gerenciado significa: Sob o controle do CLR. Em contrapartida cdigo que no for executado
sob o controle do CLR, no caso de programas no .NET, chamado de non Managed Code, que traduziremos por
Cdigo no gerenciado.
Os programas criados com linguagens habilitadas ao .NET e, portanto, executados sob o comando do CLR, podem se
beneficiar das seguintes vantagens:
Fcil integrao e interoperabilidade entre programas criados em diferentes linguagens.
Fcil implementao e controle da segurana da aplicao.
Utilizar a biblioteca de classes do Framework .NET.
Melhor gerenciamento das diferentes verses de um mesmo componente, inclusive com a possibilidade de
execuo simultnea de diferentes verses do mesmo componente, o que conhecido por: Syde-by-syde
execution.
Gerenciamento automtico da alocao e liberao da memria.
47
CAPTULO 2: ENTENDENDO O CLR
www.juliobattisti.com.br
Compilar ou no Compilar, eis a Questo?
Outro ponto importante a esclarecer se os programas .NET so compilados ou interpretados. Confesso que, na
opinio deste autor, pouca importncia tem se compilado ou interpretado, desde que o desempenho final seja
satisfatrio. Mas como todo programador que se preza um pouco teimoso, e apaixonado por uma discusso acalorada,
vamos esclarecer este assunto antes que os nimos se exaltem.
Ao criarmos um programa, utilizando uma linguagem habilitada ao .NET, como por exemplo o VB.NET ou o C#, o
cdigo-fonte do programa, ao ser compilado, gera cdigo MSIL Microsoft Intermediate Language. Senhores! Com
calma. Ainda no hora de comear a malhar o .NET. O CLR, que ser responsvel pela execuo e controle do cdigo
MSIL gerado, COMPILA o cdigo MSIL para cdigo nativo. Com isso, o cdigo que executado pelo CLR cdigo
nativo da plataforma onde est instalado o Framework .NET. At o momento, a nica plataforma compatvel a dobradinha
Windows/Intel. Porm a Microsoft est tornando disponvel, publicamente, as especificaes para CLR e MSIL, o que
possibilita que outras empresas desenvolvam um Framework .NET para outras plataformas, como, por exemplo, o UNIX.
Nos veremos mais adiante, que mesmo uma pgina ASP.NET compilada no servidor Web, antes de ser enviada para
o Navegador do cliente. Em resumo, todo e qualquer cdigo executado pelo CLR, cdigo compilado nativo. Agora
sim. Fiquem vontade para discutir, dizer que no bem assim, que esse tal de MSIL no tem nada a ver, mais um
chope e assim por diante.
O Papel dos Metadados (Metadata)
Para que o CLR possa fornecer uma srie de servios ao managed code, os compiladores das linguagens habilitadas
ao .NET devem ser capazes de criar metadados. Os metadados contm informaes sobre os tipos, membros e referncias
contidas no cdigo do programa. Os metadados so gravados com o prprio cdigo do programa. Desta maneira toda
a informao necessria para que o programa funcione est contida no seu prprio cdigo, o que faz com que no seja
necessrio o registro do mesmo, diferente do que acontecia com os componentes COM/COM+. O CLR utiliza metadados
para localizar e carregar programas ou componentes, organizar as vrias instncias de um mesmo componente na
memria, resolver a chamada de mtodos, gerar cdigo nativo, garantir a segurana de acesso e definir os limites para
o contexto de execuo de um componente ou programa.
O CLR automaticamente gerencia a alocao de objetos na memria, bem como as referncias aos objetos. Quando no
houver mais nenhuma referncia ao objeto, o que significa que o mesmo no est mais sendo utilizado, o CLR
automaticamente remove o objeto, liberando mais memria para o sistema. Com isso, os tradicionais problemas de
memory leaks programas que alocam recursos de memria e no liberam, fazendo com que a quantidade de memria
disponvel fique reduzida, at o ponto de fazer com que o prprio sistema operacional fique instvel e a mquina tenha
que ser reinicializada deixam de existir. Vejam o quanto fica simplificada a tarefa de desenvolvimento, uma vez que o
programador no precisa preocupar-se com alocao e liberao de memria, apenas com a lgica do seu programa.
Integrao Entre Diferentes Linguagens: Promessa ou Realidade?
Com o CLR fica fcil a criao de componentes e aplicaes nas quais os objetos sejam capazes de interagir, mesmo
que codificados em diferentes linguagens. Por exemplo, podemos criar uma Classe chamada Clientes, em VB.NET.
48 www.juliobattisti.com.br
ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB
Podemos criar uma classe Clientes Especiais, em C#, herdada da classe Clientes. Com
isso, a nossa classe Clientes Especiais ir herdar todas as propriedades e mtodos da
classe Clientes.
Essa integrao entre diferentes linguagens possvel, pois todas as linguagens habilitadas
ao .NET tm acesso a um sistema de tipos comuns CTS Common Type System.
Falaremos um pouco mais sobre o CTS mais adiante, neste captulo. Alm disso cada
componente ou aplicativo possui informaes, na forma de metadados, sobre a sua
estrutura, sobre os mtodos e propriedades que o mesmo possui e que podem ser acessados por outros componentes.
O Processo de Execuo de Cdigo do CLR
Vamos ver quais os passos envolvidos, desde a criao de uma aplicao utilizando uma das linguagens habilitadas ao
.NET, at a execuo da mesma, sob o controle do CLR.
Os passos para a criao e execuo de uma aplicao .NET podem ser resumidos da seguinte maneira:
Cria a aplicao ou componente utilizando uma linguagem habilitada ao .NET (VB.NET, C#, etc).
Compila o cdigo da sua aplicao ou componente para gerar cdigo MSIL. O compilador da linguagem que
voc est utilizando compila o seu cdigo-fonte para MSIL e acrescenta os meta dados necessrios.
Em tempo de execuo, um compilador JIT (Just In Time) do CLR transforma o cdigo MSIL em cdigo
nativo, COMPILADO.
O cdigo nativo executado, utilizando toda a infraestrutura disponibilizada pelo CLR.
Na Figura 2.1, temos uma ilustrao destes passos.
Conforme ilustrado na Figura 2.1, quando compilamos o cdigo-fonte criado por uma linguagem habilitada ao .NET,
estamos gerando MSIL, a qual um conjunto de instrues, independente da CPU, conjunto este que pode ser convertido
(pelo JIT) para cdigo nativo. O cdigo MSIL inclui instrues para carregar, armazenar, inicializar e chamar mtodos,
instrues para operaes aritmticas e lgicas, controle de fluxo do programa, acesso direto a memria, tratamento
de excees e demais operaes necessrias execuo do programa.
Antes que o cdigo MSIL possa ser executado, o mesmo precisa ser convertido para cdigo especfico da CPU em
questo. Isto feito pelo JIT Just in time compiler. O CLR disponibiliza compiladores JIT para cada arquitetura
suportada pelo CLR; desta maneira o mesmo conjunto de instrues MSIL pode ser compilado e executado em
qualquer arquitetura para a qual exista um compilador JIT.
Esta a estratgia da Microsoft para fazer com que o cdigo MSIL de aplicaes .NET possa ser executado em
diferentes plataformas, desde servidores Windows ou no Windows, at dispositivos mveis para os quais esteja
disponvel um compilador JIT. claro que a implementao em outras plataformas que no o Windows, como por
exemplo o UNIX, depender da implementao de terceiros. Por exemplo, a HP pode querer implementar um compilador
NOTA: No final do
captulo apresentaremos
os principais conceitos de
orientao a objetos,
como por exemplo:
classes e herana.
49
CAPTULO 2: ENTENDENDO O CLR
www.juliobattisti.com.br
Figura 2.1: O processo de execuo de cdigo do CLR.
Quando o compilador de uma linguagem habilitada ao .NET produz o cdigo MSIL, o mesmo tambm cria os metadados
necessrios. O cdigo MSIL e os metadados esto contidos em um arquivo PE portable executable. O portable
significa que este arquivo pode, em tese, ser compilado e executado em qualquer plataforma para a qual existe um
compilador JIT. A presena dos metadados, juntamente com o cdigo MSIL, torna o cdigo autodescritivo, o que
significa que no temos mais a necessidade de bibliotecas de tipo (type libraries) ou IDL Interface Definition
Language, dispositivos que eram necessrios ao funcionamento de componentes baseados no modelo COM/COM+.
Voltamos a salientar este ponto, o componente criado para o .NET possui, na forma de metadados, toda a informao
necessria ao seu funcionamento e necessria para que possa ser acessado por outros componentes. O CLR localiza e
extrai os metadados do arquivo PE durante a execuo, medida que isso vai sendo necessrio.
Mais Algumas Observaes Sobre o JIT
O processo de compilao utilizado pelo JIT procura fazer uma srie de otimizaes, para tornar o cdigo nativo
gerado o mais enxuto e veloz possvel.
O JIT detecta se algum mtodo ou propriedade no ser utilizado durante a execuo do programa. Ao invs de
converter todo o cdigo MSIL, contido no arquivo PE, o JIT converte apenas o cdigo que realmente ser necessrio
JIT que rode no HP-UX, fazendo com que aplicaes .NET possam rodar nesta plataforma. Se surgiro implementaes
para outras plataformas uma questo que somente o tempo e o mercado diro.
50 www.juliobattisti.com.br
ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB
para a execuo do programa. Isso faz com que a compilao seja mais rpida, com que sejam poupados recursos
como por exemplo memria, e o cdigo resultante seja otimizado, tanto em termos de tamanho quanto de velocidade
de execuo.
Como parte da compilao do MSIL para cdigo nativo, o cdigo deve passar por um processo de verificao, a no
ser que tenha sido definida uma poltica de segurana que permite ao cdigo passar pela verificao. O processo de
verificao faz uma anlise do cdigo MSIL e dos metadados, para definir se o cdigo pode ser definido como type
safe. Para que o cdigo possa ser definido como type safe, o mesmo somente deve acessar regies de memria para
as quais o mesmo tem autorizao. Este processo necessrio para garantir que os objetos estejam isolados uns dos
outros, de tal maneira que um objeto no tente alterar ou corromper dados de outros objetos. Na plataforma Windows
9x, quando um programa tenta acessar a rea de memria utilizada por outro programa, gerada uma Falha Geral de
Proteo, com a famigerada mensagem Voc Executou uma Operao Ilegal e o seu programa ser fechado.
Para que o cdigo passe no teste de type safe, o mesmo deve atender as seguintes condies:
Todas as referncias feitas a um determinado tipo so compatveis com o tipo que est sendo referenciado.
Somente operaes devidamente definidas so invocadas pelo objeto.
possvel verificar e confirmar a identidade do objeto. Isso evita que um componente, por exemplo um vrus,
se faa passar por um componente vlido, porm com um comportamento bem diferente do verdadeiro
componente.
O processo de verificao tambm faz uma anlise do cdigo MSIL, para ver se o mesmo
foi corretamente gerado. Se as polticas de segurana da nossa aplicao definem que o
cdigo deve passar na verificao de type safe e o cdigo no passar nesta verificao,
uma exceo ser gerada quando o cdigo for executado.
Um detalhe importante que nem todo o cdigo MSIL compilado para cdigo nativo,
de uma s vez. A compilao acontece em nvel de mtodo. Quando um mtodo
chamado, o cdigo MSIL do mesmo compilado, o cdigo nativo gerado pelo JIT e o
mtodo executado. O cdigo nativo gerado mantido. Quando o mtodo for chamado
pela segunda vez, o cdigo nativo gerado na primeira chamada ser executado, evitando,
com isso, que o cdigo do mtodo tenha que ser compilado a cada chamada do mesmo,
o que acarretaria uma perda considervel de desempenho.
Assemblies
Conforme descrito no Captulo 1, chegou o momento de apresentarmos mais alguns detalhes sobre Assemblies e
sobre o formato (ou quem sabe anatomia) de uma aplicao .NET.
NOTA: O mecanismo de
verificao do cdigo
um exemplo tpico de
funcionalidade
disponibilizada pelo
Framework .NET, a qual,
nos modelos anteriores,
precisava ser
desenvolvida pelo
programador.
51
CAPTULO 2: ENTENDENDO O CLR
www.juliobattisti.com.br
Uma Definio em Poucas Palavras
Para aplicaes tradicionais do Windows, anteriores ao modelo .NET, a aplicao final um arquivo executvel ou um
arquivo executvel mais um conjunto de .DLL e componentes. Uma DLL pode conter um objeto COM/COM+ em
uma biblioteca de tipos (typelib).
Para o Framework .NET, os diversos componentes de uma aplicao so empacotados atravs da utilizao de
assemblies. Um assembly contm todo o cdigo MSIL gerado pelo compilador, os metadados e os demais arquivos
necessrios ao funcionamento da aplicao. Cada assembly tambm contm um manifesto. O manifesto contm as
seguintes informaes:
Uma lista dos arquivos contidos no assembly.
A definio de quais tipos e recursos do assembly podem ser acessados por outros componentes ou programas.
Um mapeamento entre os tipos e recursos disponibilizados pelo assembly e os arquivos que contm os tipos e
recursos.
Uma lista de outros assemblies, dos quais o assembly depende para o seu correto funcionamento.
Informaes sobre a identidade do assembly, incluindo o nome e a verso do assembly.
Se o assembly for pblico, como por exemplo um Web Service, o manifesto tambm pode conter a chave
pblica do assembly. Este um mecanismo semelhante, em funcionalidade, utilizao de um Certificado
Digital, para identificar a origem de um controle ActiveX.
Um assembly contm toda a informao necessria ao seu funcionamento. Ao definirmos um assembly, o mesmo
pode estar contido em um nico arquivo ou em mltiplos arquivos. A vantagem de utilizar mltiplos arquivos que as
diferentes partes do assembly podem ser carregadas e executadas medida que as mesmas forem sendo utilizadas.
Funes do Assembly
Pela descrio anterior podemos concluir que o assembly um elemento fundamental na criao de aplicaes .NET.
Os assemblies foram projetados, principalmente, para simplificar o processo de distribuio de aplicaes e para
solucionar o problema do controle de verses existente no modelo COM/COM+. Um assembly responsvel pelas
seguintes funes:
Contm o cdigo executado pelo CLR. O cdigo MSIL contido em um arquivo PE (portable executable) no
poder ser executado se o mesmo no estiver associado a um manifesto.
a unidade bsica para atribuio de permisses e configuraes de segurana. Podemos definir, em nvel de
assembly, quem pode acessar o assembly e com que nvel de acesso.
uma unidade de referncia, pois as informaes contidas no manifesto do assembly so utilizadas para
resolver tipos e para atender requisies de outros assemblies. Estas informaes definem quais os mtodos e
propriedades que so visveis externamente. O manifesto tambm contm informaes a respeito de quais
assemblies o assembly em questo depende.
uma unidade para definio de verso. A atribuio de um nmero de verso feita em nvel de assembly.
52 www.juliobattisti.com.br
ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB
uma unidade de distribuio das aplicaes .NET. Quando uma aplicao inicializada, somente o assembly
chamado na inicializao da aplicao precisa estar disponvel. Outros assemblies somente so chamados
medida que forem sendo utilizados. Essa uma caracterstica muito importante, principalmente para aplicaes
Web, onde a velocidade das conexes sempre um fator muito importante a ser considerado.
Assemblies podem ser estticos ou dinmicos. Assemblies estticos podem incluir tipos do Framework .NET (inter-
faces e classes), alm dos recursos utilizados pelo assembly (bitmaps, .jpg files, arquivos de som ou imagem, etc.).
Assemblies estticos so gravados em disco em arquivos PE. Na verdade um arquivo PE pode ser gravado na forma de
um EXE ou uma DLL.
Assemblies dinmicos rodam diretamente da memria e no so salvos no disco antes de serem executados. Aps a
execuo, podemos salvar assemblies dinmicos em disco.
Componentes do Assembly
Um assembly esttico formado pelos seguintes componentes:
Manifesto, o qual contm metadados do assembly.
Metadados sobre os tipos do assembly (Type metadata).
Cdigo MSIL.
Demais recursos necessrios, como por exemplo arquivos grficos, arquivos de vdeo, etc.
Podemos agrupar todos os elementos constituintes do assembly em um nico arquivo, conforme ilustrado na
Figura 2.2.
Figura 2.2: Assembly e seus componentes em um nico arquivo.
53
CAPTULO 2: ENTENDENDO O CLR
www.juliobattisti.com.br
Os componentes do assembly tambm podem estar divididos em diversos arquivos. Estes arquivos podem conter
mdulos de cdigo compilado, recursos (como por exemplo arquivos grficos ou de vdeo) ou qualquer outro arquivo
necessrio ao funcionamento da aplicao .NET.
Existem duas razes para a colocao dos componentes de um assembly em mltiplos arquivos:
Quando precisamos combinar, na mesma aplicao, componentes ou mdulos criados em diferentes linguagens.
Para otimizar o download dos componentes de uma aplicao, de tal maneira que os componentes ou mdulos
menos utilizados somente sejam carregados quando forem necessrios. Esta uma alternativa importante,
principalmente para aplicaes Web.
Na Figura 2.3 temos o exemplo de um assembly composto de quatro arquivos:
Um arquivo o mdulo principal. criado em VB.NET.
Outro arquivo o mdulo com funes (Criado em C#) usadas pelo assembly principal.
Um arquivo .bmp.
Um arquivo .jpg.
Figura 2.3: Exemplo de um assembly com vrios arquivos.
54 www.juliobattisti.com.br
ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB
O que Temos no Manifesto?
O Manifesto contm o seguinte conjunto de informaes (metadados):
Qual a relao entre os diferentes componentes do assembly.
Informaes sobre a verso do assembly.
Escopo.
Informaes para resolver referncias a outras classes e componentes.
O manifesto pode estar contido em um arquivo PE Portable executable (pode ser um .exe ou uma .dll), juntamente
com o cdigo MSIL ou pode estar em um arquivo PE separado, o qual contm somente o manifesto. Esta ltima
situao acontece quando temos um assembly formado de diversos arquivos.
As informaes contidas no manifesto so responsveis pelas seguintes funes:
Relao dos arquivos que compem o assembly.
Gerencia o mapeamento entre os tipos e recursos disponibilizados pelo assembly e os arquivos onde esto
contidas as declaraes e implementaes dos respectivos tipos e recursos.
Relaciona os assemblies dos quais o assembly em questo dependente.
Em resumo, reforando o que j foi comentado no Captulo 1, este conjunto de informaes fornece uma autonomia
ao assembly, de tal maneira que o mesmo contm toda a informao necessria ao seu funcionamento. Isso evita que
o assembly tenha que ser registrado. Com estes recursos, o processo de instalar uma aplicao .NET est resumido a
copiar os arquivos necessrios. Como diriam os ainda apaixonados pelo DOS, voltamos ao estilo xcopy de instalao,
em referncia ao comando xcopy, o qual utilizado para copiar arquivos ou pastas.
CTS Common Type System
O CTS desempenha um papel fundamental para garantir e facilitar e interoperabilidade entre programas e componentes
criados em diferentes linguagens. O CTS define a maneira como os tipos de dados so declarados, usados e gerenciados
pelo CLR. Atravs do CTS temos a garantia de que, por exemplo, um inteiro ter as mesmas caractersticas, independente
da linguagem na qual o mesmo estiver sendo utilizado.
Uma das maiores dificuldades, no modelo COM/COM+, em fazer com que componentes escritos em diferentes
linguagens pudessem interagir o fato de que cada linguagem possui o seu prprio conjunto de tipos, o qual no
compatvel com o conjunto de tipos das demais linguagens. Colocando de uma maneira mais simples: o tamanho,
forma de armazenamento e demais caractersticas de cada tipo dependente da linguagem, no modelo COM/COM+.
O CTS responsvel pelas seguintes funes:
Fornecer uma estrutura de dados e tipos padronizados, estrutura esta que torna a integrao entre diferentes
linguagens uma realidade, alm de garantir uma execuo mais rpida, uma vez que as converses de tipo
passam a ser coisa do passado.
Fornece um modelo orientado a objetos, o qual capaz de suportar qualquer linguagem habilitada ao .NET.
55
CAPTULO 2: ENTENDENDO O CLR
www.juliobattisti.com.br
Define algumas regras e padres que as linguagens habilitadas ao .NET devem obedecer, o que ajuda a garantir
que objetos escritos em diferentes linguagens sero capazes de interagir e trocar mensagens.
Classificao dos Tipos do CTS
Temos duas categorias principais de tipos no CTS:
Value types: Toda linguagem de programao fornece um conjunto de tipos bsicos de dados, como por
exemplo: inteiros, caracteres, nmeros reais, strings, etc. Estes tipos bsicos so passados por valores. Em
outras palavras, se tenho uma varivel x cujo valor 5, utilizo o seguinte comando:
y=x
neste caso estou passando o valor contido na varivel x, para a varivel y. Alteraes feitas na varivel y no afetaro
o valor da varivel x. No Framework .NET estes tipos bsicos, passados por valor, so chamados de value types.
Estes tipos bsicos fazem parte do conjunto de classes disponibilizado pelo Framework .NET. Por exemplo, um inteiro
acessado como System.Int32 e um valor boleano como System.Boolean. Estes tipos disponibilizados na prpria
biblioteca de classes do Framework .NET so chamados de built-in value types.
Para fornecer uma maior flexibilidade, o Framework .NET tambm permite que sejam criados os chamados User-
defined value types. Com isso o programador pode definir tipos personalizados, os quais so derivados da classe
bsica System.ValueType. Com isso podemos criar tipos especficos, de acordo com as necessidades de cada aplicao.
Por exemplo, para aplicaes de engenharia, podemos criar um tipo para representar nmeros complexos ou matrizes
com caractersticas definidas.
Reference types: Este tipo contm uma referncia para a localizao do valor do
tipo. Em outras palavras, contm o endereo de memria onde est armazenado o
valor. Vamos imaginar que x seja uma varivel do tipo reference type. Agora vamos
fazer uma outra varivel y, tambm do tipo reference type, como sendo igual a x:
y=x
Neste caso, o endereo onde est armazenado o valor de x foi atribudo varivel
x. Se alterarmos o valor de x, o que acontece com y? Como y contm o endereo
da varivel x, ao alterarmos x, y passar a enxergar o valor modificado. Por
exemplo, se utilizarmos o comando Console.Writeline(y), ser exibido o novo
valor da varivel x.
.NET Framework Class Library
Biblioteca de Classes do Framework .NET
O Framework .NET fornece uma biblioteca hierrquica de classes. Esta biblioteca pode ser acessada por qualquer
linguagem habilitada ao .NET. Nesta biblioteca temos milhares de classes, interfaces e estruturas, que disponibilizam
os mais variados tipos de servios e funcionalidades, como por exemplo:
Acesso a fontes variadas de dados.
NOTA: Nos Captulos 3, 4
e 5 apresentaremos alguns
exemplos que ilustram a
diferena entre value types
e reference types.
56 www.juliobattisti.com.br
ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB
Configuraes de segurana.
Desenvolvimento de componentes e Web services.
Manipulao de objetos grficos.
Leitura e escrita em disco.
Servio de Sockets, com a possibilidade do envio e recebimento de dados utilizando uma grande variedade de
protocolos de rede.
Criao de aplicaes Web, com servios de fila de mensagens, correio eletrnico, etc.
Manipulao de dados e esquemas XML.
Criar aplicaes Win32 tradicionais atravs do uso de Win Forms.
Criar aplicaes ASP.NET utilizando Web Forms.
Acessar as informaes contidas nos assemblies, na forma de metadados.
As funcionalidades oferecidas pela biblioteca de classes do Framework .NET facilitam a criao de programas, uma
vez que muitas funes j esto prontas para serem utilizadas, evitando que as mesmas tenham que ser implementadas
em cada programa. A utilizao de classes comuns a todas as linguagens do Framework .NET tambm facilita a
interoperabilidade entre diferentes linguagens.
Podemos utilizar as classes diretamente em nossos programas ou podemos criar classes que herdam os mtodos e propriedades
de uma determinada classe e adicionar as modificaes necessrias. Vejam que aqui estamos utilizando o conceito de herana.
Como so milhares de classes, cada uma com seus mtodos e propriedades, o Framework .NET precisa organizar estas
classes de uma maneira a evitar conflito de nomes. A maneira encontrada pelo Framework .NET atravs da utilizao
de um espao de nomes (namespace). Um espao de nomes simplesmente um agrupamento lgico das classes,
estruturas e interfaces relacionadas. A maioria das classes est contida no espao de nomes System. Diretamente
ligado a system temos a definio de tipos bsicos como por exemplo: Int32, String, etc. Um exemplo de classe de
segundo nvel, dentro do espao de nomes System, a classe System.Data, a qual fornece uma srie de mtodos para
acesso s mais variadas fontes de dados. Temos tambm uma classe de segundo nvel chamada System.Security, a qual
fornece servios para configuraes da segurana de acesso s aplicaes .NET. E assim vamos formando uma imensa
hierarquia de classes. As classes de segundo nvel, como System.Data e System.Security, herdam todos os mtodos e
propriedades da classe me System. Este um dos princpios da orientao a objetos: Herana. No prximo item
falaremos mais sobre a herana e os demais fundamentos da orientao a objetos.
Na Figura 2.4, temos uma representao parcial do espao de nomes System, no qual representamos apenas alguns
tipos bsicos, ligados diretamente a System e s classes derivadas System.Data e System.Security.
Podemos continuar nos aprofundando na hierarquia de classes. Por exemplo, existem classes derivadas de System.Data.
A classe System.Data.SqlClient contm toda a funcionalidade necessria para acessar dados de um servidor SQL
Server 2000. J a classe System.Data.OleDb fornece funcionalidades para conexo com qualquer fonte de dados, para
a qual esteja disponvel um OLE-DB Provider. Se acrescentssemos mais estas duas classes, o espao de nomes
System ficaria conforme indicado na Figura 2.5.
Vejam que a hierarquia de classes vai crescendo. No decorrer deste livro estaremos utilizando diversas classes do
.NET Framework Class Library.
57
CAPTULO 2: ENTENDENDO O CLR
www.juliobattisti.com.br
Figura 2.4: Uma representao parcial do espao de nomes System.
Figura 2.5: System.SqlClient e System.OleDb.
Vamos fazer uma breve descrio das principais classes do .NET Framework Class Library.
Microsoft.Csharp: Suporte a linguagem C# do Framework .NET.
Microsoft.Jscrip: Suporte a linguagem JScript no Framework .NET.
NOTA: Para uma descrio completa, de todas as classes do Framework .NET, consulte o item .NET Framework Class Library, dentro do
tpico .NET Framework Reference, na documentao do Framework .NET, conforme indicado na Figura 2.6. Lembrando que, uma vez
instalado o Framework .NET, voc pode acessar a documentao do produto utilizando o comando: Iniciar -> Programas -> Microsoft .NET
Framework SDK -> Documentation.
58 www.juliobattisti.com.br
ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB
Figura 2.6: Documentao do Framework .NET.
Microsoft.VisualBasic: Contm o Run Time para o VB.NET e fornece o suporte a linguagem no Framework .NET.
Microsoft.Win32: Fornece dois tipos de classes: um que trata dos eventos gerados pelo sistema operacional e
outro que fornece funes para acessar e gravar informaes na registry do Sistema Operacional.
System: a classe principal para todo o espao de nomes System. Contm todas as caractersticas comuns a
todas as classes, uma vez que as classes derivadas de System herdam suas caractersticas. Tambm contm os
tipos bsicos, como por exemplo inteiros de 16, 32 ou 64 bits, String, byte, etc.
System.Collections: Contm as interfaces e classes que definem vrias colees de objetos, como por exemplo
listas, filas, arrays e dicionrios.
System.Data: Contm a maioria das classes que compem a arquitetura do ADO.NET. Com ADO.NET, podemos
construir componentes capazes de gerenciar, de uma maneira eficiente, dados de mltiplas fontes. Em um
ambiente desconectado (connection less) como a Internet, ADO.NET disponibiliza uma srie de ferramentas
para requisitar, alterar e sincronizar dados em uma arquitetura de mltiplas camadas. O principal elemento do
ADO.NET uma classe chamada DataSet, a qual estudaremos em detalhes nos captulos sobre ASP.NET.
System.Data.Common: Contm as classes que so compartilhadas por todos os .NET data providers (provedores
de dados para o .NET). Um .NET data provider uma coleo de classes que fornece acesso a uma determinada
fonte de dados, como por exemplo dados em um Mainframe ou em um servidor SQL Server 2000.
System.Data.OleDb: Contm as classes que fornecem acesso a qualquer fonte de dados para a qual exista um
OLE-DB Provider disponvel.
System.Data.SqlClient: Contm um conjunto de classes que fornece um acesso otimizado ao SQL Server
2000. Utiliza o driver nativo para o SQL Server 2000, ao invs de um OLE-DB Provider ou uma fonte ODBC.
Por isso o acesso mais rpido.
59
CAPTULO 2: ENTENDENDO O CLR
www.juliobattisti.com.br
System.Diagnostics: Um conjunto de classes com que permite que seja feita a depurao e acompanhamento
da execuo do cdigo das aplicaes .NET. Tambm fornece classes para leitura e escrita no log de eventos,
para inicializar servios do Sistema Operacional, para monitorar a performance do sistema atravs da utilizao
de contadores de desempenho.
System.DirectoryServices: Um conjunto de classes que fornece, para as aplicaes .NET, acesso ao Active
Directory do Windows 2000. As classes de System.DirectoryServices podem ser utilizadas com qualquer
Active Directory Service Provider disponvel. Atualmente esto disponveis os seguintes:
1. IIS Internet Information Server
2. LDAP Lightweight Directory Access Protocol
3. NDS Novel Directory Services
4. WinNT Para acesso ao diretrio do Windows NT 4.0.
System.Drawing: Um conjunto de classes com funes grficas da biblioteca
grfica do Framework .NET, a qual conhecida como GDI+ (bem que poderia
ser GDI.NET). Fornece mtodos para desenhar elementos bsicos no vdeo, como
por exemplo retngulos, crculos, uma linha reta, um ponto, etc.
System.Globalization: Este namespace contm o conjunto de classes com as
funcionalidades necessrias para a construo de aplicaes com suporte a
diferentes idiomas.
System.IO: Um conjunto de classes com suporte a leitura e escrita, sncrona e
assncrona para stream de dados e arquivos em disco.
System.Messaging: Contm um conjunto de classes para habilitar os programas
.NET a trabalhar com filas, enviar mensagens para uma fila, ler mensagens de uma fila, etc. No Windows NT
4.0 tnhamos o MSMQ Microsoft Message Queue que atuava como servidor, disponibilizando servios de
filas para aplicaes COM.
System.Net: Disponibiliza uma interface de programao bastante fcil de utilizar, a qual nos d acesso
grande maioria dos protocolos disponveis na Internet.
System.Security: Um conjunto de classes com mtodos para a definio das configuraes bsicas de segurana
para aplicaes .NET.
System.Security.Cryptography: Disponibiliza servios de criptografia, incluindo codificao e decodificao
de dados, hashing, gerao de nmeros aleatrios e autenticao de mensagens.
System.Web: Contm uma srie de classes e interfaces para a comunicao browser/servidor web. Por exemplo,
existe uma classe chamada HTTPRequest a qual disponibiliza uma srie de informaes a respeito da requisio
HTTP feita pelo cliente. Existem outros namespaces, herdados de System.Web, como por exemplo:
System.Web.Caching, System.Web.Conf iguration, System.Web.Hosting, System.Web.Mail,
System.Web.SessionState, etc.
System.Windows.Forms: Contm classes para a criao de aplicaes Win32, as quais podem ter acesso a
todos os elementos da interface do Windows, como por exemplo botes, menus, barras de rolagem, etc. Neste
namespace encontraremos uma classe chamada Form alm de muitos outros controles que podem ser utilizados
para a criao da interface do usurio.
NOTA: Para que o
programador possa utilizar
de maneira eficiente estas
classes, um bom
conhecimento do diretrio
em questo exigido.
60 www.juliobattisti.com.br
ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB
System.XML: o namespace que contm as classes que do suporte ao padro XML.
Apresentamos apenas uma descrio bsica dos principais namespaces do Framework .NET. Livros inteiros podem
ser escritos sobre um nico namespace como por exemplo System.Net ou System.Security. A melhor fonte de consulta
para as classes, mtodos e propriedades de um namespace a prpria documentao do Framework .NET. No decorrer
deste livro estaremos utilizando algumas classes em nossas pginas ASP.NET. Uma das classes que mais utilizaremos
System.Data e suas classes derivadas como System.SqlCliente e System.OleDb.
Agora vamos fazer uma reviso dos principais conceitos de Orientao a Objetos. importante a reviso destes
conceitos uma vez que a linguagem C# (assunto para os captulos 3, 4 e 5) e todo o Framework .NET so baseados nos
conceitos de Orientao a Objetos.
Conceitos Bsicos de Orientao a Objetos
Vamos fazer uma reviso dos principais conceitos de orientao a objetos. A orientao a objetos, quer seja como
metodologia de anlise, projeto ou programao, foi criada com o objetivo de resolver problemas que a programao
estruturada no foi capaz. A orientao a objetos possui os seguintes objetivos bsicos:
Produtividade.
Incentivo a boas prticas de programao.
Uma modelagem mais prxima do entendimento do usurio final.
Reutilizao de cdigo.
Facilidade de manuteno do cdigo.
Embora a proposta de orientao a objetos seja bastante consistente, a mesma no teve o nvel de implementao
esperado. No cabe aqui discutir os motivos que fizeram com que a velocidade de adoo ficasse abaixo da esperada.
Este fato ainda mais interessante uma vez que a grande maioria das empresas admite que a orientao a objetos
oferece uma srie de vantagens em relao ao modelo de programao estruturada. Porm a mudana para um novo
modelo envolve uma nova maneira de pensar, uma necessidade de treinamento e, principalmente, uma mudana
cultural. Esta ltima sem sombra de dvidas a mudana mais difcil.
Vamos revisar os seguintes conceitos bsicos:
O que um objeto?
Mensagens.
Classes.
Herana.
Instncias.
Reutilizao de cdigo.
61
CAPTULO 2: ENTENDENDO O CLR
www.juliobattisti.com.br
O que um Objeto?
Na programao estruturada, ns temos uma separao entre procedimentos e os dados sobre os quais os mesmos
atuam. Um procedimento pode ser uma funo que retorna um valor ou uma procedure que realiza uma srie de
operaes, podendo ou no retornar um valor. Porm este modelo apresenta srias dificuldades do ponto de vista do
usurio. Ao fazer a anlise e projeto de um programa, o analista precisa traduzir as necessidades dos usurios em
termos de procedimentos, funes, mdulos, etc. Existe uma diferena muito grande entre a linguagem dos usurios
e a linguagem dos analistas/programadores.
Um objeto uma entidade que contm, alm dos dados, todas as funes que atuam sobre estes dados. Ou seja, um
objeto composto dos dados que descrevem o objeto (propriedades) e das operaes que podem ser realizadas sobre
estes dados (mtodos). Esta abordagem j um pouco mais prxima da abordagem entendida pelos usurios finais do
sistema. Vamos imaginar um sistema para o departamento de recursos humanos. Os usurios falam em termos de
empregados, cargos, etc. Poderamos ter um objeto chamado Funcionrio. Este objeto poderia conter diversas
propriedades, tais como:
Matrcula.
Nome.
Endereo.
Fone.
Data de Admisso.
Data de Aniversrio.
Nome do Pai.
Nome da Me.
Nmero da Identidade.
Nmero do CPF.
Cargo.
Salrio.
Com isso podemos observar que as propriedades descrevem as caractersticas de um determinado objeto. O conjunto
de valores contidos nas propriedades de um determinado objeto define o seu estado atual.
Alm das propriedades o objeto pode conter mtodos. Os mtodos descrevem aes que podem ser realizadas pelo
objeto ou no objeto. Por exemplo, o nosso objeto funcionrio poderia ter um mtodo chamado pagamento, outro
chamado transferncia, mais um chamado promoo e assim por diante. Um mtodo, na prtica, uma funo ou
procedimento que realiza uma srie de aes. Os mtodos de um objeto podem receber parmetros e ter o seu
comportamento alterado, dependendo do valor dos parmetros. Por exemplo, o mtodo Promoo de um objeto
funcionrio pode receber, como parmetros, a Matrcula do funcionrio, a data da promoo e o cdigo do novo cargo.
Dentro do mtodo Promoo pode ser chamado um mtodo AtualizaSalrio, o qual atualiza o valor do salrio do
funcionrio, de acordo com o novo cargo que o mesmo ir ocupar.
62 www.juliobattisti.com.br
ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB
Figura 2.7: Objeto Funcionrio mtodos e propriedades.
Mensagens
Os objetos se comunicam atravs de um mecanismo de troca de mensagens. Mensagens so mecanismos de comunicao
entre objetos atravs do qual se desencadeia a execuo de um mtodo especfico. Atravs dos mecanismos de troca de
mensagens um objeto pode invocar mtodos de outros objetos e receber os resultados da execuo do mtodo invocado.
No desenvolvimento baseado em padres como COM/COM+ existem mtodos proprietrios para troca de mensagens.
Alm disso, cada linguagem de programao possui um conjunto distinto de tipos. Desta maneira a troca de mensagens
entre objetos criados em diferentes linguagens no uma tarefa simples. J no .NET existe um sistema de tipos comuns a
todas as linguagens: CTS Common Type System. A existncia do CTS facilita, enormemente, a interao entre objetos
criados em diferentes linguagens. Outra vantagem do Framework .NET que o mesmo utiliza um sistema para troca de
mensagens, baseado no padro XML e no protocolo SOAP, ambos adotados como um padro de fato pela indstria de TI.
Outro termo relacionado com orientaes a objetos instncia. Quando um programa carrega um determinado objeto
na memria, dizemos que foi feita uma instncia do objeto. Ao carregar na memria estamos reservando recursos para
armazenar as caractersticas do objeto atravs da definio dos valores de suas propriedades e tambm recursos para
que os mtodos do objeto possam ser executados.
Classes
Se pesquisarmos a bibliografia sobre orientao a objetos encontraremos um sem-fim de definies para classes.
Vamos inicialmente apresentar algumas das definies formais encontradas na bibliografia. Depois vamos a uma,
digamos, explicao mais light:
Na Figura 2.7 temos uma representao do objeto Funcionrio.
63
CAPTULO 2: ENTENDENDO O CLR
www.juliobattisti.com.br
Classes constituem modelos que so utilizados para a criao de objetos. Nas classes so descritas a estrutura
de dados (atravs das propriedades) e o comportamento (atravs de seus mtodos) de um ou mais objetos
similares que possuem seus dados estruturados da mesma forma e so manipulados pelos mesmos mtodos.
Um objeto uma instncia de uma classe que criada em tempo de execuo. Classes so puramente uma
descrio esttica de um conjunto de possveis objetos.
Na prtica, o que significa, por exemplo, termos uma classe chamada Funcionrios? Esta classe serve como modelo
para a criao de objetos do tipo Funcionrio. Na classe Funcionrios esto as definies das propriedades e dos
mtodos para um objeto Funcionrio. Ou seja, sempre que criarmos um objeto do tipo funcionrio, o mesmo ser
criado com todas as propriedades e mtodos da classe Funcionrios.
Como eu sou apaixonado por definies simples e sem meias-palavras, adorei esta definio que encontrei na Internet:
Classe uma forma para fazer objetos. Acho que essa frase resume tudo.
Grande parte da funcionalidade do Framework .NET fornecida por um grande nmero de classes, as quais fazem
parte de .NET Framework Class Library, j descrita anteriormente. O Framework .NET agrupa as classes de acordo
com suas funcionalidades. Um agrupamento de classes criadas para um determinado fim tambm conhecido como
um namespace (espao de nomes). Por exemplo, temos o namespace System.Data. Dentro deste namespace existem
vrias classes que fornecem os mtodos necessrios para a conexo e manipulao de fontes variadas de dados.
Existem classes para a conexo com o SQL Server 2000, outras para a conexo com fontes ODBC e assim por diante.
A biblioteca de classes do Framework .NET organizada de uma forma hierrquica, onde as classes de nveis inferiores
herdam todas as caractersticas da classe me. Falaremos mais sobre herana no prximo item.
Nos Captulos 3, 4 e 5 vamos estudar os fundamentos da linguagem C#. Veremos que tudo (ou quase tudo, como preferem
alguns) no C# so classes. At para criar um simples programa como o Hello World apresentado no Captulo 1 e exibido
novamente na Listagem 2.1, estamos criando uma classe. Observe a palavra class na segunda linha do exemplo.
Listagem 2.1 Hello World !
using System;
class primeiroprograma
{
// Meu primeiro programa em C#
// O tradicional Hello World !!
public static void Main()
{
string umamensagem = Hello World !!!;
Console.WriteLine(umamensagem);
}
}
64 www.juliobattisti.com.br
ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB
Herana
o mecanismo que permite definir uma nova classe a partir de uma classe j existente. A classe que est sendo criada
dita subclasse ou classe filha da classe j existente. Em contrapartida a classe j existente chamada de superclasse
da classe que est sendo criada. A subclasse herda a estrutura de dados e os mtodos da superclasse, podendo adicionar
variveis na estrutura de dados herdada, bem como adicionar novos mtodos e reescrever mtodos herdados.
Uma classe pode possuir uma nica superclasse herana simples, ou pode conter mais do que uma superclasse
herana mltipla. A herana mltipla tem sido alvo de muitas discusses e controvrsias. A nica linguagem, do
Framework .NET, que implementa diretamente a herana mltipla o C++. A grande discusso em torno da herana
mltipla tem a ver com a relao custo x benefcio, uma vez que a mesma de difcil implementao e concepo,
embora os benefcios nem sempre sejam os esperados.
Herana um conceito fundamental para a orientao a objetos. Atravs do mecanismo de herana podemos criar uma
classe baseada em outra j existente. A nova classe que est sendo criada herda todas as propriedades e mtodos da
classe base, tambm chamada de classe me ou superclasse conforme descrito anteriormente. A herana evita que as
propriedades e mtodos da classe me tenham que ser redefinidos na classe filho, embora a classe filho ou subclasse
possa redefinir os mtodos da classe me, atravs de um mecanismo conhecido como Overwrite.
Para ilustrar o mecanismo de herana vamos a um exemplo prtico. Vamos imaginar que voc esteja projetando um
programa baseado na orientao a objetos, evidentemente, para um banco. Uma das provveis classes seria a classe
Clientes. Nesta classe poderamos definir as caractersticas e mtodos bsicos para um cliente tpico.
Para a classe Clientes poderamos definir as seguintes propriedades:
Nome
CPF
RG
Identidade
Endereo
Cidade
CEP
Fone
e-mail
Para a classe Clientes poderamos definir os seguintes mtodos:
Cadastrar
Excluir
Atualizar
Observe que a nossa classe Clientes possui apenas as propriedades e mtodos comuns a qualquer cliente, quer seja um
grande cliente ou um pequeno correntista. Este um dos princpios da utilizao de classes: nas classes de primeiro nvel
definimos apenas as propriedades e mtodos comuns, os quais devero ser utilizados pelas classes dos demais nveis.
65
CAPTULO 2: ENTENDENDO O CLR
www.juliobattisti.com.br
Na Figura 2.8 temos uma viso geral da classe Clientes.
Figura 2.8: A classe Clientes.
Continuando o nosso exemplo, o banco tem clientes com caractersticas diferenciadas. Por exemplo:
Correntistas
Contas de poupana
Emprstimos pessoais
Financiamentos habitacionais
Cada um destes tipos de clientes possui propriedades e relaes diferenciadas com o banco. Por isso precisamos de
objetos que representem estas diferenas. A primeira sugesto seria criar uma classe para cada tipo de cliente. A ttulo
de exemplo poderamos criar as seguintes classes:
ClienteCorrentista
ClientePoupana
ClienteEmprstimo
ClienteHabitacional












66 www.juliobattisti.com.br
ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB
Ao criar a classe ClienteCorrentista podemos cri-la como uma subclasse da classe Clientes. Com isso, a classe
ClienteCorrentista herda todas as propriedades e mtodos da classe pai Clientes. Somente precisaremos implementar
as propriedades e mtodos que so especficas da subclasse ClienteCorrentista.
A ttulo de exemplo poderamos definir algumas propriedades e mtodos da classe ClienteCorrentista.
Para a classe ClienteCorrentista poderamos definir as seguintes propriedades:
NumConta
NumAgncia
Limite
Categoria
Para a classe ClienteCorrentista poderamos definir os seguintes mtodos:
DefinirLimite
AumentarLimite
BloquearConta
LiberarConta
Juntando as propriedades e classes que foram herdadas da classe pai Clientes, a classe ClienteCorrentista teria as
seguintes propriedades:
Nome (herdada da classe pai)
CPF (herdada da classe pai)
RG (herdada da classe pai)
Identidade (herdada da classe pai)
Endereo (herdada da classe pai)
Cidade (herdada da classe pai)
CEP (herdada da classe pai)
Fone (herdada da classe pai)
e-mail (herdada da classe pai)
NumConta
NumAgncia
Limite
Categoria
Juntando as propriedades e classes que foram herdadas da classe pai Clientes, a classe ClienteCorrentista teria as
seguintes propriedades:
Cadastrar (herdada da classe pai)
67
CAPTULO 2: ENTENDENDO O CLR
www.juliobattisti.com.br
Excluir (herdada da classe pai)
Atualizar (herdada da classe pai)
DefinirLimite
AumentarLimite
BloquearConta
LiberarConta
Na Figura 2.9 temos uma viso geral da classe ClienteCorrentista, j incluindo as propriedades e mtodos herdados da
classe pai Clientes.
O mesmo raciocnio tambm vlido para a criao das classes ClientePoupana, ClienteEmprstimo e
ClienteHabitacional, como subclasses da classe pai Clientes.
Figura 2.9: A classe Clientes.




















68 www.juliobattisti.com.br
ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB
Caso haja necessidade, uma subclasse pode sobrescrever um mtodo herdado da classe pai. Por exemplo, a subclasse
ClienteCorrentista poderia sobrescrever o mtodo Cadastrar da classe pai Clientes. Isso pode ser feito para que
sejam atendidas necessidades especficas do cadastramento de um cliente correntista. As linguagens do Framework
.NET suportam esta tcnica, a qual tambm conhecida como Overwrite.
Aps termos criado as demais classes do nosso exemplo, estaremos com a hierarquia de classes ilustrada na Figura 2.10.
Figura 2.10: Uma hierarquia de classes.
Conforme descrevemos anteriormente, uma hierarquia de classes tambm pode ser chamada de namespace ou espao
de nomes. Tambm j descrevemos antes que .NET Framework Class Library , na verdade, um grande nmero de
namespaces, cada um com funcionalidades especficas, funcionalidades estas disponibilizadas por um grande nmero
de classes dentro de cada um dos namespaces. Tambm gostaria de reforar que este um dos grandes atrativos do
.NET, ou seja, oferecer uma infinidade de classes, as quais facilitam muito o desenvolvimento das aplicaes e, ainda
por cima, classes estas que podem ser acessadas a partir de qualquer linguagem do Framework .NET.
Reutilizao de Cdigo
Ao utilizar uma das classes do Framework .NET qual o princpio de orientao a objetos que estamos utilizando?
Herana. Certo. Mas no era bem deste princpio que eu gostaria de tratar. Ento vamos colocar as coisas de uma
maneira um pouco diferente: Ao utilizarmos a herana, qual o princpio de orientao a objetos que estamos utilizando?
Reutilizao ou reaproveitamento de cdigo ou, de uma maneira mais chique: Reusabilidade.
Ao invs de termos que implementar a funcionalidade de determinada classe, em cada programa onde a funcionalidade
for necessria, simplesmente criamos uma classe que herda estas funcionalidades, j prontas, de uma classe do Frame-
work .NET. Com isso estamos reutilizando o cdigo j desenvolvido. Isso poupa trabalho e facilita o desenvolvimento
das aplicaes. Melhor ainda. Vamos imaginar que tenha sido descoberto um pequeno bug em um mtodo de uma
classe. Ao corrigirmos este bug na classe em questo, todos os programas que utilizam a classe passaro a ter acesso
s modificaes, ou seja, iro herdar as alteraes. Isso facilita, enormemente, a manuteno e alterao das aplicaes.
Mas era de esperarmos tal comportamento, uma vez que reutilizao de cdigo, herana e facilidade de manuteno
dos programas so alguns dos princpios bsicos da orientao a objetos.
Clientes
ClienteCorrentista ClienteEmprstimos ClienteCorrentista ClienteCorrentista
69
CAPTULO 2: ENTENDENDO O CLR
www.juliobattisti.com.br
Em uma empresa, a equipe de desenvolvimento pode criar classes bsicas, as quais podem ser utilizadas em diversos
programas da empresa. Sempre que forem feitas alteraes nas classes bsicas, as alteraes sero herdadas por todos
os programas que utilizam as classes bsicas. Vejam que este cenrio muito diferente do que acontece, na prtica,
hoje. Muitas vezes cada projeto de desenvolvimento parte do zero, sem que nada seja reaproveitado de projetos
anteriores. Com isso, uma srie de funcionalidades bsicas precisam ser reescritas a cada novo programa. Desta forma
temos projetos mais longos, com maior custo e que muito raramente so concludos no prazo.
Mais Alguns Detalhes Antes de Iniciarmos a Parte Prtica
Conforme j foi descrito anteriormente, nos prximos trs captulos estaremos tratando da linguagem C#. Nos captulos
restantes do livro, estaremos utilizando o C# para a criao de pginas ASP.NET.
Para que voc possa acompanhar os exemplos apresentados nos captulos 3, 4 e 5 necessrio que o Framework .NET
tenha sido instalado com sucesso e que o compilador do C# esteja disponvel.
A seguir coloco os passos necessrios para que voc verifique se est tudo OK com o computador que voc utilizar
para acompanhar os exemplos dos captulos 3, 4 e 5.
Para verificar se o Framework .NET foi instalado com sucesso:
1. Verifique se a opo Microsoft .NET Framework SDK foi adicionada ao menu
Programas (Iniciar -> Programas -> Microsoft .NET Framework SDK).
2. Verifique se a pasta \Arquivos de programas\Microsoft.NET\FrameworkSDK foi
criada no drive onde est instalado o Windows 2000.
Para verificar se o compilador C3 est instalado e funcionando:
1. Abra o Bloco de Notas (Iniciar -> Programas -> Acessrios -> Bloco de Notas).
2. Digite o cdigo indicado na Listagem 2.2:
Listagem 2.2 Hello World !
using System;
class teste
{
// Aprendendo C#.
// Um exemplo simples.
public static void Main()
{
Console.WriteLine(Testando o compilador !!!);
}
}
NOTA: Para orientaes
sobre o download e a
instalao do Framework
.NET consulte a
Introduo deste livro.
NOTA: Se voc est
utilizando o Windows
2000 em Ingls, ao invs
de Arquivo de
Programas, procure na
pasta Program Files.
70 www.juliobattisti.com.br
ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB
3. Selecione o comando Arquivo -> Salvar como...
4 Na lista Salvar em, navegue at a pasta C:\Meus documentos.
5. Na lista Salvar como tipo:, selecione a opo Todos os arquivos.
6. No campo Nome do arquivo:, digite teste.cs
7. Sua janela deve estar conforme indicado na Figura 2.11.
8. D um clique no boto Salvar.
9. Feche o Bloco de Notas.
10. Abra um Prompt de comando (Iniciar -> Programas -> Acessrios -> Prompt de comando).
11. Navegue at a pasta Meus documentos.
12. Por exemplo, se a pasta Meus documentos est no drive C: utilize os seguintes comandos para navegar at a pasta
Meus documentos:
C:
cd Meus documentos
Figura 2.11: Salvando o arquivo teste.cs
13. Observe que o nome da pasta Meus documentos vem entre aspas porque a mesma possui espao em branco no
nome. Se no colocarmos aspas o comando cd (change directory) ir gerar um erro.
14. O prompt deve indicar que voc est na pasta Meus documentos, conforme indicado na Figura 2.12.
71
CAPTULO 2: ENTENDENDO O CLR
www.juliobattisti.com.br
Figura 2.12: Navegando at a pasta Meus documentos.
15. Execute o seguinte comando:
csc teste.cs
16. Se o compilador C# estiver corretamente instalado, o programa teste.cs ser compilado e ser gerado um arquivo
chamado teste.exe. Para executar este arquivo basta digitar teste e pressionar Enter. Voc obter os resultados
indicados na Figura 2.13.
Figura 2.13: Executando o programa teste.exe.
72 www.juliobattisti.com.br
ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB
Observe a sada do programa que simplesmente a mensagem: Testando o compilador !!! Isto comprova que o
compilador C# est instalado e funcionando.
Concluso
J temos todas as condies para iniciar a parte prtica. J foram apresentados os aspectos tericos necessrios ao
entendimento do .NET. Agora hora de comear a trabalhar.
Ento, nada mais a concluir. J conversei bastante. Vamos prtica.
73 www.juliobattisti.com.br
CAPTULO 2: ENTENDENDO O CLR
C A P T U L O
3
Apresentando o C#
Introduo
Neste captulo apresentaremos a linguagem C# l-se C Sharp. Vamos explicar o
porqu de mais uma linguagem de programao, sendo que j temos tantas.
Tambm falaremos sobre as caractersticas que tornaro o C# uma alternativa
atraente para o desenvolvimento de solues corporativas.
Em seguida veremos a cara de um programa escrito em C#. Vamos detalhar
qual a estrutura de um programa, quais os elementos obrigatrios. Vamos apresentar
os elementos que compem um programa C#. Tambm falaremos dos comandos
bsicos para ler e escrever na tela, de tal forma que possamos apresentar alguns
exemplos simples.
Vamos entender como fazer uso das Classes do .NET Framework Class Library.
Veremos que temos duas opes para usar mtodos e propriedades das classes do
.NET Framework Class Library. Explicaremos o uso da instruo Using e veremos
como os comandos de um programa so diferentes dependendo de utilizarmos a
instruo Using ou no utilizarmos.
Vamos falar sobre os tipos bsicos disponveis no C#. Veremos que os tipos so
disponibilizados pelo Framework .NET, no que conhecido como CTS Com-
mon Type System. O CTS disponibiliza um conjunto de tipos padronizados, o
qual est disponvel para qualquer linguagem do Framework .NET. Isso faz com
que um tipo Int32, por exemplo, tenha a mesma estrutura e ocupe a mesma
quantidade de memria, quer seja em um programa escrito em C# ou VB.NET ou
qualquer outra linguagem do Framework .NET. A disponibilizao de um sistema
de tipos padronizado facilita a integrao entre programas escritos em diferentes
linguagens.
Na seqncia apresentaremos as estruturas da
linguagem C#, para o controle do fluxo do
programa. Veremos que estas estruturas so muito
semelhantes s encontradas na linguagem C++, com
algumas pequenas diferenas.
Tambm apresentaremos os principais operadores matemticos, lgicos e de
atribuio. Novamente veremos uma certa semelhana com a linguagem C++.
Juntamente com os conceitos apresentados estaremos mostrando a aplicao dos
mesmos, atravs do uso de exemplos simples e didticos. Se voc j programa em
C++ ou Java e tem um bom entendimento dos conceitos de orientao a objetos,
ver que aprender C# ser uma tarefa muito simples, rpida e agradvel. Se voc
NOTA: Para maiores
detalhes sobre o CTS
consulte os Captulos 1 e 2.
74 www.juliobattisti.com.br
ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB
for programador iniciante, no tem problema. Os exemplos apresentados iro ajud-lo a entender a estrutura e os
comandos da linguagem.
O cdigo-fonte com os exemplos dos captulos 3, 4 e 5 esto disponveis para download no site da editora Axcel
Books: www.axcel.com.br.
Antes de comearmos faa o seguinte:
Crie uma pasta chamada ExCSharp no drive C, ou em outro drive qualquer do computador que voc est utilizando
para acompanhar os exemplos deste livro. Na pasta ExCSharp crie uma subpasta chamada Cap3, outra chamada Cap4
e mais uma chamada Cap5. Colocarei, em cada uma das subpastas, os exemplos dos captulos respectivos. Dentro
destas pastas ficaro gravados dois arquivos para cada exemplo. Um arquivo com a extenso .cs, o qual o arquivo
com o cdigo-fonte, e um arquivo .exe que o resultado da compilao do arquivo .cs.
Mais uma Linguagem de Programao?
Sim, mais uma.
Para resumir em poucas palavras quais os objetivos da Microsoft com a criao do C#, eu diria o seguinte: Uma nova
linguagem, criada para ter a simplicidade e facilidade de desenvolvimento do Visual Basic, aliadas com o poder do
C++. Vamos resumir um pouco mais:
Simples
Poderosa
Fcil
Alm de poder e simplicidade, sendo uma linguagem do Framework .NET, o C# pode se beneficiar de toda a
funcionalidade disponibilizada pelo mesmo.
Alm disso podemos utilizar o C# para qualquer tipo de desenvolvimento, desde aplicaes de linha de comando,
tambm conhecidas como aplicaes de Console, passando por aplicaes grficas Win32 tradicionais, at aplicaes
Web com ASP.NET. Alis justamente de criao de aplicaes Web com a dobradinha ASP.NET/C# que estaremos
tratando do Captulo 5 at o final deste livro.
Nas verses anteriores, para a criao de pginas ASP ns tnhamos basicamente duas opes: VBScript ou JScript.
Para a criao de aplicaes WIn32 tnhamos vrias opes: VB, C++, etc.
Para aplicaes do tipo console, basicamente o C++. Agora, com o Framework .NET podemos criar qualquer tipo de
aplicao com qualquer linguagem. Se um dia tivermos um Cobol habilitado ao .NET, poderemos criar aplicaes
Web com a dobradinha ASP.NET/Cobol. Parece estranho? Que tal um FORTRAN habilitado ao .NET?
75 www.juliobattisti.com.br
CAPTULO 2: ENTENDENDO O CLR
O C# foi a linguagem utilizada para criar a maioria dos componentes do Framework .NET, o que nos leva a crer que o C#
ser a indicao da Microsoft, como linguagem para o desenvolvimento de aplicativos empresariais, baseados no .NET.
Tambm poderamos questionar se C# realmente uma nova linguagem ou um C++ remodelado com cara de Java.
As interpretaes podem variar de acordo com a opinio pessoal de cada um, mas o fato que o C# muito semelhante
ao C++, com exceo de alguns recursos e comandos que foram retirados.
Uma das diferenas tem a ver com a utilizao de ponteiros. No C# no temos ponteiros. Para os programadores C/
C++ a no existncia de ponteiros soa como uma heresia. Porm com o Framework .NET, muitas das funcionalidades
que tinham que ser codificadas no prprio programa foram passadas para o controle do Framework .NET. Muitas das
operaes avanadas que eram implementadas com a utilizao de ponteiros passaram a ser automaticamente gerenciadas
pelo Framework .NET. O exemplo mais tpico a alocao e liberao de memria pelo programa. Estas funes so
automaticamente tratadas pelo Framework .NET, liberando o programa para tratar apenas da sua prpria funcionalidade
e no de toda a infraestrutura necessria ao seu correto funcionamento. Lembrando do Captulo 1, que o cdigo das
aplicaes .NET chamado de managed code, onde operaes inseguras como o acesso direto memria no so
permitidas. Estas operaes esto a cargo do Framework .NET.
Que aprender C++ no uma tarefa simples ns j sabemos. E aprender C#? uma tarefa simples. Voc poder
constatar isso na prtica, medida que formos avanando neste livro.
A seguir listo alguns recursos do C++ que foram modificados no C#:
No existem ponteiros no C#. Gerenciamento de memria coisa do Framework .NET.
Uma srie de operadores do C++ como por exemplo: ::, . e -> foram substitudos por um nico operador no
C#: . (ponto)
Outra melhoria significativa do C# em relao ao C++ foi o gerenciamento de excees. Veremos mais detalhes nos
prximos captulos.
Como a cara de um Programa Escrito em C#?
Vamos apresentar o todo e depois explicar as partes. Em outras palavras: Vamos apresentar um programa completo,
porm bastante simples, em C#. Alm do cdigo-fonte iremos compilar e executar o programa. O nosso programa de
exemplo solicita que sejam digitados dois nmeros inteiros e exibe o resultado da adio e da multiplicao entre os
nmeros digitados. Aps criarmos e testarmos o programa, iremos s devidas explicaes. Vamos salvar o cdigo-
fonte como ex1cap3.cs. Ao compilarmos o cdigo-fonte ser gerado um arquivo chamado ex1cap3.exe.
76 www.juliobattisti.com.br
ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB
Criando o programa ex1cap3.cs:
1. Abra o Bloco de Notas (Iniciar -> Programas -> Acessrios -> Bloco de Notas).
2. Digite o cdigo indicado na Listagem 3.1:
Listagem 3.1 Um exemplo simples ex1cap3.cs
using System;
class ex1cap3
{
// Exemplo1 Captulo 3.
// Entrada e sado com C#
// Por: Jlio Battisti
// MCP, MCP+I, MCSE, MCSE+I, MCSE, MCDBA
public static void Main()
{
// Declarao das variveis.
Int32 Adicao;
Int32 Produto;
// Entrada dos valores de x e y
Console.Write(Digite o primeiro valor inteiro ->);
String Aux1=Console.ReadLine();
Console.Write(Digite o segundo valor inteiro ->);
String Aux2=Console.ReadLine();
// Clculo da adio e do produto.
Adicao = Convert.ToInt32(Aux1) + Convert.ToInt32(Aux2);
Produto = Convert.ToInt32(Aux1) * Convert.ToInt32(Aux2);
// Exibio dos resultados.
Console.WriteLine(O valor da soma -> {0},Adicao);
Console.WriteLine(O valor da Produto -> {0},Produto);
}
}
77 www.juliobattisti.com.br
CAPTULO 2: ENTENDENDO O CLR
3. Selecione o comando Arquivo -> Salvar como...
4 Na lista Salvar em, navegue at a pasta C:\ExCsharp\Cap3.
5. Na lista Salvar como tipo:, selecione a opo Todos os arquivos.
6. No campo Nome do arquivo:, digite ex1cap3.cs.
7. D um clique no boto Salvar.
8. Feche o Bloco de Notas.
9. Abra um Prompt de comando (Iniciar -> Programas -> Acessrios -> Prompt de comando).
10. Navegue at a pasta C:\ExCsharp\Cap3.
11 Execute o seguinte comando: csc ex1cap3.cs
12. Se o compilador C# estiver corretamente instalado, o programa teste.cs ser
compilado e ser gerado um arquivo chamado ex1cap3.exe.
13. Agora vamos testar o nosso exemplo. Para executar o nosso exemplo basta digitar
ex1cap3 e pressionar Enter.
14. Surge uma mensagem pedindo que voc digite o primeiro valor. Digite 10 e pressione
Enter.
15. Surge uma mensagem pedindo que voc digite o segundo valor. Digite 20 e pressione
Enter.
16. O programa exibe o resultado da soma e da adio dos valores digitados.Voc obter
os resultados indicados na Figura 3.1.
NOTA: Os passos 9, 10 e
11 so utilizados para a
compilao de um
programa C#. Podemos
resumir estes passos da
seguinte maneira:
Navegar at a pasta onde
est o arquivo fonte (.cs)
e executar o comando csc
nome_do_arquivo.cs.
Nos prximos exemplos
no irei repetir estes trs
passos detalhadamente.
Irei resumir os trs passos
em um nico: Navegue
para a pasta onde est o
arquivo .cs e execute o
comando csc
nome_do_arquivo.cs.
Figura 3.1: Execuo do programa ex1cap3.exe.
78 www.juliobattisti.com.br
ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB
Agora vamos s devidas explicaes sobre o nosso primeiro exemplo.
Vamos analisar o seguinte trecho de cdigo:
using System;
A clusula using utilizada para que possamos utilizar as classes, mtodos e
propriedades de um determinado namespace. No nosso exemplo estamos fazendo
referncia ao namespace System. Ao fazermos referncia ao namespace System,
passamos a ter acesso a todos os seus mtodos, classes e propriedades. Por exemplo,
abaixo de System, existe uma classe chamada Console System.Console. Na Classe
System.Console temos um mtodo chamado WriteLine System.Console.WriteLine.
Observe que estamos utilizando este mtodo em nosso programa. Porm, ao invs de
digitar System.Console.WriteLine, utilizamos somente Console.WriteLine. Isso
possvel pois estamos fazendo referncia ao namespace System, atravs da clusula
using. Se no fizssemos referncia ao namespace System, teramos que utilizar a
nomenclatura completa para o mtodo WriteLine System.Console.WriteLine. Ob-
serve que, ao fazermos referncia a um ou mais namespaces, estamos simplificando o
nosso cdigo.
Embora a utilizao de referncias no seja obrigatria, uma prtica recomendada, uma vez que simplifica o cdigo-
fonte. No nosso exemplo, se no tivssemos feito referncia ao namespace System, o nosso programa ficaria da
seguinte maneira:
class ex1cap3
{
// Exemplo1 Captulo 3.
// Entrada e sado com C#
// Por: Jlio Battisti
// MCP, MCP+I, MCSE, MCSE+I, MCSE, MCDBA
public static void Main()
{
// Declarao das variveis.
System.Int32 Adicao;
System.Int32 Produto;
// Entrada dos valores de x e y
System.Console.Write(Digite o primeiro valor inteiro ->);
IMPORTANTE: O C#
case sensitive, ou seja, o
mesmo faz diferena entre
letras maisculas e
minsculas. Por exemplo, se
voc declarar uma varivel i
minscula e, por engano,
utilizar em uma expresso I
maisculo ser gerado um
erro de compilao. Outro
exemplo, o comando
Console.WriteLine deve ser
escrito desta maneira; se
voc escrever, por exemplo,
Console.writeline ser
gerado um erro de
compilao.
79 www.juliobattisti.com.br
CAPTULO 2: ENTENDENDO O CLR
System.String Aux1=System.Console.ReadLine();
System.Console.Write(Digite o segundo valor inteiro ->);
System.String Aux2=System.Console.ReadLine();
// Clculo da adio e do produto.
Adicao = System.Convert.ToInt32(Aux1) + System.Convert.ToInt32(Aux2);
Produto = System.Convert.ToInt32(Aux1) * System.Convert.ToInt32(Aux2);
// Exibio dos resultados.
System.Console.WriteLine(O valor da soma -> {0},Adicao);
System.Console.WriteLine(O valor da Produto -> {0},Produto);
}
}
Observe que neste caso teramos que utilizar sempre a nomenclatura completa. Tambm cabe observar a maneira de
acessar um mtodo ou propriedade de uma classe em C#: Utilizamos o nome do namespace (System), um ponto
(System.), o nome da classe (System.Console), mais um ponto (System.Console.) e por ltimo o nome do mtodo e os
parmetros que o mtodo deve receber (System.Console.WriteLine(O valor da soma -> {0},Adicao);). Com a
utilizao da nomenclatura completa o cdigo fica mais longo e de difcil leitura.
Abaixo temos um exemplo no qual feita referncia a vrios namespaces:
using System;
using System.Data;
using System.Net;
using System.Security;
Vamos analisar o seguinte trecho de cdigo:
class ex1cap3
{
// Exemplo1 Captulo 3.
// Entrada e sado com C#
// Por: Jlio Battisti
// MCP, MCP+I, MCSE, MCSE+I, MCSE, MCDBA
No C# toda a lgica de um programa deve estar contida dentro de uma classe. Na verdade, para ser mais precisos,
teramos que modificar a frase anterior para que a mesma ficasse assim: No C# toda a lgica de um programa deve
estar contida dentro de uma definio de tipo, sendo que uma definio de tipo pode ser uma classe, uma estrutura ou
80 www.juliobattisti.com.br
ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB
outro tipo qualquer definido no Framework .NET. Para o nosso estudo de introduo ao C#, ficaremos com a primeira
frase, ou seja, toda a lgica dos nossos exemplos estar contida dentro de uma classe.
No nosso caso estamos definindo uma classe chamada ex1cap3. Um detalhe importante que o nome da classe no
precisa ser igual ao nome do arquivo .cs. Por exemplo, poderamos ter uma classe ex1cap3.cs e gravarmos o cdigo-
fonte em um arquivo chamado admult.cs.
Todo o contedo de uma classe (mtodos, propriedades, etc.) deve estar entre chaves. Na linha aps a definio do
nome da classe, temos a abertura das chaves. Na ltima linha do programa temos o fechamento das chaves.
As linhas iniciadas com duas barras (//) so linhas de comentrio. Qualquer semelhana com C/C++ no mera
coincidncia. Como temos mltiplas linhas de comentrios tambm poderamos ter utilizado a sintaxe a seguir:
/* Exemplo1 Captulo 3.
Entrada e sado com C#
Por: Jlio Battisti
MCP, MCP+I, MCSE, MCSE+I, MCSE, MCDBA */
Vamos analisar o seguinte trecho de cdigo:
public static void Main()
Aps a chave de abertura da classe (colocada logo aps a definio da classe), comeamos a definir os mtodos e
propriedades da classe ex1cap3. Todo programa em C# deve conter um mtodo chamado Main( ). Este mtodo funciona
como o ponto de entrada da aplicao. Em outras palavras, a execuo da aplicao se inicia pelo mtodo Main( ).
Dentro do mtodo Main( ) podemos fazer chamadas para outros mtodos da classe ex1cap3 ou de outras classes.
Novamente qualquer semelhana com o C/C++ no mera coincidncia.
Vamos analisar o seguinte trecho de cdigo:
{
// Declarao das variveis.
Int32 Adicao;
Int32 Produto;
// Entrada dos valores de x e y
Console.Write(Digite o primeiro valor inteiro ->);
String Aux1=Console.ReadLine();
Console.Write(Digite o segundo valor inteiro ->);
81 www.juliobattisti.com.br
CAPTULO 2: ENTENDENDO O CLR
String Aux2=Console.ReadLine();
// Clculo da adio e do produto.
Adicao = Convert.ToInt32(Aux1) + Convert.ToInt32(Aux2);
Produto = Convert.ToInt32(Aux1) * Convert.ToInt32(Aux2);
// Exibio dos resultados.
Console.WriteLine(O valor da soma -> {0},Adicao);
Console.WriteLine(O valor da Produto -> {0},Produto);
}
Este trecho de cdigo o corpo do mtodo Main( ).
Iniciamos com a declarao de duas variveis do tipo Int32:
Int32 Adicao;
Int32 Produto;
Em seguida utilizamos o mtodo Write da classe Console (Console.Write), para exibir uma mensagem na tela. Na
prxima linha o mtodo ReadLine( ) da classe Console (Console.ReadLine) exibe um cursor e fica aguardando que o
usurio digite alguma coisa e pressione Enter. Ao pressionar Enter, o valor digitado pelo usurio passado, no formato
de uma string de texto, para a varivel Aux1:
Console.Write(Digite o primeiro valor inteiro ->);
String Aux1=Console.ReadLine();
Ao final da execuo destas duas linhas temos o valor digitado pelo usurio armazenado na varivel Aux1, porm no
formato de uma string de texto. As mesmas explicaes so vlidas para a varivel Aux2.
O prximo passo calcular o valor da adio, que ser armazenado na varivel Adicao e da multiplicao, que ser
armazenado na varivel Produto. Porm as variveis Aux1 e Aux2 so do tipo texto. No podemos adicionar e multiplicar
variveis do tipo texto. Para converter o valor destas variveis para o tipo Int32 (inteiro de 32 bits), utilizamos o
mtodo ToInt32, da classe Convert, conforme indicado pelas duas linhas a seguir:
Adicao = Convert.ToInt32(Aux1) + Convert.ToInt32(Aux2);
Produto = Convert.ToInt32(Aux1) * Convert.ToInt32(Aux2);
Uma vez calculados os valores, o passo final exibi-los na tela. Isso feito como o mtodo WriteLine da classe
Console. Um detalhe interessante a utilizao do marcador {0} com esse mtodo. O {0} substitudo pelo valor da
primeira varivel passada para o mtodo, que no nosso exemplo a varivel Adicao:
Console.WriteLine(O valor da soma -> {0},Adicao);
82 www.juliobattisti.com.br
ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB
Neste caso o {0} substituido pelo valor da varivel adio. As mesmas consideraes so vlidas para a varivel
Produto, conforme indicado na linha a seguir:
Console.WriteLine(O valor da Produto -> {0},Produto);
Aps a chave de fechamento do mtodo Main( ), temos a chave de fechamento da classe ex1cap3. Cabe observar que
para a classe ex1cap3 temos um nico mtodo definido, que justamente o mtodo que obrigatrio para todas as
classes: Main( ).
Outra observao importante que todo comando encerrado com um ponto-e-vrgula (;).
Com isso, podemos apresentar a estrutura geral de um programa em C#:
using namespace1;
using namespace2;
...
using namespacen;
class nome_da_classe
{
public static void Main()
{
Comandos do mtodo Main()
}
Definio de outros mtodos e propriedades.
}
Agora que j conhecemos a cara de um programa C#, vamos comear a estudar os diversos elementos da linguagem.
Vamos iniciar falando sobre os tipos de dados disponveis no C#.
Tipos da Linguagem C#
No C# temos os seguintes tipos:
Value Types Tipos de valor.
Reference Types Tipos de referncia.
83 www.juliobattisti.com.br
CAPTULO 2: ENTENDENDO O CLR
Vamos iniciar o nosso estudo pelos Value Types.
Value Types
Um tipo Value Type contm o valor da varivel. Por conter o valor da varivel e no uma referncia (referncia=
endereo de memria) varivel, valores do tipo Value Type no podem conter o valor Null.
Outro detalhe importante a ser observado que tudo no C#, mesmo os tipos mais simples como um inteiro, considerado
um objeto. Por exemplo, o tipo inteiro definido a partir da Estrutura System.Int32 (ou System.Int16 dependendo do
tamanho necessrio). Ao criarmos uma varivel do tipo System.Int32 estamos criando uma instncia desta estrutura,
o que na prtica significa criar um objeto baseado na estrutura System.Int32. Esta estrutura possui mtodos. Um dos
mtodos, a ttulo de exemplo, o mtodo ToString, o qual converte o valor inteiro na string de texto correspondente.
Vamos a um exemplo. Vamos imaginar que as variveis a e b so do tipo Value Type. Tambm vamos imaginar que
a varivel a contm o valor 10 e a varivel b contm o valor 15. Agora considere o seguinte comando:
a = b
Neste caso o valor da varivel b atribudo varivel a. Ou seja, aps a execuo deste comando, a varivel a
contm o mesmo valor da varivel b, que no nosso exemplo 15. Agora, se modificarmos o valor da varivel b, o
que acontece com o valor da varivel a?
Nada. Como as variveis so do tipo Value Type, ao fazermos a=b, apenas atribumos o valor de b para a. Porm
a no fica com nenhuma referncia para b, ou seja, se b for modificado, a no ser afetado.
Para entendermos bem este conceito, observe o exemplo da Listagem 3.2.
Listagem 3.2 Um exemplo de Value Types ex2cap3.cs
using System;
class ex2cap3
{
// Exemplo2 Captulo 3.
// Value Types
// Por: Jlio Battisti
// MCP, MCP+I, MCSE, MCSE+I, MCSE, MCDBA
public static void Main()
{
84 www.juliobattisti.com.br
ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB
// Declarao das variveis.
Int32 a;
Int32 b;
// Atribuo valores s variveis a e b.
a=10;
b=15;
// Atribuo o valor da varivel b varivel a.
a=b;
// Exibo os valores das variveis a e b.
Console.WriteLine(Valor da varivel a: {0},a);
Console.WriteLine(Valor da varivel b: {0},b);
// Agora modifico o valor da varivel b.
// E observamos que o valor de a no se alterou.
b=33;
Console.WriteLine(****************************);
Console.WriteLine(Aps a modificao de b!!!!);
Console.WriteLine(****************************);
Console.WriteLine(Valor da varivel a: {0},a);
Console.WriteLine(Valor da varivel b: {0},b);
}
}
Compile e execute o exemplo da listagem 3.2. Voc obter os resultados indicados na Figura 3.2.
85 www.juliobattisti.com.br
CAPTULO 2: ENTENDENDO O CLR
Figura 3.2: Executando o programa ex2cap3.exe.
Observe que, aps modificarmos o valor da varivel b, o valor da varivel a manteve-se inalterado. Este o
comportamento esperado, conforme descrito anteriormente.
Em C# tambm temos os tipos simples presentes na maioria das linguagens. Conforme descrevemos anteriormente,
um tipo simples uma instncia de uma estrutura ou classe do namespace System. Para facilitar a programao, o C#
oferece aliases (apelidos) para os tipos do Framework .NET. Por exemplo, ao invs de declararmos o tipo de uma
varivel inteira como System.Int32, podemos utilizar o alias do C#: int.
Na Tabela 3.1 temos uma descrio dos principais tipos bsicos do C#. Tambm apresentamos o alias correspondente,
bem como uma descrio da faixa de valores de cada tipo.
Tipo Alias no C# Descrio
System.Byte byte Byte de 8 bits, sem sinal. Valor variando entre 0 e 255.
System.SByte sbyte Byte de 8 bits, com sinal. Valor variando entre
-128 e 127.
System.Int16 short Inteiro de 16 bits, com sinal. Valor variando entre
32.768 e 32.767.
System.UInt16 ushort Inteiro de 16 bits, sem sinal. Valor variando entre
0 e 65.535.
System.Int32 int Inteiro de 32 bits, com sinal. Valor variando entre
-2.147.438.648 e 2.147.438.647.
System.UInt32 uint Inteiro de 32 bits, sem sinal. Valor variando entre 0 e
4.294.967.295.
Tabela 3.1 Tipos bsicos do C# value types.
86 www.juliobattisti.com.br
ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB
Algumas observaes importantes sobre os tipos bsicos no C#:
No C/C++ o valor verdadeiro, para uma varivel do tipo bool, representado por qualquer valor diferente de
zero. No C# o valor verdadeiro no mais representado por qualquer valor diferente de zero.
O tipo decimal utilizado para valores que necessitam de uma alta preciso, como por exemplo valores para
clculos financeiros e monetrios. Tambm devemos destacar que a preciso dada em dgitos e no em casas
decimais. As operaes so precisas at um mximo de 28 casas decimais.
Agora vamos falar um pouco mais sobre um tipo que nos oferece mais opes: O tipo struct.
O Tipo Struct
Atravs da utilizao da palavra struct podemos construir estruturas complexas de dados. Por exemplo, um ponto no plano
cartesiano representado pelo valor de x e y. Podemos criar uma estrutura chamada ponto, a qual contm dois campos: x e
y. Alm de campos, uma estrutura pode conter constantes, mtodos, propriedades, indexadores, operadores e tipos aninhados.
Pode parecer que um struct a mesma coisa que uma classe. Porm a diferena bsica que um struct um value type,
enquanto uma classe um reference type (falaremos mais sobre reference type mais adiante). O namespace System
contm uma srie de estruturas, algumas delas descritas na tabela 3.1: System.Int16, System.Int32, System.Byte,
System.SByte e assim por diante.
Vamos criar um exemplo simples, onde criamos uma estrutura para representar nmeros complexos. Um nmero
complexo possui uma parte real e uma parte imaginria (s para lembrarmos um pouco da poca do segundo grau). A
seguir temos alguns exemplos de nmeros complexos:
Tipo Alias no C# Descrio
System.Int64 long Inteiro de 64 bits, com sinal. Valor variando entre
-9.223.372.036.854.775.808 e
9.223.372.036.854.775.807.
System.UInt64 ulong Inteiro de 64 bits, sem sinal. Valor variando entre
0 e 184.467.440.737.095.551.615.
System.Char char Um nico caractere unicode com 16 bits.
System.Single float Real de 32 bits, com sinal. Valor variando entre
-3,402823E38 e 3,402823E38.
System.Double double Real de 64 bits, com sinal. Valor variando entre
-1,79769313486232E308 e 1,79769313486232E308.
System.Boolean bool Pode conter os valores True ou False.
System.Decimal decimal Real de 128 bits, com sinal. Valor variando entre
-79.228.162.514.264.337.593.543.950.335
e 79.228.162.514.264.337.593.543.950.335.
87 www.juliobattisti.com.br
CAPTULO 2: ENTENDENDO O CLR
x = 2 + 3i
y = -1 + 4,5i
z = 3 5,2i
Onde i, por definio, representa a raiz quadrada de -1.
Para representar um nmero complexo, precisamos de dois valores do tipo single: um para a parte real e outro para a
parte imaginria. Para somar dois nmeros complexos, basta somar as partes reais e as partes imaginrias, conforme
exemplo a seguir:
x+y = (2-1)+(3+4,5)i
x=y = 1+7,5y
Vamos a um exemplo simples, onde criaremos uma estrutura para representar nmeros complexos. Nossa estrutura
conter dois campos: um para representar a parte real e outro para representar a parte imaginria. O usurio ir digitar
os valores para dois nmeros complexos e o programa far a soma dos mesmos e exibir os nmeros digitados e o
resultado da soma.
Para definir uma estrutura utilizamos a palavra struct. Por exemplo, vamos definir a estrutura numcomplexo, a qual
ser utilizada no nosso programa:
struct numcomplexo
{
public float preal,pimag;
}
Para utilizar esta estrutura no nosso exemplo, precisamos declarar uma varivel do tipo numcomplexo. Como iremos
utilizar trs variveis, sendo uma delas para conter a soma, precisamos declarar trs variveis do tipo numcomplexo:
numcomplexo num1,num2;
numcomplexo soma;
Para acessar os campos individuais da estrutura utilizamos a notao tradicional da orientao a objetos, ou seja, o
nome da estrutura seguida de um ponto (.) mais o nome do campo. Por exemplo, para atribuirmos um valor ao campo
preal, da estrutura num1, utilizamos a seguinte sintaxe:
num1.preal = 3,5;
Agora que j conhecemos o bsico sobre estruturas, vamos apresentar o nosso exemplo. Considere o exemplo da
Listagem 3.3.
Listagem 3.3 Um exemplo utilizando estruturas ex3cap3.cs
using System;
// Exemplo3 Captulo 3.
88 www.juliobattisti.com.br
ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB
// Utilizao de estruturas.
// Nmeros complexos.
// Por: Jlio Battisti
// MCP, MCP+I, MCSE, MCSE+I, MCSE, MCDBA
struct numcomplexo
{
public float preal,pimag;
}
class ex3cap3
{
public static void Main()
{
// Declarao das variveis.
numcomplexo num1,num2;
numcomplexo soma;
// Entrada dos valores para a parte real
// e a parte imaginria dos nmeros num1 e num2.
Console.Write(Digite a parte real do primeiro nmero ->);
String Auxreal1=Console.ReadLine();
num1.preal = Convert.ToSingle(Auxreal1);
Console.Write(Digite a parte imaginria do primeiro nmero ->);
String Auximag1=Console.ReadLine();
num1.pimag = Convert.ToSingle(Auximag1);
Console.Write(Digite a parte real do segundo nmero ->);
89 www.juliobattisti.com.br
CAPTULO 2: ENTENDENDO O CLR
String Auxreal2=Console.ReadLine();
num2.preal = Convert.ToSingle(Auxreal2);
Console.Write(Digite a parte imaginria do segundo nmero ->);
String Auximag2=Console.ReadLine();
num2.pimag = Convert.ToSingle(Auximag2);
// Clculo da adio dos nmeros num1 e num2.
// Para isto basta somar as partes reais e imaginrias
// dos respectivos nmeros.
soma.preal = num1.preal + num2.preal;
soma.pimag = num1.pimag + num2.pimag;
// Exibio dos resultados.
Console.WriteLine(**********************************************);
Console.WriteLine(O primeiro complexo -> {0} + {1}i,num1.preal,num1.pimag);
Console.WriteLine(**********************************************);
Console.WriteLine(O segundo complexo -> {0} + {1}i,num2.preal,num2.pimag);
Console.WriteLine(**********************************************);
Console.WriteLine(O resultado da soma -> {0} + {1}i,soma.preal,soma.pimag);
Console.WriteLine(**********************************************);
}
}
Digite o exemplo da Listagem 3.3 e salve o mesmo em um arquivo chamado ex3cap3.cs, na pasta C:\ExCsharp\cap3.
Compile e execute o exemplo da Listagem 3.3. Voc obter os resultados indicados na Figura 3.3.
Este exemplo simples serve para ilustrar a criao e utilizao de estruturas. Tambm observe que utilizamos o mtodo
ToSingle, da classe Convert Convert.ToSingle. A utilizao deste mtodo foi necessria, porque o valor retornado
pelo comando ReadLine do tipo String. Precisamos converter este valor para o tipo Single, para que possamos fazer
a operao de adio com os mesmos. O valor retornado por ReadLine armazenado em uma varivel auxiliar do tipo
String, conforme o exemplo a seguir:
String Auxreal1=Console.ReadLine();
90 www.juliobattisti.com.br
ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB
Figura 3.3: Executando o programa ex3cap3.exe.
Depois este valor convertido para o tipo Single, antes de ser atribudo parte real da varivel num1, conforme
exemplo a seguir:
num1.preal = Convert.ToSingle(Auxreal1);
Os Tipos de Enumerao
Utilizamos tipos de enumerao para criar um conjunto com valores definidos. Alm do valor definido associado
um valor numrico para cada elemento do conjunto. Por padro, o valor numrico associado do tipo inteiro e inicia
com zero.
No exemplo a seguir estamos definindo um tipo de enumerao chamado DiasDaSemana:
enum DiasDaSemana {Domingo, Segunda,Tera,Quarta,Quinta,Sexta,Sbado}
Neste caso temos associados os seguintes valores do tipo int, com cada elemento:
Domingo = 0
Segunda = 1
Tera = 2
Quarta = 3
Quinta = 4
Sexta = 5
Sbado = 6
Tambm podemos modificar o valor associado com o primeiro elemento do conjunto. Os valores dos demais elementos
vo sendo incrementados de um em um. Vamos modificar um pouco o exemplo anterior:
enum DiasDaSemana {Domingo=1, Segunda,Tera,Quarta,Quinta,Sexta,Sbado}
91 www.juliobattisti.com.br
CAPTULO 2: ENTENDENDO O CLR
Neste caso os valores inteiros associados aos elementos do conjunto seriam os seguintes:
Domingo = 1
Segunda = 2
Tera = 3
Quarta = 4
Quinta = 5
Sexta = 6
Sbado = 7
Tambm possvel definir valores especficos, associados com cada elemento do conjunto. Considere o exemplo a
seguir:
enum DiasDaSemana {Domingo=1, Segunda=3,Tera=4,Quarta=8,Quinta=11,Sexta=15,
Sbado=0}
Tambm podemos fazer com que os valores associados com os elementos do conjunto sejam de um tipo diferente de
int. Os tipos permitidos so os seguintes: long, int, short e byte. Para fazer com que os valores numricos associados
aos elementos do conjunto sejam de um tipo diferente, utilizamos a seguinte sintaxe:
enum nome_do_conjunto: tipo_desejado {Elemento1, Elemento2, ..., Elementon}
Considere o exemplo a seguir, onde definimos o conjunto DiasDaSemana com valores do tipo byte, associados aos
elementos do conjunto:
enum DiasDaSemana : byte { Domingo=1, Segunda,Tera,Quarta,Quinta,Sexta,Sbado}
Neste caso os valores do tipo byte associados aos elementos do conjunto so os seguintes:
Domingo = 1
Segunda = 2
Tera = 3
Quarta = 4
Quinta = 5
Sexta = 6
Sbado = 7
Tambm podemos utilizar a seguinte sintaxe, onde fazemos a definio de cada elemento em uma linha separada, o
que facilita a visualizao do cdigo:
enum DiasDaSemana
{
Domingo = 1,
Segunda = 2,
Tera = 3,
92 www.juliobattisti.com.br
ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB
Quarta = 4,
Quinta = 5,
Sexta = 6,
Sbado = 7
}
Reference Types
Os tipos de referncia (reference types) no armazenam os dados reais de uma varivel; ao invs disso, armazenam
uma referncia (endereo de memria) para o local onde estes dados esto armazenados. Quando uma varivel do tipo
reference type passada como parmetro de uma funo, o endereo da varivel passado para a funo e no o seu
valor. Se a funo modificar a varivel passada como parmetro, na verdade estar modificando a varivel original.
Os tipos de referncia so os seguintes:
object
class
interfaces
Delegaes
string
Arrays
Neste captulo vamos tratar dos tipos string e Arrays. Veremos alguns exemplos de utilizao dos mesmos.
O Tipo String
Toda string (valor do tipo texto) no C# uma instncia da classe System.String do .NET Framework Class Library. Por
ser uma classe, temos disposio uma srie de mtodos, campos, propriedades, operadores e construtores para
manipulao de strings.
Tambm cabe reforar que uma string um valor do tipo reference type.
Para exemplificar o uso de strings considere o exemplo da Listagem 3.4. Neste exemplo utilizaremos alguns mtodos
da classe System.String.
Listagem 3.4 Um exemplo utilizando variveis do tipo string ex4cap3.cs
using System;
class ex4cap3
{
93 www.juliobattisti.com.br
CAPTULO 2: ENTENDENDO O CLR
// Exemplo4 Captulo 3.
// Entrada e sado com C#
// Por: Jlio Battisti
// MCP, MCP+I, MCSE, MCSE+I, MCSE, MCDBA
public static void Main()
{
// Declarao de duas variveis do tipo string.
string Texto1;
string Texto2;
//Defino valores para as variveis Texto1 e Texto2;
Texto1 = Jos da Silva;
Texto2 = Maria do Socorro;
// Agora vamos utilizar o mtodo
// String.ToLower()
// para converter as strings Texto1
// e Texto2 para minsculas.
Console.WriteLine(*********************************************);
Console.WriteLine(Varivel Texto 1-> {0},Texto1.ToLower());
Console.WriteLine(Varivel Texto 2-> {0},Texto2.ToLower());
Console.WriteLine(*********************************************);
// Agora vamos utilizar o mtodo
// String.ToUpper()
// para converter as strings Texto1
// e Texto2 para MAISCULAS.
Console.WriteLine(Varivel Texto 1-> {0},Texto1.ToUpper());
Console.WriteLine(Varivel Texto 2-> {0},Texto2.ToUpper());
Console.WriteLine(*********************************************);
}
}
94 www.juliobattisti.com.br
ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB
Observe que o fato de uma string ser uma instncia de uma classe (System.String) faz com que tenhamos acesso a uma
srie de mtodos disponibilizados pela biblioteca de classes do .NET (.NET Framework Class Library). No nosso
exemplo utilizamos os mtodos ToLower( ) e ToUpper.
Digite o exemplo da Listagem 3.4 e salve o mesmo em um arquivo chamado ex4cap3.cs, na pasta C:\ExCsharp\cap3.
Compile e execute o exemplo da Listagem 3.4. Voc obter os resultados indicados na Figura 3.4.
Figura 3.4: Executando o programa ex4cap3.exe.
Na Tabela 3.2 temos uma descrio dos principais mtodos da classe System.String.
Tabela 3.2 Os principais mtodos da classe System.String.
Mtodo Descrio
Compare( ) Utilizado para comparar o valor de duas strings. Recebe como parmetros duas string:
Compare(str1,str2). Retorna um valor inteiro de 32 bits, com sinal. Se for menor do que
zero, str1 menor do que str2. Por exemplo: Jos menor do que Pedro, conta a ordem
alfabtica. Se for igual a zero str1 igual a str2 e, se for maior do que zero, str1 maior
do que str2.
CompareOrdinal( ) Compara strings desconsiderando diferenas entre idiomas, ou seja, faz uma comparao
posio a posio da string. Recebe como parmetros duas strings.
CompareTo( ) Compara uma string com a instncia de um objeto recebido como parmetro, sendo que
este objeto deve ser capaz de ser avaliado como uma string.
EndsWith( ) Utilizada para verificar se uma substring existe no final de uma string.
Concat( ) Concatena duas ou mais strings passadas como parmetros. Tambm podem ser passados
objetos como parmetros, desde que os mesmos possam ser avaliados como strings.
95 www.juliobattisti.com.br
CAPTULO 2: ENTENDENDO O CLR
Uma varivel do tipo string tambm tem duas propriedades interessantes. A primeira a propriedade Length, a qual
retorna o tamanho da strings, ou seja, o nmero de caracteres da string.
Para exemplificar o uso da propriedade Length considere o exemplo da Listagem 3.5. Neste exemplo o usurio deve
digitar uma string de texto e o programa retorna o nmero de caracteres digitados. importante salientar que espaos
em branco tambm contam.
Listagem 3.5 Um exemplo utilizando a propriedade Length ex5cap3.cs
using System;
class ex5cap3
{
// Exemplo5 Captulo 3.
// Utilizao da propriedade Lenght.
// Por: Jlio Battisti
// MCP, MCP+I, MCSE, MCSE+I, MCSE, MCDBA
public static void Main()
{
// Entrada da string pelo usurio.
Console.Write(Digite algum texto e pressione <ENTER> ->);
String Texto=Console.ReadLine();
// Exibio dos resultados.
Console.WriteLine(+++++++++++++++++++++++++++++++++++++++++++++++++++);
Console.WriteLine(Voc digitou o seguinte texto -> {0},Texto);
Console.WriteLine(O mesmo tem -> {0} caracteres.,Texto.Length);
Console.WriteLine(+++++++++++++++++++++++++++++++++++++++++++++++++++);
}
}
Mtodo Descrio
Replace( ) Substitui todas as ocorrncias de um determinado caractere por outro caractere.
ToLower( ) Converte a string para letras minsculas.
ToUpper( ) Converte a string para letras maisculas.
Trim( ) Remove os espaos em branco de uma string.
96 www.juliobattisti.com.br
ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB
Digite o exemplo da Listagem 3.5 e salve o mesmo em um arquivo chamado ex5cap3.cs, na pasta C:\ExCsharp\cap3.
Compile e execute o exemplo da Listagem 3.5. Quando o programa solicitar digite o texto: APRENDENDO C# e
pressione ENTER. Voc obter os resultados indicados na Figura 3.5.
Figura 3.5: Executando o programa ex5cap3.exe.
Tambm podemos acessar caracteres individuais de uma string, com base na posio dos mesmos. O primeiro caractere
a posio zero; o segundo, a posio 1 e assim por diante. Por exemplo, considere a string Teste definida a seguir:
string Teste = APRENDENDO C#
Agora considere a declarao e inicializao das seguintes variveis do tipo char:
char primcar = teste[0];
char segcar = teste[1];
char deccar = teste[9];
A varivel primcar conter A.
A varivel segcar conter P.
A varivel deccar conter O.
O Tipo Arrays
Um array uma varivel que contm um conjunto de elementos sendo todos do mesmo tipo. Na poca do Fortran ou
do Pascal para DOS o array era chamado de vetor, quando fosse um array de uma nica dimenso, e matriz, para um
array de duas dimenses. Temos dois fatos fundamentais a respeito de arrays:
Todos os elementos de um array devem ser do mesmo tipo.
Acessamos os elementos de um array atravs de seu(s) ndice(s).
97 www.juliobattisti.com.br
CAPTULO 2: ENTENDENDO O CLR
Por exemplo, para criarmos um array de uma nica dimenso (vetor), com 5 elementos do tipo Int32, utilizamos o
seguinte comando:
int[] meuarray = new int[5];
Podemos definir os valores deste array, da seguinte maneira:
meuarray[0] = 25;
meuarray[1] = 15;
meuarray[2] = 20;
meuarray[3] = 12;
meuarray[4] = 44;
Observe que o primeiro elemento do array o elemento de ndice zero.
Tambm podemos criar arrays de mais dimenses. Observe o exemplo a seguir, onde estamos criando um array de
duas dimenses (uma matriz), com 2 linhas e duas colunas:
int[,] minhamatriz = new int[2,2];
Podemos definir os valores deste array, da seguinte maneira:
meuarray[0,0] = 25;
meuarray[0,1] = 15;
meuarray[1,0] = 28;
meuarray[1,1] = 12;
Vamos a um exemplo simples. Onde criamos um array de duas dimenses, com 3 linhas e 3 colunas, atribumos
valores para os elementos do array, e depois exibimos os valores no vdeo.
Considere o exemplo da Listagem 3.6.
Listagem 3.6 Um exemplo utilizando um array de duas dimenses ex6cap3.cs
using System;
class ex6cap3
{
// Exemplo6 Captulo 3.
// Um array de duas dimenses.
// Por: Jlio Battisti
// MCP, MCP+I, MCSE, MCSE+I, MCSE, MCDBA
public static void Main()
98 www.juliobattisti.com.br
ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB
{
// Declarao do array de duas dimenses.
int[,] minhamatriz = new int[3,3];
// Definio dos valores do array.
minhamatriz[0,0] = 0;
minhamatriz[0,1] = 5;
minhamatriz[0,2] = 10;
minhamatriz[1,0] = 15;
minhamatriz[1,1] = 20;
minhamatriz[1,2] = 15;
minhamatriz[2,0] = 10;
minhamatriz[2,1] = 5;
minhamatriz[2,2] = 0;
// Exibio dos resultados.
Console.WriteLine(O valor da primeira linha primeira coluna ->
{0},minhamatriz[0,0]);
Console.WriteLine(O valor da primeira linha segunda coluna ->
{0},minhamatriz[0,1]);
Console.WriteLine(O valor da primeira linha terceira coluna ->
{0},minhamatriz[0,2]);
Console.WriteLine(O valor da segunda linha primeira coluna ->
{0},minhamatriz[1,0]);
Console.WriteLine(O valor da segunda linha segunda coluna ->
{0},minhamatriz[1,1]);
Console.WriteLine(O valor da segunda linha terceira coluna ->
{0},minhamatriz[1,2]);
Console.WriteLine(O valor da terceira linha primeira coluna ->
{0},minhamatriz[2,0]);
Console.WriteLine(O valor da terceira linha segunda coluna ->
{0},minhamatriz[2,1]);
Console.WriteLine(O valor da terceira linha terceira coluna ->
{0},minhamatriz[2,2]);
}
}
99 www.juliobattisti.com.br
CAPTULO 2: ENTENDENDO O CLR
Digite o exemplo da Listagem 3.6 e salve o mesmo em um arquivo chamado ex6cap3.cs, na pasta C:\ExCsharp\cap3.
Compile e execute o exemplo da Listagem 3.6. Voc obter os resultados indicados na Figura 3.6.
Figura 3.6: Executando o programa ex6cap3.exe.
Os valores para a(s) dimenso(es) de um array podem ser fornecidos pelo usurio, para
que o mesmo seja criado com tamanhos variveis, cada vez que o programa executado.
Por exemplo, vamos supor que o usurio tenha fornecido o valor 5 para a dimenso de
um array e que este valor esteja em uma varivel chamada dimenarray. Podemos criar,
por exemplo, um array de inteiros com a dimenso definida pela varivel dimenarray,
utilizando o seguinte comando:
int[] arraydinamico = new int[dimenarray];
Instrues de Fluxo de Controle no C#
Toda linguagem disponibiliza uma srie de instrues para controlar o fluxo de execuo
do programa. So instrues para executar um ou outro conjunto de comando dependendo
de uma condio ser verdadeira ou falsa; so instrues para executar um conjunto de
comandos um nmero determinado de vezes e instrues para executar um conjunto de
comandos at que uma condio se torne verdadeira ou falsa.
No C#, as instrues de fluxo de controle so divididas em trs categorias:
Instrues de seleo.
Instrues de repetio.
Instrues de salto (jump).
A maioria das instrues tem o seu funcionamento baseado em um teste lgico, o qual retorna True ou False.
NOTA: Apresentaremos
mais alguns exemplos
com arrays mais adiante
neste captulo, onde
falaremos sobre as
estruturas de controle do
C#. Veremos alguns
exemplos ao
apresentarmos a
estrutura de controle For,
a qual tipicamente
utilizada para percorrer
todos os elementos de um
array.
100 www.juliobattisti.com.br
ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB
Instrues de Seleo
As instrues de seleo executam um entre vrios comandos disponveis. O comando a ser executado selecionado
com base no valor de uma expresso.
A Instruo If
Este comando seleciona um comando ou grupos de comando para execuo, com base no valor retornado por uma
expresso boleana. Uma expresso boleana somente pode retornar dois valores: True ou False.
A forma mais simples deste comando indicada a seguir:
if expresso
{
comando1;
comando2;
...
comandon;
}
Comando1, Comando2 at Comandon somente sero executados se a expresso for verdadeira. Observe que podemos
executar mais do que um comando, caso a expresso seja verdadeira. Para isto basta colocar os diversos comandos
entre chaves. Considere o seguinte exemplo:
if (x>y)
{
Console.WriteLine(X maior do que y)
x = x+1
y = y-1
}
Os comandos entre as chaves somente sero executados quando x for maior do que y; caso contrrio, a execuo
pula para o primeiro comando aps o fechamento das chaves.
Uma outra forma da instruo if a que inclui a clusula else. Com a clusula else podemos definir um conjunto de
comandos que devem ser executados se a expresso de teste retornar False. A sintaxe para esta instruo a seguinte:
if (x<y)
{
comando1_verdadeiro;
comando2_verdadeiro;
...
comandon_verdadeiro;
101 www.juliobattisti.com.br
CAPTULO 2: ENTENDENDO O CLR
}
else
{
comando1_falso;
comando2_falso;
...
comandon_falso;
}
Vamos a um exemplo simples, onde o usurio entra com dois valores. O programa devolve diferentes mensagens para
o caso de o primeiro ser maior do que o segundo ou para o caso do segundo ser maior ou igual ao primeiro.
Considere o exemplo da Listagem 3.7.
Listagem 3.7 Um exemplo utilizando a instruo if ex7cap3.cs
using System;
class ex7cap3
{
// Exemplo7 Captulo 3.
// Utilizando a instruo If.
// Por: Jlio Battisti
// MCP, MCP+I, MCSE, MCSE+I, MCSE, MCDBA
public static void Main()
{
// Declarao das variveis.
int valor1;
int valor2;
// Entrada dos valores de x e y
Console.Write(Digite o primeiro valor inteiro ->);
String Aux1=Console.ReadLine();
Console.Write(Digite o segundo valor inteiro ->);
102 www.juliobattisti.com.br
ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB
String Aux2=Console.ReadLine();
// Converto os valores para inteiro.
valor1 = Convert.ToInt32(Aux1);
valor2 = Convert.ToInt32(Aux2);
// Teste e exibio dos resultados.
if (valor1>valor2)
{
Console.WriteLine(*****************************************);
Console.WriteLine(PRIMEIRO VALOR MAIOR DO QUE O SEGUNDO !);
Console.WriteLine(*****************************************);
Console.WriteLine(O PRIMEIRO VALOR DIGITADO FOI: {0},valor1);
Console.WriteLine(O SEGUNDO VALOR DIGITADO FOI: {0},valor2);
Console.WriteLine(*****************************************);
}
else
{
Console.WriteLine(*****************************************);
Console.WriteLine(PRIMEIRO VALOR MENOR OU IGUAL AO SEGUNDO !);
Console.WriteLine(*****************************************);
Console.WriteLine(O PRIMEIRO VALOR DIGITADO FOI: {0},valor1);
Console.WriteLine(O SEGUNDO VALOR DIGITADO FOI: {0},valor2);
Console.WriteLine(*****************************************);
}
}
}
Digite o exemplo da Listagem 3.7 e salve o mesmo em um arquivo chamado ex7cap3.cs, na pasta C:\ExCsharp\cap3.
Compile e execute o exemplo da Listagem 3.7. Para o primeiro valor digite 10 e para o segundo digite 5. Voc obter
os resultados indicados na Figura 3.7.
103 www.juliobattisti.com.br
CAPTULO 2: ENTENDENDO O CLR
Repita a execuo do programa. Agora digite 10 para o primeiro valor e 15 para o segundo. Voc obter os resultados
indicados na Figura 3.8.
Figura 3.7: Executando o programa ex7cap3.exe.
Figura 3.8: Executando o programa ex7cap3.exe com novos valores.
Tambm podemos utilizar mais do que um else na mesma instruo if. Neste caso, aps a clusula else, iniciamos um
novo if. A melhor maneira de entendermos esta estrutura atravs de um exemplo. Vamos supor que voc tenha que
executar diferentes comandos dependendo do valor de uma varivel x ser igual a 0, 1, 2, ou 3. Para isso, poderamos
utilizar o seguinte bloco de cdigo:
104 www.juliobattisti.com.br
ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB
if (x == 0)
{
comandos para x = 0
}
else if (x == 1)
{
comandos para x = 1
}
else if (x==2)
{
comandos para x = 2
}
else
{
comandos para x = 3
}
Observe que a ltima hiptese (x == 3) no precisamos testar, pois, se a execuo chegou
at o ltimo else, porque x no igual a 0, nem igual a 1 e nem igual a 2. Quando um
dos testes for verdadeiro, os comandos associados so executados e a execuo pula
para o primeiro comando aps o bloco if.
Na Tabela 3.3, temos uma descrio dos principais operadores de comparao.
Tabela 3.3 Os principais operadores de comparao.
IMPORTANTE: Observe
que o operador para
comparao de igualdade
no um sinal simples de
igual (=); ao invs disso
um sinal duplo de
igualdade (==). O
operador simples (=)
utilizado para atribuio
de valores para variveis.
Para comparao utiliza-
se o operador ==.
Operador Descrio
== Igual. Retorna verdadeiro se os valores comparados forem iguais.
!= Diferente. Retorna verdadeiro se os valores comparados forem
diferentes.
> Maior do que. Retorna verdadeiro se o primeiro valor for maior do
que o segundo (x>y).
< Menor do que. Retorna verdadeiro se o primeiro valor for menor
do que o segundo (x<y).
>= Maior ou igual a. Retorna verdadeiro se o primeiro valor for maior
ou igual ao segundo (x>=y).
<= Menor ou igual a. Retorna verdadeiro se o primeiro valor for
menor ou igual ao segundo (x<=y).
105 www.juliobattisti.com.br
CAPTULO 2: ENTENDENDO O CLR
Porm, para situaes em que temos que testar vrias possibilidades, a utilizao de sucessivas instrues if-else pode
no ser a soluo mais adequada. Para isso temos a instruo switch.
A Instruo Switch
A instruo switch tem uma expresso de controle bem no incio do lao. Com base no valor da expresso de controle,
diferentes comandos sero executados.
Sintaxe para a instruo switch:
switch (expresso_de_controle)
{
case valor_1:
comando1;
comando2;
...
comandon;
comando para sair;
case valor_2:
comando1;
comando2;
...
comandon;
comando para sair;
...
case valor_n:
comando1;
comando2;
...
comandon;
comando para sair;
default:
comando1;
comando2;
...
comandon;
comando para sair;
}
106 www.juliobattisti.com.br
ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB
Para a expresso de controle podemos utilizar os seguintes tipos: sbyte, byte, short, ushort, long, ulong, char, string ou
um tipo de enumerao.
A expresso_de_controle avalidada. Se um dos valores (valor_1, valor_2, etc.) for coincidente com o valor da
expresso_de_controle, os comandos respectivos sero executados. Se no tivermos nenhuma coincidncia, os comandos
do rtulo default: sero executados. Se no houver um rtulo default, e no houver coincidncia com nenhum valor, a
execuo segue para o primeiro comando aps o final do bloco switch.
comando para sair um comando que faz com que a execuo saia do bloco switch, de tal maneira que os demais
valores no precisem ser avaliados, uma vez que uma coincidncia j foi encontrada ou os comandos relacionados ao
rtulo default: foram executados. O comando mais comumente utilizado o break.
Vamos a um exemplo simples, no qual o usurio deve digitar um valor entre 1 e 7. O programa informa o dia da
semana correspondente, de acordo com o seguinte critrio:
Domingo = 1
Segunda-feira = 2
Tera-feira = 3
Quarta-feira = 4
Quinta-feira = 5
Sexta-feira = 6
Sbado = 7
Considere o exemplo da Listagem 3.8.
Listagem 3.8 Um exemplo utilizando a instruo switch ex8cap3.cs
using System;
class ex8cap3
{
// Exemplo 8 Captulo 3.
// Utilizando a instruo switch.
// Por: Jlio Battisti
// MCP, MCP+I, MCSE, MCSE+I, MCSE, MCDBA
public static void Main()
{
107 www.juliobattisti.com.br
CAPTULO 2: ENTENDENDO O CLR
// Declarao da varivel do tipo inteiro.
int dia;
// Entrada do valor pelo usurio.
Console.Write(Digite um nmero inteiro entre 1 e 7 ->);
String Aux1=Console.ReadLine();
// Converto o valor para inteiro.
dia = Convert.ToInt32(Aux1);
// Utilizo switch para testar o valor da varivel dia.
switch (dia)
{
case 1:
Console.WriteLine(*****************************************);
Console.WriteLine(VOC ESCOLHEU O DOMINGO !!);
Console.WriteLine(*****************************************);
break;
case 2:
Console.WriteLine(*****************************************);
Console.WriteLine(VOC ESCOLHEU A SEGUNDA-FEIRA !!);
Console.WriteLine(*****************************************);
break;
case 3:
Console.WriteLine(*****************************************);
Console.WriteLine(VOC ESCOLHEU A TERA-FEIRA !!);
Console.WriteLine(*****************************************);
break;
case 4:
108 www.juliobattisti.com.br
ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB
Console.WriteLine(*****************************************);
Console.WriteLine(VOC ESCOLHEU A QUARTA-FEIRA !!);
Console.WriteLine(*****************************************);
break;
case 5:
Console.WriteLine(*****************************************);
Console.WriteLine(VOC ESCOLHEU A QUINTA-FEIRA !!);
Console.WriteLine(*****************************************);
break;
case 6:
Console.WriteLine(*****************************************);
Console.WriteLine(VOC ESCOLHEU SEXTA-FEIRA !!);
Console.WriteLine(*****************************************);
break;
case 7:
Console.WriteLine(*****************************************);
Console.WriteLine(VOC ESCOLHEU O SBADO !!);
Console.WriteLine(*****************************************);
break;
default:
Console.WriteLine(*****************************************);
Console.WriteLine(VOC NO DIGITOU UM VALOR ENTRE 1 E 7 !!);
Console.WriteLine(*****************************************);
break;
} //Esta chave fecha o lao switch.
} //Esta chave fecha o mtodo Main()
} Esta chave fecha a classe ex8cap3.
Digite o exemplo da Listagem 3.8 e salve o mesmo em um arquivo chamado ex8cap3.cs, na pasta C:\ExCsharp\cap3.
Compile e execute o exemplo da Listagem 3.8. Digite o valor 5. Voc obter os resultados indicados na Figura 3.9.
109 www.juliobattisti.com.br
CAPTULO 2: ENTENDENDO O CLR
Figura 3.9: Executando o programa ex8cap3.exe.
Repita a execuo do programa. Agora digite 10. Voc obter os resultados indicados na Figura 3.10.
Figura 3.10: Executando o programa ex8cap3.exe com um valor igual a 10.
Instrues de Repetio
As instrues de repetio, como o prprio nome sugere, permitem que um conjunto de comandos seja executado um
nmero definido de vezes ou at que uma determinada condio seja verdadeira. Vamos estudar as seguintes instrues:
for
while
do/while
foreach
110 www.juliobattisti.com.br
ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB
A Instruo For
Esta instruo utilizada para repetir um ou mais conjuntos, um nmero determinado de vezes. A instruo for do C#
praticamente igual ao comando for do C/C++. composta de trs partes, conforme indicado na sintaxe a seguir:
for (inicializao; expresso boleana; incremento)
{
comando1
comando2
...
comandon
}
O nmero de vezes que os comandos da instruo for sero executados determinado por uma varivel de controle. Na
primeira parte do lao for, definimos um valor para esta varivel. Na segunda parte fazemos um teste para ver se a
varivel j atingiu um valor limite. A terceira e ltima parte informa o incremento da varivel a cada passagem do lao.
Enquanto a expresso boleana for verdadeira, os comandos do lao continuam a ser executados. Quando a expresso
torna-se falsa, a execuo pula para o primeiro comando aps a chave de fechamento do lao for.
Vamos a um exemplo simples, onde so exibidos os nmeros entre 1 e 10 e o valor do nmero elevado ao quadrado e
ao cubo.
Considere o exemplo da Listagem 3.9
Listagem 3.9 Um exemplo utilizando a instruo For ex9cap3.cs
using System;
class ex9cap3
{
// Exemplo9 Captulo 3.
// A instruo for.
// Por: Jlio Battisti
// MCP, MCP+I, MCSE, MCSE+I, MCSE, MCDBA
public static void Main()
{
// Declarao da varivel.
111 www.juliobattisti.com.br
CAPTULO 2: ENTENDENDO O CLR
int i;
// Lao for que executado dez vezes.
Console.WriteLine(Nmero+\t+Quadrado+\t+Cubo);
for (i=1;i<=10;i++)
{
Console.Write(i+\t);
Console.Write({0}+\t+\t,i*i);
Console.WriteLine({0},i*i*i);
}
}
}
Digite o exemplo da Listagem 3.9 e salve o mesmo em um arquivo chamado ex9cap3.cs, na pasta C:\ExCsharp\cap3.
Compile e execute o exemplo da Listagem 3.9. Voc obter os resultados indicados na Figura 3.11.
Figura 3.11: Executando o programa ex9cap3.exe.
Observe que para o lao for utilizamos uma varivel inteira i. Inicializamos a mesma com o valor 1. O teste 1<=10 faz
com que o lao seja executado dez vezes. A ltima parte: i++ e novidade. O operador ++ incrementa a varivel i de um
em um. O resultado o mesmo que se tivssemos utilizado: i=i+1. No prximo captulo faremos um estudo detalhado
dos operadores do C#.
Para calcular o quadrado multiplicamos o nmero por ele mesmo: i*i.
Para calcular o cubo multiplicamos o nmero por ele mesmo, trs vezes: i*i*i.
112 www.juliobattisti.com.br
ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB
Na Tabela 3.4 temos uma descrio dos principais operadores aritmticos.
Tabela 3.4 Os principais operadores aritmticos.
Operador Descrio
+ Adio.
- Subtrao.
* Multiplicao.
/ Diviso.
Observe que tambm utilizamos o cdigo de controle \t tabulao. Utilizamos a tabulao para alinhar os resultados.
Tambm podemos utilizar instrues for aninhadas, isto , instrues for uma dentro da outra. O uso tpico para
instrues for aninhadas para percorrer os valores de uma matriz, onde a instruo for mais externa vai variando
o nmero das linhas e a instruo for mais interna vai variando o nmero das colunas. Observe o exemplo a seguir:
for (i=1;i<=6;I++)
{
for (j=1;j<=5;j++)
{
Comando1
Comando2
...
Comandon
}
}
Neste caso primeiro i=1. O programa entra no lao interno e para i=1 o lao interno executado 6 vezes, ou seja: i=1,
j=1 e i=1, j=2 e i=1, j=3 e i=1, j=4 e i=1, j=5 . Agora i incrementado e torna-se igual a 2. Para i=2 o j varia de 1 a 5
e a histria se repete. At que i tenha variado at 6 e j at 5.
Vamos comprovar estas variaes atravs de um exemplo prtico. Neste exemplo utilizaremos dois laos. No lao
externo i varia de 1 at 6. No lao interno i varia de 1 at 5. Dentro do lao colocamos comandos que vo exibindo os
valores de i e j respectivamente.
Considere o exemplo da Listagem 3.10
113 www.juliobattisti.com.br
CAPTULO 2: ENTENDENDO O CLR
Listagem 3.10 Exemplo utilizando instrues For aninhadas ex10cap3.cs
using System;
class ex10cap3
{
// Exemplo 10 Captulo 3.
// Instrues for aninhadas.
// Por: Jlio Battisti
// MCP, MCP+I, MCSE, MCSE+I, MCSE, MCDBA
public static void Main()
{
// Declarao das variveis.
int i;
int j;
// Lao que executado com i de 1 at 6
// e com j variando de 1 at 5.
Console.WriteLine(i j+\t+i j+\t+i j+\t+i j+\t+i j);
for (i=1;i<=6;i++)
{
for (j=1;j<=5;j++)
{
Console.Write(i);
Console.Write( {0},j);
Console.Write(\t);
}
Console.WriteLine();
}
}
}
114 www.juliobattisti.com.br
ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB
Figura 3.12: Executando o programa ex10cap3.exe.
Aps encerrada a execuo do lao for, a execuo segue normalmente para o comando seguinte ao encerramento do
lao for. Tambm podemos utilizar a instruo break, dentro da lao for, para encerr-lo e desviar a execuo para o
primeiro comando aps o encerramento do lao. Normalmente a instruo break colocada dentro de uma instruo
if, de tal maneira que a mesma somente ser executada se uma determinada condio for alcanada.
A Instruo While
A instruo while executa um ou mais comandos enquanto uma determinada condio
for verdadeira. A condio testada no incio do lao. Se a condio for verdadeira o(s)
comando(s) do lao so executados. Ao chegar no final do lao a execuo volta para o
teste no incio do lao while. Se a condio continuar verdadeira o(s) comando(s) so
executados novamente e o processo se repete, at que a condio no incio do lao se
torne falsa. Quando a condio se torna falsa, a execuo pula para o primeiro comando
aps o final do lao while. A seguir temos a sintaxe para o comando while:
while (condio)
{
comando1
comando2
...
comandon
}
Digite o exemplo da Listagem 3.10 e salve o mesmo em um arquivo chamado ex10cap3.cs, na pasta C:\ExCsharp\cap3.
Compile e execute o exemplo da Listagem 3.10. Voc obter os resultados indicados na Figura 3.12.
IMPORTANTE: Os
comandos de dentro do
lao devem ser capazes
de tornar a condio falsa
em um determinado
momento, pois caso
contrrio o lao
continuar a ser
executado infinitamente.
Neste caso teremos criado
um lao infinito, no qual
o programa ficar
executando,
normalmente, at
congelar.
115 www.juliobattisti.com.br
CAPTULO 2: ENTENDENDO O CLR
Uma caracterstica importante da instruo while que, se no incio do lao, a condio j for falsa, os comandos do
interior do lao no sero executados nem uma nica vez.
Vamos a um exemplo de utilizao da instruo While. No exemplo da Listagem 3.11 utilizamos a funo While para
determinar a soma dos n primeiros nmeros inteiros. O valor de n informado pelo usurio.
Considere o exemplo da Listagem 3.11.
Listagem 3.11 Um exemplo utilizando a instruo While ex11cap3.cs
using System;
class ex11cap3
{
// Exemplo 11 Captulo 3.
// Instruo while.
// Por: Jlio Battisti
// MCP, MCP+I, MCSE, MCSE+I, MCSE, MCDBA
public static void Main()
{
// Declarao das variveis.
int n;
int i;
int soma;
// Entrada do valor de n pelo usurio.
Console.Write(Digite um valor inteiro entre 1 e 100 ->);
String Aux1 = Console.ReadLine();
n = Convert.ToInt32(Aux1);
// Utilizamos o lao While para determinar a soma dos n
// primeiros nmeros inteiros.
116 www.juliobattisti.com.br
ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB
soma = 0;
i=1;
while (i<=n)
{
soma=soma+i;
i=i+1; //IMPORTANTSSIMO
}
//Exibio dos resultados.
Console.WriteLine(***********************************************);
Console.WriteLine(Soma dos nmeros inteiros de 1 a {0},n);
Console.WriteLine(***********************************************);
Console.WriteLine(SOMA > {0},soma);
Console.WriteLine(***********************************************);
}
}
Note a observao: //IMPORTANTSSIMO. Se no colocssemos essa linha i=i+1, a varivel i no seria incrementada
a cada passo do lao e, portanto, o teste (i<=n) nunca se tornaria falso, o que faria com que o lao ficasse executando
infinitamente.
Digite o exemplo da Listagem 3.11 e salve o mesmo em um arquivo chamado ex11cap3.cs, na pasta C:\ExCsharp\cap3.
Compile e execute o exemplo da Listagem 3.11. Digite o valor 50. Voc obter os resultados indicados na Figura 3.13.
Figura 3.13: Executando o programa ex11cap3.exe com um valor 50.
117 www.juliobattisti.com.br
CAPTULO 2: ENTENDENDO O CLR
Figura 3.14: Executando o programa ex11cap3.exe com um valor igual a 80.
A Instruo do/while
Com a instruo do/while deslocamos o teste para o final do lao. Com isso estamos garantindo que os comandos no
interior do lao sero executados pelo menos uma vez, j que a condio somente ser avaliada no final do lao, aps
os comandos terem sido executados.
A sintaxe para a instruo do/while a seguinte:
do
{
comando1
comando2
...
comandon
}
while (teste)
Repita a execuo do programa. Agora digite 85. Voc obter os resultados indicados na Figura 3.14.
118 www.juliobattisti.com.br
ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB
Uma caracterstica importante da instruo while que os comandos do lao so
executados, pelo menos uma vez.
Vamos a um exemplo de utilizao da instruo While. No exemplo da Listagem 3.12
utilizamos a funo do/while para fazer com que o valor digitado pelo usurio esteja
dentro de uma determinada faixa. No nosso caso, queremos que o usurio digite um
valor menor do que 10. Se for digitado um valor maior ou igual a 10, o programa apresenta
novamente uma mensagem para que seja digitado um valor menor do que 10.
Considere o exemplo da Listagem 3.12.
IMPORTANTE: Os
comandos de dentro do lao
devem ser capazes de
tornar a condio falsa em
um determinado momento,
pois caso contrrio o lao
continuar a ser executado
infinitamente. Neste caso
teremos criado um lao
infinito, no qual o programa
ficar executando,
normalmente, at congelar.
Listagem 3.12 Exemplo utilizando a instruo Do/While ex12cap3.cs
using System;
class ex12cap3
{
// Exemplo 12 Captulo 3.
// Instruo do/while.
// Por: Jlio Battisti
// MCP, MCP+I, MCSE, MCSE+I, MCSE, MCDBA
public static void Main()
{
// Declarao da varivel.
int i;
// Enquanto o usurio no digitar um valor menor
// do que 10 o programa no vai adiante.
do
119 www.juliobattisti.com.br
CAPTULO 2: ENTENDENDO O CLR
{
Console.Write(Digite um valor menor do que 10 ->);
String Aux1 = Console.ReadLine();
i = Convert.ToInt32(Aux1);
}
while (i>=10);
Console.WriteLine(***********************************************);
Console.WriteLine(AGORA SIM VOC DIGITOU UM VALOR MENOR DO QUE 10);
Console.WriteLine(***********************************************);
Console.WriteLine(VALOR DIGITADO > {0},i);
Console.WriteLine(***********************************************);
}
}
Digite o exemplo da Listagem 3.12 e salve o mesmo em um arquivo chamado ex12cap3.cs, na pasta C:\ExCsharp\cap3.
Compile e execute o exemplo da Listagem 3.12. Digite o valor 25 e pressione ENTER. Observe que o programa
solicita novamente que seja digitado um valor menor do que 10. Digite 50. Mesma coisa. Agora digite 8. Voc obter
os resultados indicados na Figura 3.15.
Figura 3.15: Executando o programa ex12cap3.exe.
120 www.juliobattisti.com.br
ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB
A Instruo Foreach
Esta instruo j uma velha conhecida da turma do Visual Basic. A instruo foreach utilizada para percorrer todos
os elementos de uma determinada coleo. Tambm podemos utilizar esta instruo para percorrer todos os elementos
de um array de elementos, uma vez que um array no deixa de ser uma coleo de elementos do mesmo tipo.
A seguir um exemplo no qual utilizamos a instruo foreach para exibir os elementos de um array de strings.
Considere o exemplo da Listagem 3.13.
Listagem 3.13 Exemplo utilizando a instruo ForEach ex13cap3.cs
using System;
class ex13cap3
{
// Exemplo 13 Captulo 3.
// Instruo foreach.
// Por: Jlio Battisti
// MCP, MCP+I, MCSE, MCSE+I, MCSE, MCDBA
public static void Main()
{
// Declarao e preenchimento do array.
string[] nomes = {jos,maria,pedro,antnio,carlo};
// Utilizo foreach para percorrer todos os elementos do array.
foreach (string nome in nomes)
Console.WriteLine(Nome: {0},nome);
}
}
Digite o exemplo da Listagem 3.13 e salve o mesmo em um arquivo chamado ex13cap3.cs, na pasta C:\ExCsharp\cap3.
Compile e execute o exemplo da Listagem 3.13. Voc obter os resultados indicados na Figura 3.16.
121 www.juliobattisti.com.br
CAPTULO 2: ENTENDENDO O CLR
Figura 3.16: Executando o programa ex13cap3.exe.
Observe os seguintes comandos:
foreach (string nome in nomes)
Console.WriteLine(Nome: {0},nome);
O primeiro comando percorre os elementos do array nomes. O segundo comando exibe o valor de cada elemento.
Vamos a mais um exemplo de utilizao de foreach para percorrer os elementos de uma coleo. Dentro do namespace
System, temos a classe System.Environment. Dentro desta classe temos um mtodo chamado GetLogicalDrives. Este
mtodo retorna um array de strings contendo o nome dos drives lgicos do computador. Depois utilizaremos foreach
para percorrer os elementos do array de strings retornado por GetLogicalDrives.
Considere o exemplo da Listagem 3.14.
Listagem 3.14 Outro exemplo utilizando a instruo ForEach ex13cap3.cs
using System;
class ex14cap3
{
// Exemplo 14 Captulo 3.
// Instruo foreach.
// Mtodo Environment.GetLogicalDrives()
// Por: Jlio Battisti
122 www.juliobattisti.com.br
ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB
// MCP, MCP+I, MCSE, MCSE+I, MCSE, MCDBA
public static void Main()
{
// Declarao e preenchimento do array.
string[] drives = Environment.GetLogicalDrives();
// Utilizo foreach para percorrer todos os elementos do array.
foreach (string drive in drives)
Console.WriteLine(Nome: {0},drive);
}
}
Digite o exemplo da Listagem 3.14 e salve o mesmo em um arquivo chamado ex14cap3.cs, na pasta C:\ExCsharp\cap3.
Compile e execute o exemplo da Listagem 3.14. Voc obter os resultados indicados na Figura 3.17.
Figura 3.17: Executando o programa ex14cap3.exe.
123 www.juliobattisti.com.br
CAPTULO 2: ENTENDENDO O CLR
De diferente neste exemplo, em relao ao anterior, apenas o fato de termos utilizado
uma classe do .NET Framework Class Library Environment.GetLogicalDrives( ), a
qual retorna o nome (letra da unidade) de todos os drives lgicos do computador.
Instrues de Salto (Jump)
As instrues de salto transferem, incondicionalmente, a execuo do programa para
fora de um lao ou para um ponto especfico do programa. Por exemplo, podemos utilizar
uma instruo break para sair de um lao while, mesmo que a condio do lao ainda
no tenha se tornado falsa.
Temos as seguintes instrues de salto:
break
continue
goto (No, goto no! Tem sim. Mas no se assuste.)
return
throw
A Instruo Break
Sintaxe:
break;
A instruo break utilizada para sair de um lao switch, while, do/while, for ou foreach. A execuo passa para o
primeiro comando aps o final do lao onde o break foi executado. Se colocarmos o break fora de um dos laos
citados, obteremos um erro de compilao.
A Instruo Continue
Dentro de um lao, quando encontrada uma instruo continue, os demais comandos do lao so ignorados e o lao
executado novamente, dependendo do valor do teste. A diferena entre a instruo break e a instruo continue que
o break sai definitivamente do lao, passando a execuo para o comando imediatamente aps o lao; enquanto o
continue apenas suspende os comandos restantes e continua a execuo do lao, at que o mesmo seja encerrado.
A Instruo Goto
A utilizao da instruo goto conhecida de longa data. Podemos utilizar a instruo goto para saltar diretamente
para um rtulo definido no cdigo do programa. Um rtulo definido da seguinte maneira:
nome_do_rtulo:
Porm esta prtica altamente desaconselhada. Quem no lembra dos famosos programas macarro da poca do Basic.
Um programa macarro o que utiliza muitas instrues goto, onde a execuo fica pulando de uma parte para outra do
NOTA: Os resultados
obtidos podem ser
diferentes dos exibidos na
Figura 3.17, uma vez que
o mesmo depende dos
drives configurados no
computador que voc
estiver utilizando.
124 www.juliobattisti.com.br
ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB
programa. O C# desencoraja o uso do goto, aplicando algumas restries para a utilizao do mesmo. Por exemplo, no
podemos utilizar goto para deslocar a execuo para dentro de um bloco de comandos, como por exemplo um for ou while.
A Instruo Return
Esta instruo, normalmente, utilizada dentro de uma funo. A instruo return retorna o controle do programa
para o comando seguinte ao que fez a chamada funo e pode tambm retornar um valor calculado pela funo.
A Instruo Throw
Esta instruo utilizada no tratamento de excees e ser vista no prximo captulo.
Concluso
Neste captulo tratamos dos aspectos bsicos da linguagem C#. Como estaremos utilizando o C# para a criao da parte
programada das pginas ASP.NET a partir do Captulo 6, este captulo forma uma base importante para o restante do livro.
Iniciamos o captulo apresentando as caractersticas gerais do C# e o porqu de mais uma linguagem de programao.
Vimos que a proposta do C# ser simples como o Visual Basic porm to poderoso quanto o C++.
Em seguida apresentamos a estrutura bsica de um programa C#. Vimos que tudo (ou quase tudo) so classes e objetos.
Toda a lgica de programao no C# precisa estar contida dentro de um tipo definido, normalmente uma classe.
Em seguida tratamos dos diversos tipos de dados e estruturas existentes no C#. Vimos que existem tipos de valor
value type e tipos de referncia reference type. Aprendemos as diferenas entre estes dois tipos. Tambm aprendemos
a utilizar alguns mtodos da classe System.Convert para fazer converso entre tipos. Estudamos tipos mais complexos
como structs, strings e arrays.
Para finalizar o captulo apresentamos as instrues de fluxo de controle. Vimos que existem trs categorias de instrues:
Instrues de seleo.
Instrues de repetio.
Instrues de salto (jump).
Analisamos as diversas instrues em cada categoria.
Junto com os conceitos tericos apresentamos exemplos simples e completos, que o leitor pode compilar e testar para
ver o C# em funcionamento. O objetivo ao criarmos programas simples, de poucas linhas, salientar o tpico em
destaque. Desta maneira cada exemplo d nfase a um comando, instruo ou tcnica especficos.
Agora que j tratamos dos aspectos bsicos do C# podemos tratar de assuntos mais complexos como por exemplo o
tratamento de excees. Mas isso j assunto para o Captulo 4.
125
CAPTULO 4: CLASSES, MTODOS, HERANA E POLIMORFISMO COM O C#
www.juliobattisti.com.br
Introduo
Neste captulo continuaremos o nosso estudo da linguagem C#, sempre abordando
os elementos que sero utilizados para a construo de pginas ASP.NET nos
demais captulos do livro.
Iniciaremos este captulo apresentando os operadores utilizados no C#. Tambm
falaremos sobre a ordem de precedncia dos operadores. Trataremos dos seguintes
tipos de operadores:
Built-in
Aritmticos
Relacionais e Lgicos
Atribuio (Assignment)
Em seguida trataremos da implementao dos conceitos de orientao a objetos
no C#. Veremos de que maneira conceitos como classes, herana e polimorfismo
so implementados na linguagem C#.
Aprenderemos a criar novas classes no C#. Sero apresentados os conceitos de
construtores e destrutores. Para que a classe possa fornecer alguma
funcionalidade, aprenderemos a criar mtodos e veremos os diferentes tipos de
mtodos que podem ser criados. Tambm aprenderemos a criar mtodos que
recebem parmetros.
Vamos aprender os diferentes tipos de parmetros existentes:
in parameters
ref parameters
out parameters
Tambm falaremos sobre os modificadores para classes e membros de uma classe.
Um modificador, na prtica, define a visibilidade e o escopo da classe e de cada
um dos seus membros.
Para que o leitor possa acompanhar e entender os assuntos exemplos referentes a
classes, mtodos, propriedades, herana e polimorfismo necessrio que o mesmo
conhea a teoria bsica sobre orientao a objetos. Para uma reviso dos conceitos
bsicos de orientao a objetos consulte o Captulo 2, no tpico: Conceitos bsicos
de orientao a objetos.
Novamente estaremos utilizando exemplos simples e curtos, os quais objetivam
salientar o tpico que est sendo tratado.
C A P T U L O
4
Classes, Mtodos, Herana e
Polimorfismo com o C#
126 www.juliobattisti.com.br
ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB
Operadores e Mais Operadores
Uma expresso formada por operadores e operandos. Os operadores de uma expresso
indicam qual tipo de operao deve ser aplicada entre os operandos. Os exemplos mais
conhecidos de operadores so os operadores aritmticos: adio (+), subtrao (-),
multiplicao (*) e diviso (/).
Neste tpico vamos estudar os seguintes tipos de operadores:
Built-in
Aritmticos
Relacionais e Lgicos
Atribuio (Assignment)
Quanto ao nmero de operandos, os operadores tambm podem ser classificados em:
Operadores unrios: Este tipo de operador atua sobre um nico operando, como por exemplo o sinal de menos
(-) para tornar um nmero negativo, como por exemplo: -5.
Operadores binrios: Atua sobre dois operandos. O exemplo tpico so os operadores aritmticos, como por
exemplo: 2+3, 5*12.
Operador ternrio: Atua sobre trs operandos. Temos um nico operador ternrio em C#, que o ponto-de-
interrogao: ? Na verdade um ponto-de-interrogao metido a if, conforme veremos no exemplo a seguir.
A sintaxe para o operador? a seguinte:
(teste) ? valor_se_verdadeiro : valor_se_falso
Considere o exemplo:
int y;
int x;
y=22;
x = (y<25) ? 12 : 18;
Neste exemplo x igual a 12. O teste (y<25) avaliado. Como o teste verdadeiro (pois y=22), retornado o valor
antes dos dois-pontos. Se o teste fosse falso seria retornado o valor aps os dois-pontos. ou no um if disfarado?
Built-in Operators
Existem operadores chamados Built-in para os tipos de dados int, uint, long, ulong, float, double e decimal. Isso
significa que em operaes aritmticas bsicas entre operadores destes tipos no precisamos fazer nenhuma converso
explcita. Considere o exemplo a seguir:
NOTA: Os arquivos com
o cdigo-fonte dos
exemplos deste captulo
esto disponveis para
download no site da
editora Axcel Books no
seguinte endereo:
www.axcel.com.br.
127
CAPTULO 4: CLASSES, MTODOS, HERANA E POLIMORFISMO COM O C#
www.juliobattisti.com.br
int num1 = 23;
int num2 = 32;
int soma = num1 + num2;
Neste caso no precisamos fazer nenhum tipo de converso explcita (ou cast como chamada no C#), uma vez que
existe o operador de adio interno do prprio C# (Built-in) para o tipo int.
Agora, se tentssemos fazer a seguinte operao teramos problemas:
short nums1 = 10;
short nums2 = 17;
short soma = nums1+nums2;
Se tentarmos compilar um programa que contm este trecho de cdigo, obteremos a mensagem de erro indicada na
Figura 4.1:
Figura 4.1: Erro de compilao.
Para que o nosso exemplo possa funcionar precisamos fazer uma converso explcita, conforme indicado a seguir:
short nums1 = 10;
short nums2 = 17;
short soma = (short) (nums1+nums2);
Operadores Aritmticos
Temos os operadores bsicos que toda linguagem tem, ou seja, os operadores para as quatro operaes matemticas,
conforme descrito na Tabela 4.1.
128 www.juliobattisti.com.br
ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB
Tabela 4.1 Os principais operadores aritmticos.
Operador Descrio
+ Adio.
- Subtrao.
* Multiplicao.
/ Diviso.
% Retorna o resto da diviso.
Tambm temos o operador unrio +, o qual simplesmente indica que um nmero positivo. No altera o valor do
nmero. Por exemplo, os dois comandos a seguir so exatamente iguais e vlidos:
short nums1 = +10;
ou
short nums1 = +10;
J o operador unrio menos (-) inverte o sinal de um nmero. Considere o exemplo:
int x = -10;
int y = -x;
Console.WriteLine(y);
Neste caso o valor de y ser igual a 10. Isso mesmo, pois o inverte o sinal e, lembrando l do primrio, menos com
menos d mais.
Outra observao que o operador binrio +, alm da adio, tambm utilizado para concatenar strings. Observe o
exemplo da Listagem 4.1.
Listagem 4.1 Concatenando strings ex1cap4.cs.
using System;
using System.Windows.Forms;
class ex1cap4
{
// Exemplo1 Captulo 4.
// Concatenando Strings.
// Por: Jlio Battisti
// MCP, MCP+I, MCSE, MCSE+I, MCSE, MCDBA
129
CAPTULO 4: CLASSES, MTODOS, HERANA E POLIMORFISMO COM O C#
www.juliobattisti.com.br
public static void Main()
{
// Declarao das variveis.
string nome;
string sobrenome;
string nomecompleto;
// O usurio informa o nome e o sobrenome.
Console.Write(Digite o seu nome ->);
nome = Console.ReadLine();
Console.Write(Digite o seu sobrenome ->);
sobrenome = Console.ReadLine();
// Utilizando o operador + para concatenar
// o nome e o sobrenome.
nomecompleto = nome + + sobrenome;
// Exibio dos resultados.
MessageBox.Show(nomecompleto);
}
}
Digite o exemplo da Listagem 4.1 e salve o mesmo em um arquivo chamado ex1cap4.cs, na pasta C:\ExCsharp\cap4.
Compile e execute o exemplo da Listagem 4.1. Para o nome digite Jos e pressione ENTER. Para o sobrenome digite
da Silva e pressione ENTER. Voc obter os resultados indicados na Figura 4.2. D um clique no boto OK para
fechar a janela de mensagem.
Temos uma novidade neste exemplo: A utilizao do mtodo Show, da classe MessageBox, do namespace
System.Windows.Forms. Observe que no incio do programa adicionamos uma referncia ao namespace
System.Windows.Forms. Para exibir o nome completo utilizamos MessageBox.Show.
130 www.juliobattisti.com.br
ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB
Figura 4.2: Executando o programa ex1cap4.exe.
Utilizamos o operador + para fazer a concatenao do nome, um espao em branco ( ) e do sobrenome.
Operador de Incremento: ++
O operador de incremento aumenta o valor de uma varivel em 1. O operador pode ser utilizado antes ou depois da
varivel. A melhor maneira de entendermos as diferenas entre o operador estar antes ou depois atravs de um
exemplo. Considere o seguinte trecho de cdigo:
int x = 10;
int y = x++;
Quais os valores de x e y aps a execuo destes comandos?
x vale 11
y vale 10
Isso acontece porque, na segunda linha, primeiro y feito igual ao valor atual de x (10) e depois x incrementado
passando o seu valor para 11.
Agora vamos alterar um pouco o nosso exemplo:
int x = 10;
int y = ++x;
Quais os valores de x e y aps a execuo destes comandos?
x vale 11
y vale 11
Isso acontece porque, na segunda linha, primeiro o x incrementado, passando o seu valor para 11. Em seguida o novo
valor de x (11) atribudo para y.
131
CAPTULO 4: CLASSES, MTODOS, HERANA E POLIMORFISMO COM O C#
www.juliobattisti.com.br
Operador de Decremento
O operador de decremento diminui o valor de uma varivel em 1. O operador pode ser utilizado antes ou depois da
varivel. A melhor maneira de entendermos as diferenas entre o operador estar antes ou depois atravs de um
exemplo. Considere o seguinte trecho de cdigo:
int x = 10;
int y = x;
Quais os valores de x e y aps a execuo destes comandos?
x vale 9
y vale 10
Isso acontece porque, na segunda linha, primeiro y feito igual ao valor atual de x (10) e depois x decrementado
passando o seu valor para 9.
Agora vamos alterar um pouco o nosso exemplo:
int x = 10;
int y = x;
Quais os valores de x e y aps a execuo destes comandos?
x vale 9
y vale 9
Isso acontece porque, na segunda linha, primeiro o x decrementado, passando o seu valor para 9. Em seguida o novo
valor de x (9) atribudo para y.
Operadores Relacionais e Lgicos
Os operadores relacionais so utilizados, principalmente, em testes nas estruturas de controle do C#. Neste tipo de
teste so comparados dois valores e retornado True ou False. J os operadores lgicos so utilizados para operaes
do tipo AND, OR, etc.
Na Tabela 4.2 temos os principais operadores relacionais.
Tabela 4.2 Os principais operadores relacionais.
Operador Exemplo Descrio
== x == y Comparao. Retorna verdadeiro se x for igual a y.
!= x != y Diferente. Retorna verdadeiro se x for diferente de b.
< x < y Menor do que. Retorna verdadeiro se x for menor do que y.
> x > y Maior do que. Retorna verdadeiro se x for maior do que y.
132 www.juliobattisti.com.br
ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB
Os operadores lgicos podem ser utilizados para a elaborao de testes mais complexos, inclusive testes compostos,
onde temos dois ou mais testes ligados por operadores lgicos. Os dois principais operadores lgicos so && (AND)
e o || (OR).
Quando temos uma expresso com vrios testes ligados por operadores AND, o resultado somente ser verdadeiro se
todos os testes forem verdadeiros. Basta que um nico teste seja falso, para que toda a expresso seja avaliada como
falsa False.
Considere o trecho de cdigo a seguir:
If (10<11) && (5>3) && (3==3)
{
Console.WriteLine(Este comando ser executado !);
}
Neste exemplo, como todos os testes so verdadeiros, a expresso verdadeira e o comando ser executado. Agora
considere o trecho de cdigo a seguir:
If (10<11) && (5<3) && (3==3) & (123<=114)
{
Console.WriteLine(Este comando NUNCA ser executado !);
}
Neste exemplo, como um dos testes falso (5<3), toda a expresso avaliada como False e o comando no interior do
lao NUNCA ser executado.
Quando temos uma expresso com vrios testes ligados por operadores OR, o resultado somente ser falso se todos os
testes forem falsos. Basta que um nico teste seja verdadeiro, para que toda a expresso seja avaliada como verdadeira
True.
Considere o trecho de cdigo a seguir:
If (10>11) && (5<3) && (3==3)
{
Console.WriteLine(Este comando ser executado !);
}
Operador Exemplo Descrio
<= x <= y Menor ou igual a. Retorna verdadeiro se x for menor ou igual a y.
>= x >= y Maior ou igual a. Retorna verdadeiro se x for maior ou igual a y.
133
CAPTULO 4: CLASSES, MTODOS, HERANA E POLIMORFISMO COM O C#
www.juliobattisti.com.br
Neste exemplo, como um dos testes verdadeiro (3==3), a expresso verdadeira e o comando ser executado. Agora
considere o trecho de cdigo a seguir:
If (10>11) && (5<3) && (3!=3) & (123>=114)
{
Console.WriteLine(Este comando NUNCA ser executado !);
}
Neste exemplo, como todos os testes so falsos, toda a expresso avaliada como False e o comando no interior do
lao NUNCA ser executado.
Na Tabela 4.3 temos os principais operadores lgicos.
Tabela 4.3 Os principais operadores lgicos.
Operador Descrio
& Faz um AND bit a bit entre dois operandos.
| Faz um OR bit a bit entre dois operandos.
^ Faz um OR exclusivo (XOR) entre dois operandos.
&& Faz um AND lgico entre dois operandos.
|| Faz um OR lgico entre dois operandos.
Operadores de Atribuio (Assignment)
Temos operadores de atribuio simples e compostos. Temos um nico operador de atribuio simples que a igualdade (=),
utilizado para atribuir um valor a uma varivel ou o valor de uma varivel outra varivel, conforme exemplo a seguir:
int x;
int y;
x = 123;
y = x;
Os operadores de atribuio compostos, alm de fazerem a atribuio, realizam, ao mesmo tempo, uma determinada
operao. Para entendermos os operadores compostos vamos a um exemplo simples com o operador +=. Considere o
trecho de cdigo a seguir:
int x;
int y;
y = 10;
x = 5;
x += y;
134 www.juliobattisti.com.br
ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB
Neste caso, o valor de x ser 15, pois o ltimo comando x += y equivalente : x = x + y.
Na Tabela 4.4 temos os principais operadores de atribuio compostos.
Tabela 4.4 Os principais operadores de atribuio compostos.
Operador Exemplo equivalente :
+= x + = y x = x + y
-= x - = y x = x - y
*= x * = y x = x * y
/= x / = y x = x / y
%= x % = y x = x % y
Precedncia de Operadores
Em expresses complexas, onde podemos ter diversos operandos e operadores, deve existir uma maneira de decidir
quais operaes sero realizadas em primeiro lugar. A ordem em que as operaes so realizadas determinada pelas
regras de precedncia de operadores.
As regrinhas bsicas so as mesmas das demais linguagens. Uma expresso avaliada da esquerda para a direita. Os
operadores de incremento e decremento aps a varivel tm maior prioridade (x++ ou x). Em seguida so avaliados
os operadores unrios (+ , -, !) e os operadores de incremento e decremento antes da varivel (++x e x). Na seqncia
vm os operadores de multiplicao (*), diviso (/) e resto da diviso (%). Por ltimo, os operadores de adio (+) e
subtrao(-).
Podemos alterar a ordem de precedncia dos operadores utilizando parnteses. Considere a expresso a seguir:
x = (y+z)*k
Neste caso, a adio (y+z) ser executada em primeiro lugar, pois a mesma est dentro do parnteses. O resultado da
adio ento multiplicado por k.
Para ilustrar a ordem de precedncia vamos considerar o exemplo da Listagem 4.2
Listagem 4.2 Precedncia de operadores. ex2cap4.cs
using System;
class ex2cap4
{
// Exemplo 2 Captulo 4.
135
CAPTULO 4: CLASSES, MTODOS, HERANA E POLIMORFISMO COM O C#
www.juliobattisti.com.br
// Precedncia de operadores.
// Por: Jlio Battisti
// MCP, MCP+I, MCSE, MCSE+I, MCSE, MCDBA
public static void Main()
{
// Declarao das variveis.
int i=5;
int j=21;
int k=10;
int l=20;
int m=4;
int expr1;
int expr2;
int expr3;
// Alguns clculos
expr1 = i++*j+k-l*m++;
expr2 = (i++*j)+(k-l)*m++;
expr3 = (i++*j+k)-l*m++;
// Exibio dos resultados.
Console.WriteLine(***********************************);
Console.WriteLine(Valor de expr1: {0},expr1);
Console.WriteLine(Valor de expr2: {0},expr2);
Console.WriteLine(Valor de expr3: {0},expr3);
Console.WriteLine(***********************************);
}
}
136 www.juliobattisti.com.br
ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB
Figura 4.3: Executando o programa ex2cap4.exe.
Observe que temos a mesma expresso, e apenas utilizamos parnteses para mudar a ordem de execuo dos elementos
da expresso. Vamos analisar a primeira expresso, na qual resultou em expr1 = 35.
expr1 = i++*j+k-l*m++;
Aqui no temos nenhum parnteses. Neste caso vale a ordem de precedncia dos operadores. Em primeiro, na ordem
de precedncia esto os operadores de incremento. Porm cabe lembrar que, para a expresso, como o operador de
incremento est aps a varivel, utilizado o valor original de cada varivel e somente depois disso que as variveis
so incrementadas. Ento, para a primeira expresso sero utilizados os seguintes valores:
i=5
j=21
k=10
l=20
m=4
Com isso nossa expresso fica:
expr1 = 5*21+10-20*4
Primeiro resolvo as multiplicaes:
expr1 = 105+10-80
no que obtemos:
expr1 = 35
Digite o exemplo da Listagem 4.2 e salve o mesmo em um arquivo chamado ex2cap4.cs, na pasta C:\ExCsharp\cap4.
Compile e execute o exemplo da Listagem 4.2. Voc obter os resultados indicados na Figura 4.3.
137
CAPTULO 4: CLASSES, MTODOS, HERANA E POLIMORFISMO COM O C#
www.juliobattisti.com.br
e, aps o clculo da expresso, os valores de i e m so incrementados, passando a valer:
i=6
j=21
k=10
l=20
m=5
Se o operador de incremento estivesse antes das variveis, primeiro as mesmas seriam incrementadas e depois, j com
o novo valor, a expresso seria calculada.
Classes
O conceito de Classes fundamental para a orientao a objetos. Como o Framework .NET fortemente baseado nos
conceitos de orientao a objetos, bvio que o conceito de Classes igualmente importante para o Framework .NET.
Para sair do discurso terico e partir para a prtica basta analisar os exemplos que apresentamos at o momento. No
houve um nico exemplo em que no utilizamos pelo menos uma classe do .NET Framework Class Library (biblioteca
de classes do .NET). Conforme j havamos salientado, a biblioteca de classes do .NET nos oferece uma infinidade de
classes que podem ser utilizadas em nossos programas e pginas.
Atravs da utilizao de classes estamos viabilizando, na prtica, os princpios da herana e da reutilizao de cdigo.
Ao criarmos uma classe estamos, na verdade, definindo as caractersticas de um novo objeto. A definio da classe
contm os mtodos, propriedades, indexadores (novidade no .NET) e Eventos da classe. Tambm contm informao
sobre a visibilidade dos elementos da classe. A visibilidade define, por exemplo, se um mtodo da classe somente
poder ser utilizado por outros mtodos da prpria classe ou poder ser utilizado externamente classe.
Uma vez definida a classe, podemos utiliz-la em nossos programas e pginas. Para utilizar uma classe criamos e
instanciamos um objeto como sendo do tipo definido pela classe. A partir deste momento o objeto passa a ter acesso
a todos os elementos mtodos, propriedades, etc., da classe. Em outras palavras: o objeto herda todos os elementos
da classe.
Neste captulo aprenderemos a criar e utilizar classes no C#. Tambm aprenderemos a criar os diversos elementos que
compem uma classe.
Para Comear um Exemplo Simples
Vamos aprender sobre a estrutura de uma classe criando uma. Criaremos uma classe extremamente simples. Daremos
o nome de ClasseEx1. O nico componente que a nossa classe ir conter ser a definio de duas variveis: um inteiro
e uma string. No programa principal iremos criar uma instncia da classe e utilizar as variveis da mesma.
Considere o exemplo da Listagem 4.3.
138 www.juliobattisti.com.br
ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB
Listagem 4.3 Uma classe bastante simples. Ex4Cap4.cs
using System;
class ClasseEx1
{
//Definio dos membros da classe.
public int contador = 0;
public string teste = ;
}
class Ex3cap4
{
// Exemplo 3 Captulo 4.
// Criao de uma classe com dois membros.
// Por: Jlio Battisti
// MCP, MCP+I, MCSE, MCSE+I, MCSE, MCDBA
public static void Main()
{
// Agora crio uma varivel do tipo ClasseEx1.
// Esta varivel uma instncia da classe ClasseEx1.
ClasseEx1 minhaclasse = new ClasseEx1();
//Definio de novos valores para os membros da classe.
minhaclasse.contador = 125;
minhaclasse.teste = PRIMEIRA CLASSE COM O C#;
//Agora exibo os resultados.
Console.WriteLine(**************************************************);
Console.WriteLine(VALOR DO MEMBRO INTEIRO: {0},minhaclasse.contador);
Console.WriteLine(VALOR DO MEMBRO STRING: {0},minhaclasse.teste);
Console.WriteLine(**************************************************);
}
}
139
CAPTULO 4: CLASSES, MTODOS, HERANA E POLIMORFISMO COM O C#
www.juliobattisti.com.br
Figura 4.4: Executando o programa ex3cap4.exe.
Temos vrios detalhes importantes a considerar neste exemplo.
Em primeiro lugar a definio da classe ClasseEx1, a qual feita no seguinte trecho de cdigo. Para definir uma nova
classe utilizamos a palavra class. A definio dos elementos da classe acontece dentro do abre e fecha chaves { }.
class ClasseEx1
{
//Definio dos membros da classe.
public int contador = 0;
public string teste = ;
}
Neste exemplo definimos dois campos:
contador
teste
Estes campos so tambm chamados de membros da classe (na verdade membro qualquer elemento da classe, quer
seja uma propriedade, um campo, um mtodo, etc.). A palavra public faz com que estes campos possam ser acessados
fora da classe, isto , dentro do cdigo do programa que estiver utilizando a classe.
Aps a definio da classe temos uma segunda classe, chamada Ex3cap4.
class Ex3cap4
Digite o exemplo da Listagem 4.3 e salve o mesmo em um arquivo chamado ex3cap4.cs, na pasta C:\ExCsharp\cap4.
Compile e execute o exemplo da Listagem 4.3. Voc obter os resultados indicados na Figura 4.4.
140 www.juliobattisti.com.br
ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB
Esta a classe principal do nosso exemplo, a qual conter uma funo Main( ). Dentro da funo Main( ) criamos um
objeto chamado minhaclasse. Observe que este objeto definido como sendo do tipo da classe criada anteriormente,
ou seja, o objeto minhaclasse baseado na classe ClasseEx1. A declarao e instanciao da varivel objeto minhaclasse
feita na seguinte linha de cdigo:
ClasseEx1 minhaclasse = new ClasseEx1();
Neste caso a novidade o uso do operador new para a instanciao do objeto.
Aps termos criado uma objeto baseado na classe ClasseEx1 podemos acessar os seus membros public. Para acessar
um membro utilizamos a seguinte sintaxe:
nome_da_classe.nome_do_membro
No trecho de cdigo a seguir alteramos o valor do campo contador e do campo teste, do objeto minhaclasse:
minhaclasse.contador = 125;
minhaclasse.teste = PRIMEIRA CLASSE COM O C#;
O restante do exemplo apenas para exibio dos resultados.
Membros de uma Classe
A seguir apresentamos uma descrio dos elementos que podem ser criados em uma
classe, isto , dos possveis membros de uma classe.
Campos (Fields)
Um campo um membro do tipo varivel utilizado para armazenar um determinado
valor. No exemplo da Listagem 4.3 criamos dois campos: contador e teste. Os campos
so os dados do objeto e podem determinar, juntamente com as propriedades, o estado
do objeto em um determinado instante. Para cada membro de uma classe podemos aplicar
modificadores, os quais descrevem a maneira como um determinado membro pode ser
utilizado. Por exemplo, se queremos que um campo possa ser acessado fora da classe,
precisamos utilizar o modificador public antes da definio do campo, como fizemos
no exemplo da Listagem 4.3. Se quisermos que o campo somente seja acessado de
dentro da classe podemos utilizar o modificador private. Outros modificadores para
campos so: static, readonly e const. Falaremos sobre estes modificadores mais adiante.
Mtodos (Methods)
Um mtodo contm cdigo que atua sobre os dados do objeto. Os mtodos, falando em
termos de orientao a objetos, descrevem as aes que podem ser realizadas pela classe.
Na prtica, a funcionalidade de uma classe implementada atravs dos seus mtodos.
IMPORTANTE: Observe
que no destrumos o
objeto minhaclasse no
final do programa. Este
procedimento no mais
necessrio, como era em
verses anteriores do VB,
Visual C++ e VBA. Agora,
quando a funo Main( )
encerra a sua execuo, a
referncia ao objeto
minhaclasse deixa de
existir. Se a referncia
no foi gravada, a
instncia da classe estar
disposio do coletor de
lixo (garbage collector)
do .NET, o qual ir liberar
os recursos ocupados pela
classe, quando necessrio.
141
CAPTULO 4: CLASSES, MTODOS, HERANA E POLIMORFISMO COM O C#
www.juliobattisti.com.br
Propriedades (Properties)
As propriedades so um pouco diferentes dos campos, pois para definir e ler o valor de uma propriedade so definidos
mtodos especficos. Get para obter o valor da propriedade e Set para definir o valor da propriedade. Veremos como
criar e utilizar propriedades ainda neste captulo.
Constantes (Constants)
Uma constante um campo cujo valor no pode ser alterado. Aprenderemos a criar constantes ainda neste captulo.
Indexadores (Indexers)
Esta uma novidade do .NET. Um indexador um array. O indexador permite que, facilmente, possamos indexar um
objeto para facilitar a definio e obteno dos valores da classe.
Eventos (Events)
Um evento, normalmente, corresponde a uma ao do usurio, ao esta que detectada pela classe e dispara a
execuo de algum cdigo em resposta ao evento. o conceito de evento que todos ns j conhecemos. Por exemplo,
ao clicar em um boto de comando, disparado o evento Ao Clicar.
Agora aprenderemos a criar os diversos membros de uma classe. Mas antes vamos falar um pouco sobre Construtores
(Constructs) e Destrutores (Destructors).
Construtores e Destrutores de uma Classe
Ao criarmos uma classe podemos definir um mtodo que ser executado toda vez que uma instncia da classe for
criada. Este mtodo especial chamado de Construtor (Constructor) da classe. Colocamos neste mtodo todo o cdigo
que deve ser executado na criao da classe. Por exemplo, se estamos criando uma classe que possui mtodos para
fazer pesquisas em um banco de dados do SQL Server 2000. No mtodo Construtor podemos incluir o cdigo que
estabelece a conexo com o banco de dados. Para que a classe seja de uso genrico, podemos definir parmetros a
serem passados para o mtodo Construtor, de tal forma que a conexo seja estabelecida de acordo com o valor dos
parmetros passados para o mtodo construtor. Se no definirmos um mtodo construtor explicitamente, o Frame-
work .NET define um mtodo construtor sem parmetros. No nosso exemplo anterior utilizamos o seguinte comando
para criar uma instncia da classe ClasseEx1 para o objeto minhaclasse:
ClasseEx1 minhaclasse = new ClasseEx1();
O mtodo construtor criado por padro possui o mesmo nome da classe e no possui parmetros ClasseEx1( ). Se
tivssemos definido um mtodo construtor com parmetros, os mesmos teriam que ser passados no momento da
criao do objeto. Por exemplo, se o mtodo construtor deve receber um parmetro inteiro, a criao do objeto
minhaclasse ficaria assim:
ClasseEx1 minhaclasse = new ClasseEx1(10);
142 www.juliobattisti.com.br
ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB
Observe que estamos passando um parmetro (10) para o mtodo construtor.
A principal vantagem de utilizarmos um mtodo construtor personalizado que podemos garantir que o objeto seja
instanciado corretamente, atravs da execuo do cdigo necessrio instanciao do objeto, no mtodo construtor do
mesmo. Quando o usurio instancia um determinado objeto, o mtodo construtor do mesmo chamado e deve finalizar
a sua execuo sem erros; caso contrrio o usurio no poder utilizar o objeto. Este comportamento garante que o
cdigo de inicializao, contido no mtodo construtor do objeto, seja executado, antes que os demais membros do
objeto possam ser utilizados.
O mtodo construtor deve ter o mesmo nome da classe. Para provar que o mtodo construtor sempre executado,
vamos considerar o exemplo da Listagem 4.4.
Considere o exemplo da Listagem 4.4.
Listagem 4.4 Utilizando o mtodo construtor. Ex4cap4.cs
using System;
class ClasseEx2
{
// Definio do construtor da classe.
// Observe que o nome do mtodo construtor
// deve ter o mesmo nome da classe.
public ClasseEx2()
{
Console.WriteLine(**************************************);
Console.WriteLine(EXECUTANDO OS COMANDOS DO CONSTRUTOR !);
Console.WriteLine(ESTES COMANDOS SERO EXECUTADOS SEMPRE);
Console.WriteLine(QUE UMA INSTNCIA DA CLASSE FOR CRIADA);
Console.WriteLine(**************************************);
}
public int contador = 0;
public string teste = ;
}
class Ex4cap4
{
143
CAPTULO 4: CLASSES, MTODOS, HERANA E POLIMORFISMO COM O C#
www.juliobattisti.com.br
// Exemplo 3 Captulo 4.
// Criao de uma classe com dois membros.
// Por: Jlio Battisti
// MCP, MCP+I, MCSE, MCSE+I, MCSE, MCDBA
public static void Main()
{
// Agora crio uma varivel do tipo ClasseEx2.
// Esta varivel uma instncia da classe ClasseEx2.
// A simples criao de um objeto da classe far
// com que o seu construtor seja disparado e os
// comandos do construtor sero executados.
ClasseEx2 minhaclasse = new ClasseEx2();
}
}
Digite o exemplo da Listagem 4.4 e salve o mesmo em um arquivo chamado ex4cap4.cs, na pasta C:\ExCsharp\cap4.
Compile e execute o exemplo da Listagem 4.4. Voc obter os resultados indicados na Figura 4.5.
Figura 4.5: Executando o programa ex4cap4.exe.
144 www.juliobattisti.com.br
ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB
No nosso exemplo, no programa principal simplesmente criamos um objeto do tipo ClasseEx2. Ao instanciarmos o
objeto, foi disparado o seu mtodo construtor, o qual exibe algumas informaes na tela.
Alm de um mtodo construtor podemos criar um mtodo destrutor. O mtodo destrutor pode ser chamado para
executar alguns comandos quando a referncia ao objeto deixar de existir, ou seja, os comandos do mtodo destrutor
so chamados quando do encerramento do objeto.
Para criar um mtodo destrutor basta criar um mtodo com o mesmo nome da classe, porm precedido de um til (~).
Por exemplo, para criar um mtodo destrutor para a classe ClasseEx2( ), criada no exemplo anterior, utilizamos a
seguinte sintaxe:
~ClasseEx2()
{
comando1;
comando2;
...
comandon;
}
Modificadores Para os Membros de uma Classe
Conforme descrito anteriormente existem modificadores que definem a visibilidade dos membros de uma classe. Por
exemplo, o modificador public torna o membro acessvel de fora da classe; j o modificador private torna o membro
disponvel somente dentro da prpria classe. A seguir uma descrio dos principais modificadores.
public: Torna o membro acessvel de fora da definio da classe.
protected: O membro no pode ser acessado fora da classe, porm o membro est disponvel para outras
classes derivadas da classe base.
private: O membro no pode ser acessado fora da classe, nem mesmo por outras classes derivadas da classe
base.
internal: O membro somente visvel na unidade de cdigo onde o mesmo est definido. um meio-termo
entre public e protected, uma vez que o membro pode ser acessado por todas as classes definidas na mesma
unidade (pblico para as classes da mesma unidade), porm no pode ser acessado por classes definidas em
outras unidades (protected para unidades definidas em outras unidades).
Adicionando Funcionalidade a uma Classe Mtodos
A funcionalidade de uma classe definida atravs da criao de mtodos. Um mtodo pode receber parmetros e
retornar um determinado resultado. Vamos fazer um pequeno estudo dos tipos de parmetros que podem ser definidos
para um determinado mtodo.
145
CAPTULO 4: CLASSES, MTODOS, HERANA E POLIMORFISMO COM O C#
www.juliobattisti.com.br
Podemos definir os seguintes tipos de parmetros:
Parmetros In: Este tipo de parmetro o mais conhecido. utilizado para passarmos o valor de uma varivel
para o mtodo. Um inconveniente deste tipo de parmetro que o mtodo no pode alterar o valor da varivel,
uma vez que somente foi passado o valor da varivel e no uma referncia para a mesma. O parmetro definido
no mtodo inicializado com uma cpia do valor da varivel passada como parmetro na chamada do mtodo.
Mais uma vez vamos fazer uso de um exemplo para entendermos a criao de mtodos e a utilizao de parmetros in.
Considere o exemplo da Listagem 4.5.
Listagem 4.5 Utilizando parmetro do tipo in. Ex5cap4.cs
using System;
public class ClasseEx3
{
// Definimos um mtodo para calcular o cubo de
// uma varivel passada como parmetro para o mtodo.
public int calcula_cubo(int valor)
{
// Crio uma varivel local do tipo int.
// Atribuo o valor do parmetro valor para a
// varivel local.
int auxint;
auxint = valor;
// Altero o valor do parmetro recebido.
valor = 6;
return auxint*auxint*auxint;
}
}
class Ex5cap4
{
146 www.juliobattisti.com.br
ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB
// Exemplo 5 Captulo 4.
// Criao de uma classe com um mtodo
// que calcula o cubo de um nmero inteiro.
// Parmetros in.
// Por: Jlio Battisti
// MCP, MCP+I, MCSE, MCSE+I, MCSE, MCDBA
public static void Main()
{
// Agora crio uma varivel do tipo ClasseEx3.
// Esta varivel uma instncia da classe ClasseEx3.
ClasseEx3 minhaclasse = new ClasseEx3();
// Defino uma varivel do tipo int e chamo o mtodo
// calcula_cubo, da classe minhaclasse, passando o
// valor inteiro como parmetro.
int valor;
// Solicito que o usurio digite um valor inteiro.
Console.Write(Digite um nmero inteiro ->);
string aux1 = Console.ReadLine();
valor = Convert.ToInt32(aux1);
// Exibio do resultado.
Console.WriteLine(*****************************************);
Console.WriteLine(O NMERO DIGITADO FOI -> {0},valor);
Console.WriteLine(*****************************************);
Console.WriteLine(ELEVADO AO CUBO -> {0},minhaclasse.calcula_cubo(valor));
Console.WriteLine(*****************************************);
Console.WriteLine(VALOR ORIGINAL DA VARIVEL VALOR -> {0},valor);
Console.WriteLine(*****************************************);
}
}
147
CAPTULO 4: CLASSES, MTODOS, HERANA E POLIMORFISMO COM O C#
www.juliobattisti.com.br
Digite o exemplo da Listagem 4.5 e salve o mesmo em um arquivo chamado ex5cap4.cs, na pasta C:\ExCsharp\cap4.
Compile e execute o exemplo da Listagem 4.5. Voc obter os resultados indicados na Figura 4.6.
Figura 4.6: Executando o programa ex5cap4.exe.
Temos muitos detalhes interessantes a serem comentados no cdigo deste exemplo.
Vamos iniciar pela definio de um mtodo para calcular o cubo de um nmero passado como parmetro. Isso feito
pelo trecho de cdigo a seguir:
// Definimos um mtodo para calcular o cubo de
// uma varivel passada como parmetro para o mtodo.
public int calcula_cubo(int valor)
{
// Crio uma varivel local do tipo int.
// Atribuo o valor do parmetro valor para a
// varivel local.
int auxint;
auxint = valor;
// Altero o valor do parmetro recebido.
valor = 6;
return auxint*auxint*auxint;
}
148 www.juliobattisti.com.br
ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB
O mtodo recebe um parmetro do tipo inteiro chamado valor. Como o parmetro passado por valor, o mtodo
recebe uma cpia do valor da varivel e no uma referncia para a mesma. Neste caso temos um parmetro in. Dentro
do mtodo declaramos uma varivel do tipo int chamada auxint. Atribumos o valor recebido como parmetro para a
varivel auxint, atravs do comando:
auxint = valor;
Em seguida modificamos o valor da varivel recebida como parmetro. Fizemos isso para provar que esta modificao no
altera o valor da varivel original, definida no programa principal. Este fato pode ser comprovado na Figura 4.6, onde a
varivel original continua com o valor digitado pelo usurio, ou seja, a alterao feita no mtodo calcula_cubo no afetou a
varivel original. Este o comportamento esperado, uma vez que o parmetro foi passado por valor e no por referncia.
A ltima linha do mtodo faz o clculo, retornando o valor passado (agora armazenado na varivel auxint), elevado ao cubo.
No programa principal declaramos e instanciamos uma varivel chamada minhaclasse, a qual do tipo ClasseEx3.
Isto feito com a seguinte linha de cdigo:
ClasseEx3 minhaclasse = new ClasseEx3();
Uma vez criado um objeto do tipo ClasseEx3 temos acesso ao mtodo calcula_cubo(valor), ou seja:
minhaclasse.calcula_cubo(valor), o qual utilizado na seguinte linha de cdigo:
Console.WriteLine(ELEVADO AO CUBO -> {0},minhaclasse.calcula_cubo(valor));
Este um exemplo simples mas que salienta a criao e utilizao de um mtodo pblico. Tambm comprovamos que
as alteraes feitas em um parmetro passado por valor no afetam o valor da varivel no programa principal.
Parmetros ref: Quando utilizamos parmetros do tipo ref, como o prprio nome sugere, passada uma referncia
para o parmetro e no somente o valor do mesmo. Na prtica isto significa que, se o mtodo alterar o valor do
parmetro, esta alterao ter efeito na varivel original, no programa principal. Vamos utilizar o mesmo
exemplo anterior, porm apenas modificando o tipo de parmetro. A vamos conferir se o valor da varivel
original, no programa principal, foi modificado.
Considere o exemplo da Listagem 4.6.
Listagem 4.6 Utilizando parmetro do tipo ref. Ex6cap4.cs
using System;
public class ClasseEx4
{
// Definimos um mtodo para calcular o cubo de
// uma varivel passada como parmetro para o mtodo.
public int calcula_cubo(ref int valor)
{
149
CAPTULO 4: CLASSES, MTODOS, HERANA E POLIMORFISMO COM O C#
www.juliobattisti.com.br
// Crio uma varivel local do tipo int.
// Atribuo o valor do parmetro valor para a
// varivel local.
int auxint;
auxint = valor;
// Altero o valor do parmetro recebido.
valor = 6;
return auxint*auxint*auxint;
}
}
class Ex6cap4
{
// Exemplo 6 Captulo 4.
// Criao de uma classe com um mtodo
// que calcula o cubo de um nmero inteiro.
// Parmetros ref.
// Por: Jlio Battisti
// MCP, MCP+I, MCSE, MCSE+I, MCSE, MCDBA
public static void Main()
{
// Agora crio uma varivel do tipo ClasseEx4.
// Esta varivel uma instncia da classe ClasseEx4.
ClasseEx4 minhaclasse = new ClasseEx4();
// Defino uma varivel do tipo int e chamo o mtodo
// calcula_cubo, da classe minhaclasse, passando o
150 www.juliobattisti.com.br
ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB
// valor inteiro como parmetro.
int valor;
// Solicito que o usurio digite um valor inteiro.
Console.Write(Digite um nmero inteiro ->);
string aux1 = Console.ReadLine();
valor = Convert.ToInt32(aux1);
// Exibio do resultado.
Console.WriteLine(*****************************************);
Console.WriteLine(O NMERO DIGITADO FOI -> {0},valor);
Console.WriteLine(*****************************************);
Console.WriteLine(ELEVADO AO CUBO -> {0},minhaclasse.calcula_cubo(ref valor));
Console.WriteLine(*****************************************);
Console.WriteLine(VALOR ORIGINAL DA VARIVEL VALOR -> {0},valor);
Console.WriteLine(*****************************************);
}
}
Digite o exemplo da listagem 4.6 e salve o mesmo em um arquivo chamado ex6cap4.cs, na pasta C:\ExCsharp\cap4.
Compile e execute o exemplo da listagem 4.6. Voc obter os resultados indicados na Figura 4.7.
Figura 4.7: Executando o programa ex6cap4.exe.
151
CAPTULO 4: CLASSES, MTODOS, HERANA E POLIMORFISMO COM O C#
www.juliobattisti.com.br
Vamos comentar as diferenas em relao ao exemplo anterior.
Em primeiro lugar, na definio do mtodo calcula_cubo, utilizamos a palavra ref para definir que o parmetro ser
passado por referncia, conforme indicado no trecho a seguir:
public int calcula_cubo(ref int valor)
{
// Crio uma varivel local do tipo int.
// Atribuo o valor do parmetro valor para a
// varivel local.
int auxint;
auxint = valor;
// Altero o valor do parmetro recebido.
valor = 6;
return auxint*auxint*auxint;
}
Neste caso, como o parmetro est sendo passado por referncia, a alterao feita no parmetro valor ter reflexos na
varivel valor no programa principal, o que pode ser comprovado pelos resultados exibidos na Figura 4.7.
Quando passamos um parmetro por referncia, na verdade estamos passando o endereo da varivel. Por isso quando
o mtodo altera o valor da varivel passada como parmetro est, na prtica, alterando o valor da varivel original.
Tambm importante salientar que no momento de utilizarmos o mtodo, a palavra ref deve ser colocada antes do
parmetro que est sendo passado, conforme indicado na linha de cdigo a seguir:
Console.WriteLine(ELEVADO AO CUBO -> {0},minhaclasse.calcula_cubo(ref valor));
Parmetros out: Um parmetro do tipo out utilizado para que o mtodo possa passar um resultado de volta
para o programa que fez a chamada ao mtodo. O programa que est chamando o mtodo no precisa inicializar
a varivel que ser retornada.
Vamos modificar o exemplo anterior para introduzirmos um parmetro do tipo out.
Considere o exemplo da Listagem 4.7.
152 www.juliobattisti.com.br
ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB
Listagem 4.7 Utilizando parmetro do tipo out. Ex7cap4.cs
using System;
public class ClasseEx4
{
// Definimos um mtodo para calcular o cubo de
// uma varivel passada como parmetro para o mtodo.
public void calcula_cubo(int valor, out int valoraocubo)
{
valoraocubo = valor*valor*valor;
}
}
class Ex7cap4
{
// Exemplo 7 Captulo 4.
// Criao de uma classe com um mtodo
// que calcula o cubo de um nmero inteiro.
// Parmetros out.
// Por: Jlio Battisti
// MCP, MCP+I, MCSE, MCSE+I, MCSE, MCDBA
public static void Main()
{
// Agora crio uma varivel do tipo ClasseEx4.
// Esta varivel uma instncia da classe ClasseEx4.
ClasseEx4 minhaclasse = new ClasseEx4();
// Defino uma varivel do tipo int e chamo o mtodo
// calcula_cubo, da classe minhaclasse, passando o
// valor inteiro como parmetro.
153
CAPTULO 4: CLASSES, MTODOS, HERANA E POLIMORFISMO COM O C#
www.juliobattisti.com.br
int valor;
int valoraocubo;
// Solicito que o usurio digite um valor inteiro.
Console.Write(Digite um nmero inteiro ->);
string aux1 = Console.ReadLine();
valor = Convert.ToInt32(aux1);
// Chamada do mtodo calcula_cubo.
// Aps a execuo do mtodo o valor elevado
// ao cubo est disponvel na varivel valoraocubo
// a qual foi retornada pelo mtodo.
minhaclasse.calcula_cubo(valor,out valoraocubo);
// Exibio do resultado.
Console.WriteLine(*****************************************);
Console.WriteLine(O NMERO DIGITADO FOI -> {0},valor);
Console.WriteLine(*****************************************);
Console.WriteLine(ELEVADO AO CUBO -> {0},valoraocubo);
Console.WriteLine(*****************************************);
Console.WriteLine(VALOR ORIGINAL DA VARIVEL VALOR -> {0},valor);
Console.WriteLine(*****************************************);
}
}
Digite o exemplo da Listagem 4.7 e salve o mesmo em um arquivo chamado ex7cap4.cs, na pasta C:\ExCsharp\cap4.
Compile e execute o exemplo da Listagem 4.7. Voc obter os resultados indicados na Figura 4.8.
154 www.juliobattisti.com.br
ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB
Figura 4.8 Executando o programa ex7cap4.exe.
Novamente mudamos o mtodo calcula_cubo. Agora o mtodo recebe um parmetro inteiro por valor e retorna o cubo
deste parmetro atravs do parmetro valoraocubo. O parmetro valoraocubo definido como um parmetro de
retorno ou sada (out), pelo uso da palavra out. O valor que deve ser retornado atribudo ao parmetro valoraocubo
pelo cdigo do mtodo, conforme indicado no fragmento de cdigo a seguir:
public void calcula_cubo(int valor, out int valoraocubo)
{
valoraocubo = valor*valor*valor;
}
Tambm importante salientar a utilizao da palavra void antes do nome do mtodo. O void informa que no ser
retornado nenhum valor pelo prprio mtodo. O valor ser retornado atravs da utilizao de um parmetro do tipo out.
A utilizao do mtodo calcula_cubo, no programa principal, tambm diferente dos exemplos anteriores. Neste
exemplo primeiro declaramos uma varivel do tipo int:
int valoraocubo;
Esta varivel receber o valor retornado pelo mtodo calcula_cubo. Em seguida fazemos uma chamada ao mtodo
calcula_cubo, passando como primeiro parmetro o valor digitado pelo usurio e o segundo parmetro o nome da
varivel que receber o valor de retorno, conforme indicado no cdigo a seguir:
minhaclasse.calcula_cubo(valor,out valoraocubo);
O restante do programa simplesmente a exibio dos resultados obtidos.
155
CAPTULO 4: CLASSES, MTODOS, HERANA E POLIMORFISMO COM O C#
www.juliobattisti.com.br
O Polimorfismo Posto em Prtica Override
Pelo princpio do Polimorfismo em uma classe derivada podemos sobrescrever (override), isto , redefinir um ou mais
mtodos da classe base, desde que ao criar a classe bsica o mtodo tenha sido definido com permisso para ser
redefinido. Para criar um mtodo e permitir que o mesmo seja redefinido em uma classe derivada, utilizamos a
palavra virtual. Considere o exemplo de definio a seguir:
virtual void metodo_que_pode_ser_redefinido(parmetros)
Na classe derivada, para redefinirmos o mtodo utilizamos a palavra override:
override void metodo_que_pode_ser_redefinido(parmetros)
Para vermos o princpio do polimorfismo em ao vamos a um exemplo prtico. Criaremos uma classe chamada
Funcionrios, na qual definimos um mtodo chamado calcula_salario. Depois criaremos uma classe baseada na classe
Funcionrios, a qual faz um override do mtodo calcula_salrio.
Considere o exemplo da Listagem 4.8.
Listagem 4.8 Fazendo o override de mtodos no C#. Ex8cap4.cs
using System;
public class ClasseFuncionarios
{
// Definimos um mtodo para calcular o salrio
// com base no cargo que foi passado como parmetro.
public virtual int calcula_salario(string cargo)
{
switch (cargo)
{
case gerente:
return 2500;
case diretor:
return 4500;
case funcionario:
return 1500;
default:
return 1500;
}
}
156 www.juliobattisti.com.br
ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB
}
// Agora crio uma classe derivada de ClasseFuncionarios
// chamada HerdaDeFuncionarios.
// Nesta nova classe redefino o mtodo calcula_salario
public class HerdaDeFuncionarios:ClasseFuncionarios
{
// Vamos redefinir o mtodo para calcular o salrio
public override int calcula_salario(string cargo)
{
switch (cargo)
{
case gerente:
return 3000;
case diretor:
return 4000;
case funcionario:
return 2000;
default:
return 1000;
}
}
}
// Agora vamos definir o programa principal, onde
// utilizaremos o mtodo que foi redefinido.
class Ex8cap4
{
// Exemplo 8 Captulo 4.
// Exemplo de override de mtodo.
// Por: Jlio Battisti
157
CAPTULO 4: CLASSES, MTODOS, HERANA E POLIMORFISMO COM O C#
www.juliobattisti.com.br
// MCP, MCP+I, MCSE, MCSE+I, MCSE, MCDBA
public static void Main()
{
// Crio um objeto FuncionarioOriginal baseado na classe
// ClasseFuncionarios.
ClasseFuncionarios FuncionarioOriginal = new ClasseFuncionarios();
// Chamo o mtodo originalmente definido na classe
// Passando como parmetro gerente
String aux1 = gerente;
Console.WriteLine(********************************************);
Console.WriteLine(RESULTADOS DO MTODO ORIGINAL);
Console.WriteLine(VALOR DO SALRIO PARA {0}, ->
{1},aux1,FuncionarioOriginal.calcula_salario(aux1));
// Crio um objeto FuncionarioModificado baseado na classe
// HerdaFuncionarios.
HerdaDeFuncionarios FuncionarioModificado = new HerdaDeFuncionarios();
// Chamo o mtodo que foi sobrescrito na classe HerdaDeFuncionarios
// Passando como parmetro gerente
String aux2 = gerente;
Console.WriteLine(********************************************);
Console.WriteLine(RESULTADOS DO MTODO REDEFINIDO);
Console.WriteLine(VALOR DO SALRIO PARA {0}, ->
{1},aux1,FuncionarioModificado.calcula_salario(aux2));
}
}
158 www.juliobattisti.com.br
ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB
Digite o exemplo da Listagem 4.8 e salve o mesmo em um arquivo chamado ex8cap4.cs, na pasta C:\ExCsharp\cap4.
Compile e execute o exemplo da Listagem 4.8. Voc obter os resultados indicados na Figura 4.9.
IMPORTANTE: Alguns comandos aparecem divididos em duas linhas, por questo de espao para exibio. Estes comandos
devem ser digitados em uma nica linha. A seguir temos um exemplo de um comando que est dividido em duas linhas por
questes de espao:
Console.WriteLine(VALOR DO SALRIO PARA {0}, ->
{1},aux1,FuncionarioModificado.calcula_salario(aux2));
Figura 4.9: Executando o programa ex8cap4.exe.
Vamos analisar o cdigo da Listagem 4.8.
Inicialmente criamos uma classe ClasseFuncionarios, na qual criamos um mtodo chamado calcula_salario. Este
mtodo recebe um parmetro do tipo string e retorna o valor do salrio correspondente ao cargo passado como parmetro
para o mtodo. Utilizamos a palavra virtual para informar que este mtodo pode ser redefinido (override) em classes
derivadas.
Em seguida criamos uma classe chamada HerdaDeFuncionarios. Esta classe baseada na classe Classefuncionarios.
Observe que para definir uma classe como sendo baseada em outra, utilizamos a sintaxe indicada a seguir:
public class HerdaDeFuncionarios:ClasseFuncionarios
simplesmente colocamos dois-pontos (:) aps o nome da classe e o nome da classe base.
Dentro da classe HerdaDeFuncionarios utilizamos a palavra override para redefinir o mtodo calcula_salario, conforme
indicado no trecho de cdigo a seguir:
159
CAPTULO 4: CLASSES, MTODOS, HERANA E POLIMORFISMO COM O C#
www.juliobattisti.com.br
public class HerdaDeFuncionarios:ClasseFuncionarios
{
// Vamos redefinir o mtodo para calcular o salrio
public override int calcula_salario(string cargo)
{
switch (cargo)
{
case gerente:
return 3000;
case diretor:
return 4000;
case funcionario:
return 2000;
default:
return 1000;
}
}
}
No programa principal criamos dois objetos. Um do tipo ClasseFuncionarios e um do tipo HerdaDeFuncionarios.
Dentro da funo Main chamamos o mtodo calcula_salario das duas classes e comprovamos que realmente eles
retornam valores diferentes para o cargo de gerente. Isto comprova que o mtodo calcula_salario foi redefinido na
classe herdada HerdaDeFuncionarios.
Concluso
Iniciamos o captulo falando de operadores e precedncia de operadores. Tratamos das diversas categorias de operadores
e apresentamos alguns exemplos de utilizao dos mesmos.
Em seguida comeamos a aprender como implementar, na prtica, os conceitos de orientao a objetos com o C#.
Aprendemos a criar classes. Tambm falamos sobre mtodos construtores e destrutores.
Na seqncia tratamos da criao de mtodos, dos diferentes tipos de parmetros que podem ser passados para um
mtodo, e para finalizar tratamos do override de mtodos.
No prximo captulo finalizaremos o nosso estudo bsico da linguagem C#. Veremos tpicos como o tratamento de
excees e classes e mtodos para operaes matemticas e outras operaes bsicas no C#. A partir do Captulo 6
iniciaremos o nosso estudo de ASP.NET.
160 www.juliobattisti.com.br
ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB
Introduo
Neste captulo veremos mais alguns tpicos do C#, tpicos estes que sero
utilizados na construo de pginas ASP.NET nos demais captulos do livro.
Vamos iniciar o captulo apresentando a classe System.Math. Como o nome sugere,
esta classe pertence ao namespace System. Atravs dos mtodos desta classe temos
disposio uma srie de funes para clculos matemticos. Temos funes
para clculos trigonomtricos, logartmicos e numricos.
Em seguida aprenderemos a utilizar os mtodos e propriedades da estrutura
System.DateTime, a qual pertence ao namespace System. Com o uso da estrutura
System.DateTime temos acesso a propriedades que permitem retornar apenas
parte de uma hora (hora, minuto ou segundo) e parte de uma data (ano, ms, dia).
Operaes como ler ou gravar em um arquivo de texto so bastante comuns. Por
isso aprenderemos a realizar estas operaes com o C#. Trabalharemos com as
classes File e FileInfo do namespace System.IO. Vamos apresentar exemplos
prticos de utilizao de mtodos e propriedades destas classes.
Quando acontecem erros, o programa deve ser capaz de tratar os mesmos de uma
maneira elegante. Por exemplo, se o usurio der um comando para gravar no
disquete e no existir um disquete no drive, o programa deve ser capaz de
interceptar e interpretar este erro e emitir uma mensagem para que o usurio
insira um disquete e repita o comando. No seria nada elegante se o programa
simplesmente fechasse devido a um erro deste tipo. Para fazer com que nossos
programas sejam capazes de lidar bem com situaes como a descrita anteriormente
devemos fazer o tratamento de excees. Neste captulo vamos aprender a fazer o
tratamento de excees com o C#.
Com este captulo encerramos o nosso estudo dos aspectos bsicos da linguagem
C#. Estudamos algumas das classes disponveis no .NET Framework Class Li-
brary. Existem, sem exagero, literalmente, milhares de classes e mtodos no .NET
Framework Class Library. Abordamos os elementos bsicos da linguagem,
elementos estes que iremos utilizar na construo de pginas ASP.NET nos demais
captulos deste livro.
Procure entender os conceitos apresentados nos Captulos de 1 a 5. Estes conceitos
so fundamentais para o acompanhamento dos demais captulos. Saber quais os
componentes do Framework .NET, bem como conhecer as funes de cada um,
de fundamental importncia.
C A P T U L O
5
Tpicos Diversos em C#
161
CAPTULO 5: TPICOS DIVERSOS EM C#
www.juliobattisti.com.br
A Classe System.Math Operaes Matemticas
A classe System.Math fornece mtodos para operaes trigonomtricas, logartmicas e outras funes comumente
utilizadas na matemtica. Alm dos mtodos, temos duas propriedades, as quais sero descritas na seqncia.
Campos da Classe System.Math
Temos dois campos, conforme descrito a seguir.
E: Este campo retorna o valor do nmero e, o qual a base para os logartmos neperianos. O valor do nmero
e 2,7182818284590452354. O valor retornado do tipo double.
PI: Este campo retorna o valor da constante PI, cujo valor 3.14159265358979323846. O valor retornado do
tipo double.
Vamos apresentar um exemplo que ilustra a utilizao da classe System.Math e dos campos E e PI. Observe o exemplo
da Listagem 5.1.
Listagem 5.1 Campos da classe System.Math ex1cap5.cs
using System;
class ex1cap5
{
// Exemplo1 - Captulo 5.
// Campos da classe System.Math.
// Por: Jlio Battisti
// MCP, MCP+I, MCSE, MCSE+I, MCSE, MCDBA
public static void Main()
{
// Exibio dos valores dos campos E e PI.
Console.WriteLine(****************************************);
Console.WriteLine(VALOR DO CAMPO E -> {0},Math.E);
Console.WriteLine(VALOR DO CAMPO PI -> {0},Math.PI);
Console.WriteLine(****************************************);
}
}
162 www.juliobattisti.com.br
ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB
Figura 5.1: Executando o programa ex1cap5.exe.
Como a classe Math faz parte do namespace System, simplesmente utilizamos Math. E para fazer referncia ao campo
E da classe Math. O mesmo vlido para o campo PI.
Se utilizarmos a nomenclatura completa, conforme indicado no trecho de cdigo a seguir, o resultado ser o mesmo:
Console.WriteLine(VALOR DO CAMPO E -> {0},System.Math.E);
Console.WriteLine(VALOR DO CAMPO PI -> {0},System.Math.PI);
Mtodos da Classe System.Math
Neste tpico trataremos dos diversos mtodos da classe System.Math.
Mtodo Abs System.Math.Abs(nmero): Este mtodo retorna o valor absoluto do nmero, ou seja, o mdulo
do nmero passado como parmetro. O nmero passado como parmetro pode ser de um dos seguintes tipos:
Decimal, Double, Int16, Int32, Int64, SByte ou Single.
Ex:
System.Math.Abs(-32.15) retorna 32,15.
Mtodo Acos System.Math.Acos(nmero): Este mtodo retorna o valor do ngulo em que o coseno o
nmero passado como parmetro. O valor passado como parmetro deve estar no intervalo de 1 at +1, que
so os valores vlidos para o coseno. O valor do ngulo retornado est em radianos. Em termos de radianos,
3,14 radianos equivalem a 180 graus. Para converter de radiano para graus s utilizar a seguinte frmula:
valor_em_graus = (valor_em_radianos*180)/PI
Digite o exemplo da Listagem 5.1 e salve o mesmo em um arquivo chamado ex1cap5.cs, na pasta C:\ExCsharp\ cap5.
Compile e execute o exemplo da Listagem 5.1. Voc obter os resultados indicados na Figura 5.1.
163
CAPTULO 5: TPICOS DIVERSOS EM C#
www.juliobattisti.com.br
Ex:
System.Math.Acos(-1)
System.Math.Acos(-0.5)
System.Math.Acos(0)
System.Math.Acos(0.5)
System.Math.Acos(1)
Vamos a um exemplo completo no qual utilizamos os mtodos Abs e Acos. Considere o exemplo da Listagem 5.2
Listagem 5.2 Mtodos Abs e Acos da classe Math ex2cap5.cs
using System;
class ex2cap5
{
// Exemplo2 - Captulo 5.
// Mtodos da classe System.Math.
// Por: Jlio Battisti
// MCP, MCP+I, MCSE, MCSE+I, MCSE, MCDBA
public static void Main()
{
// Exibio dos valores dos campos E e PI.
Console.WriteLine(*************************************************);
Console.WriteLine(VALOR ABSOLUTO DE -32.10 -> {0},Math.Abs(-32.10));
Console.WriteLine(*************************************************);
Console.WriteLine(UTILIZAO DO MTODO ACOS);
Console.WriteLine(*************************************************);
Console.WriteLine(NGULO PARA COS = -1 -> {0},Math.Acos(-1));
Console.WriteLine(NGULO PARA COS = -0,5 -> {0},Math.Acos(-0.5));
Console.WriteLine(NGULO PARA COS = 0 -> {0},Math.Acos(0));
Console.WriteLine(NGULO PARA COS = 0.5 -> {0},Math.Acos(0.5));
Console.WriteLine(NGULO PARA COS = 1 -> {0},Math.Acos(1));
164 www.juliobattisti.com.br
ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB
Console.WriteLine(*************************************************);
Console.WriteLine(*************************************************);
Console.WriteLine(CONVERSO DOS NGULOS PARA GRAUS);
Console.WriteLine(*************************************************);
Console.WriteLine(NGULO PARA COS = -1 -> {0},((Math.Acos(-1)*180)/Math.PI));
Console.WriteLine(NGULO PARA COS = -0,5 -> {0},((Math.Acos(-0.5)*180)/Math.PI));
Console.WriteLine(NGULO PARA COS = 0 -> {0},((Math.Acos(0)*180)/Math.PI));
Console.WriteLine(NGULO PARA COS = 0.5 -> {0},((Math.Acos(0.5)*180)/Math.PI));
Console.WriteLine(NGULO PARA COS = 1 -> {0},((Math.Acos(1)*180)/Math.PI));
Console.WriteLine(*************************************************);
}
}
Neste exemplo, primeiro exibimos os valores dos ngulos em radianos, depois utilizamos a frmula para converso de
radianos para graus, que simplesmente multiplicar por 180 e dividir por PI. Observe que, para obter o valor do PI,
utilizamos o campo PI da classe System.Math.
Digite o exemplo da Listagem 5.2 e salve o mesmo em um arquivo chamado ex2cap5.cs, na pasta C:\ExCsharp\cap5.
Compile e execute o exemplo da Listagem 5.2. Voc obter os resultados indicados na Figura 5.2.
Mtodo Asin System.Math.Asin(nmero): Este mtodo retorna o valor do ngulo em que o seno o nmero
passado como parmetro. O valor passado como parmetro deve estar no intervalo de 1 at +1, que so os
valores vlidos para o seno. O valor do ngulo retornado est em radianos. Em termos de radianos, 3,14
radianos equivalem a 180 graus. Para converter de radiano para graus s utilizar a seguinte frmula:
valor_em_graus = (valor_em_radianos*180)/PI
Ex:
System.Math.Asin(-1)
System.Math.Asin(-0.5)
System.Math.Asin(0)
System.Math.Asin(0.5)
System.Math.Asin(1)
165
CAPTULO 5: TPICOS DIVERSOS EM C#
www.juliobattisti.com.br
Figura 5.2: Executando o programa ex2cap5.exe.
Se no exemplo da Listagem 5.2, simplesmente trocssemos Acos por Asin, obteramos os resultados indicados na
Figura 5.3.
Figura 5.3: Executando o programa ex2cap5.exe, aps trocar Acos por Asin.
166 www.juliobattisti.com.br
ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB
Mtodo Atan System.Math.Atan(nmero): Este mtodo retorna o valor do ngulo em que a tangente o
nmero passado como parmetro. O valor do ngulo retornado est em radianos.
Ex:
System.Math.Atan(0)
System.Math.Atan(2)
Mtodo Atan2 System.Math.Atan2(nmero,nmero): Este mtodo retorna o valor do ngulo em que a tangente
igual diviso dos dois nmeros passados como parmetros. O valor do ngulo retornado est em radianos.
Ex:
System.Math.Atan2(6,2) retorna 1,24904577239825 radiano
System.Math.Atan2(4,2) retorna 1,10714871779409 radiano
Mtodo Ceiling System.Math.Ceiling(nmero): Este mtodo retorna o menor nmero inteiro que igual ou
maior do que o nmero passado como parmetro. O valor do parmetro do tipo double.
Ex:
System.Math.Ceiling(2.3498) retorna 3
System.Math.Ceiling(-2.3498) retorna -2 (lembre que 2 maior do que 3)
System.Math.Ceiling(5.0001) retorna 6
System.Math.Ceiling(-1.9999) retorna -1 (lembre que 1 maior do que 2)
Mtodo Cos System.Math.Cos(valor em radianos): Este mtodo retorna o coseno do valor que foi passado
como parmetro. O valor do parmetro deve estar em radianos. Por exemplo, ao invs de 180 graus, informamos
3,14 radianos (PI radianos).
Nos exemplos a seguir utilizamos o campo PI para passar os valores em radianos para o mtodo Cos.
Ex:
System.Math.Cos(Math.PI) retorna -1
System.Math.Cos(0) retorna 1
Mtodo Exp System.Math.Exp(nmero): Este mtodo retorna o nmero e (Math.E) elevado no expoente
passado como parmetro.
Ex:
System.Math.Exp(2) retorna 7,38905609893065
System.Math.Exp(0) retorna 1
Mtodo Floor System.Math.Floor(nmero): Este mtodo retorna o maior nmero inteiro que igual ou
menor do que o nmero passado como parmetro. O valor do parmetro do tipo double.
Ex:
System.Math.Floor(2.3498) retorna 2
System.Math.Floor(-2.3498) retorna -3 (lembre que 3 menor do que 2)
System.Math.Floor(5.0001) retorna 5
System.Math.Floor(-1.9999) retorna -2 (lembre que 2 menor do que 1)
Mtodo IEEERemainder System.Math. IEEERemainder(x,y): Este mtodo retorna o resto da diviso de x por y.
Ex:
System.Math. IEEERemainder(10,4)retorna 2
System.Math. IEEERemainder(250,6) retorna 4
System.Math. IEEERemainder(10,5)retorna 0
167
CAPTULO 5: TPICOS DIVERSOS EM C#
www.juliobattisti.com.br
Mtodo Log System.Math. Log(nmero) ou System.Math.Log(nmero,base): Se o mtodo Log receber um
nico parmetro, ir retornar o logaritmo natural (na base e) do nmero passado como parmetro. Tambm
podemos passar dois parmetros, neste caso o primeiro parmetro o nmero e o segundo, a base.
Ex:
System.Math. Log(10) retorna 2,30258509299405
System.Math. Log(100,10) retorna 2
System.Math. Log(16,2) retorna 4
Mtodo Log10 System.Math. Log10(nmero). O mtodo Log retorna o logaritmo na base 10, do nmero
passado como parmetro.
Ex:
System.Math. Log10(10) retorna 1
System.Math. Log10(100) retorna 2
System.Math. Log10(1000) retorna 3
Mtodo Max System.Math.Max(nmero,nmero): Este mtodo retorna o maior valor dentre dois valores
passados como parmetros. Os dois valores devem ser do mesmo tipo. Os tipos permitidos so os seguintes:
Byte, Decimal, Double, Int16, Int32, Int64, SByte, Single, UInt16, UInt32 ou UInt64.
Ex:
System.Math.Max(-5.-6) retorna -5
System.Math.Max(5,6) retorna 6
Mtodo Min System.Math.Min(nmero,nmero): Este mtodo retorna o menor valor dentre dois valores
passados como parmetros. Os dois valores devem ser do mesmo tipo. Os tipos permitidos so os seguintes:
Byte, Decimal, Double, Int16, Int32, Int64, SByte, Single, UInt16, UInt32 ou UInt64.
Ex:
System.Math.Min(-5.-6) retorna -6
System.Math.Min(5,6) retorna 5
Mtodo Pow System.Math.Pow(x,y): Este mtodo retorna o nmero x elevado no expoente y.
Ex:
System.Math.Pow(2.2) retorna 4
System.Math.Pow(2,3) retorna 8
System.Math.Pow(2,4) retorna 16
System.Math.Pow(5,2) retorna 25
Mtodo Round System.Math.Round(nmero) Ou System.Math.Round (nmero,preciso): Este mtodo faz
o arredondamento para o inteiro mais prximo ou para um nmero de casas decimais especificado. O parmetro
nmero pode ser do tipo Double ou do tipo Decimal. O parmetro preciso, se especificado, deve ser do tipo
Int32 e define o nmero de casas decimais.
Ex:
System.Math.Round(2.49) retorna 2
System.Math.Round(2,4599) retorna 2
System.Math.Round(10.4987564,3) retorna 10,499
Mtodo Sin System.Math.Sin(valor em radianos): Este mtodo retorna o seno do valor que foi passado como
parmetro. O valor do parmetro deve estar em radianos. Por exemplo, ao invs de 180 graus, informamos
3,14 radianos (PI radianos).
168 www.juliobattisti.com.br
ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB
Nos exemplos a seguir utilizamos o campo PI para passar os valores em radianos para o mtodo Sin.
Ex:
System.Math.Sin(Math.PI/2) retorna 1
System.Math.Sin(0) retorna 0
Mtodo Sign System.Math.Sign(nmero): Este mtodo retorna um valor indicando o sinal do nmero passado
como parmetro. O nmero passado como parmetro pode ser de um dos seguintes tipos: Decimal, Double,
Int16, Int32, Int64, SByte ou Single.
Ex:
System.Math.Sign(-32.15) retorna -1
System.Math.Sign(32.15) retorna 1
Mtodo Sqrt System.Math.Sqrt(nmero): Este mtodo retorna a raiz quadrada do nmero passado como
parmetro.
Ex:
System.Math.Sqrt(25) retorna 5
System.Math.Sqrt(144) retorna 12
Mtodo Tan System.Math.Tan(valor em radianos): Este mtodo retorna a tangente do valor que foi passado
como parmetro. O valor do parmetro deve estar em radianos. Por exemplo, ao invs de 180 graus informamos
3,14 radianos (PI radianos).
Nos exemplos a seguir utilizamos o campo PI para passar os valores em radianos para o
mtodo Tan.
Ex:
System.Math.Tan(Math.PI/3) retorna 1,73205080756888
System.Math.Tan(0) retorna 0
Vamos a um exemplo completo no qual utilizamos todos os mtodos matemticos
apresentados neste item. Considere o exemplo da Listagem 5.3
IMPORTANTE: No
existe a tangente para
valores onde o coseno
vale 0. Para 90 (PI/2) e
270 graus (3PI/2) no
existe o valor da
tangente.
Listagem 5.3 Mtodos da classe Math ex3cap5.cs
using System;
class ex3cap5
{
// Exemplo 3 - Captulo 5.
// Campos e Mtodos da classe System.Math.
// Por: Jlio Battisti
// MCP, MCP+I, MCSE, MCSE+I, MCSE, MCDBA
169
CAPTULO 5: TPICOS DIVERSOS EM C#
www.juliobattisti.com.br
public static void Main()
{
// Exibio dos valores dos campos E e PI.
Console.WriteLine(*************************************************);
Console.WriteLine(VALOR ABSOLUTO DE -32.10 -> {0},Math.Abs(-32.10));
Console.WriteLine(*************************************************);
Console.WriteLine(UTILIZAO DO MTODO Asin);
Console.WriteLine(*************************************************);
Console.WriteLine(NGULO PARA SIN = -1 -> {0},Math.Asin(-1));
Console.WriteLine(NGULO PARA SIN = -0,5 -> {0},Math.Asin(-0.5));
Console.WriteLine(NGULO PARA SIN = 0 -> {0},Math.Asin(0));
Console.WriteLine(NGULO PARA SIN = 0.5 -> {0},Math.Asin(0.5));
Console.WriteLine(NGULO PARA SIN = 1 -> {0},Math.Asin(1));
Console.WriteLine(*************************************************);
Console.WriteLine(*************************************************);
Console.WriteLine(CONVERSO DOS NGULOS PARA GRAUS);
Console.WriteLine(*************************************************);
Console.WriteLine(NGULO PARA SIN = -1 -> {0},((Math.Asin(-1)*180)/Math.PI));
Console.WriteLine(NGULO PARA SIN = -0,5 -> {0},((Math.Asin(-0.5)*180)/
Math.PI));
Console.WriteLine(NGULO PARA SIN = 0 -> {0},((Math.Asin(0)*180)/Math.PI));
Console.WriteLine(NGULO PARA SIN = 0.5 -> {0},((Math.Asin(0.5)*180)/Math.PI));
Console.WriteLine(NGULO PARA SIN = 1 -> {0},((Math.Asin(1)*180)/Math.PI));
Console.WriteLine(*************************************************);
Console.WriteLine(ANGULO PARA TAN = 3 -> {0},Math.Atan2(6,2));
Console.WriteLine(ANGULO PARA TAN = 2 -> {0},Math.Atan2(4,2));
Console.WriteLine(*************************************************);
Console.WriteLine(ARREDONDA UTILIZ. Ceiling -> {0},Math.Ceiling(2.3498));
Console.WriteLine(ARREDONDA UTILIZ. Ceiling -> {0},Math.Ceiling(-2.3498));
Console.WriteLine(ARREDONDA UTILIZ. Ceiling -> {0},Math.Ceiling(5.0001));
170 www.juliobattisti.com.br
ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB
Console.WriteLine(ARREDONDA UTILIZ. Ceiling -> {0},Math.Ceiling(-1.9999));
Console.WriteLine(*************************************************);
Console.WriteLine(COSENO PARA 180 graus PI-> {0},Math.Cos(Math.PI));
Console.WriteLine(COSENO PARA 0 graus -> {0},Math.Cos(0));
Console.WriteLine(*************************************************);
Console.WriteLine(e elevado ao quadrado-> {0},Math.Exp(2));
Console.WriteLine(e elevado na zero -> {0},Math.Exp(0));
Console.WriteLine(*************************************************);
Console.WriteLine(ARREDONDA UTILIZ. Floor -> {0},Math.Floor(2.3498));
Console.WriteLine(ARREDONDA UTILIZ. Floor -> {0},Math.Floor(-2.3498));
Console.WriteLine(ARREDONDA UTILIZ. Floor -> {0},Math.Floor(5.0001));
Console.WriteLine(ARREDONDA UTILIZ. Floor -> {0},Math.Floor(-1.9999));
Console.WriteLine(*************************************************);
Console.WriteLine(RESTO DA DIVISO 10/4 -> {0},Math.IEEERemainder(10,4));
Console.WriteLine(RESTO DA DIVISO 250/6 -> {0},Math.IEEERemainder(250,6));
Console.WriteLine(RESTO DA DIVISO 10/5 -> {0},Math.IEEERemainder(10,5));
Console.WriteLine(*************************************************);
Console.WriteLine(LOGARITMO NATURAL DE 10 -> {0},Math.Log(10));
Console.WriteLine(LOG DE 100 NA BASE 10 -> {0},Math.Log(100,10));
Console.WriteLine(LOG DE 16 NA BASE 2 -> {0},Math.Log(16,2));
Console.WriteLine(*************************************************);
Console.WriteLine(LOGARITMO DE 10 -> {0},Math.Log10(10));
Console.WriteLine(LOGARITMO DE 100 -> {0},Math.Log10(100));
Console.WriteLine(LOGARITMO DE 1000 -> {0},Math.Log10(1000));
Console.WriteLine(*************************************************);
Console.WriteLine(MXIMO ENTRE -5 E -6 -> {0},Math.Max(-5,-6));
Console.WriteLine(MXIMO ENTRE 5 E 6 -> {0},Math.Max(5,6));
Console.WriteLine(*************************************************);
171
CAPTULO 5: TPICOS DIVERSOS EM C#
www.juliobattisti.com.br
Console.WriteLine(MNIMO ENTRE -5 E -6 -> {0},Math.Min(-5,-6));
Console.WriteLine(MNIMO ENTRE 5 E 6 -> {0},Math.Min(5,6));
Console.WriteLine(*************************************************);
Console.WriteLine(2 ELEVADO NA 2 -> {0},Math.Pow(2,2));
Console.WriteLine(2 ELEVADO NA 3 -> {0},Math.Pow(2,3));
Console.WriteLine(2 ELEVADO NA 4 -> {0},Math.Pow(2,4));
Console.WriteLine(5 ELEVADO NA 2 -> {0},Math.Pow(5,2));
Console.WriteLine(*************************************************);
Console.WriteLine(ROUND EM 2,49 -> {0},Math.Round(2.49));
Console.WriteLine(ROUND EM 2,4599 -> {0},Math.Round(2.4599));
Console.WriteLine(10,4987564 COM 3 CASAS -> {0},Math.Round(10.4987564,3));
Console.WriteLine(*************************************************);
Console.WriteLine(SENO PARA 90 graus PI/2-> {0},Math.Sin(Math.PI/2));
Console.WriteLine(SENO PARA 0 graus -> {0},Math.Sin(0));
Console.WriteLine(*************************************************);
Console.WriteLine(SINAL PARA -32,15 -> {0},Math.Sign(-32.15));
Console.WriteLine(SINAL PARA 32,15 -> {0},Math.Sign(32.15));
Console.WriteLine(*************************************************);
Console.WriteLine(RAIZ QUADRADA DE 25 -> {0},Math.Sqrt(25));
Console.WriteLine(RAIZ QUADRADA DE 144 -> {0},Math.Sqrt(144));
Console.WriteLine(*************************************************);
Console.WriteLine(TANENTE PARA 60 graus PI-> {0},Math.Tan(Math.PI/3));
Console.WriteLine(TANENTE PARA 0 graus -> {0},Math.Tan(0));
}
}
Digite o exemplo da Listagem 5.3 e salve o mesmo em um arquivo chamado ex3cap5.cs, na pasta C:\ExCsharp\ cap5.
Compile e execute o exemplo da Listagem 5.3. Obteremos os resultados indicados a seguir:
172 www.juliobattisti.com.br
ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB
SADA DO PROGRAMA ex3cap5.exe:
*************************************************
VALOR ABSOLUTO DE -32.10 -> 32,1
*************************************************
UTILIZAO DO MTODO Asin
*************************************************
NGULO PARA SIN = -1 -> -1,5707963267949
NGULO PARA SIN = -0,5 -> -0,523598775598299
NGULO PARA SIN = 0 -> 0
NGULO PARA SIN = 0.5 -> 0,523598775598299
NGULO PARA SIN = 1 -> 1,5707963267949
*************************************************
CONVERSO DOS NGULOS PARA GRAUS
*************************************************
NGULO PARA SIN = -1 -> -90
NGULO PARA SIN = -0,5 -> -30
NGULO PARA SIN = 0 -> 0
NGULO PARA SIN = 0.5 -> 30
NGULO PARA SIN = 1 -> 90
*************************************************
NGULO PARA TAN = 3 -> 1,24904577239825
NGULO PARA TAN = 2 -> 1,10714871779409
*************************************************
ARREDONDA UTILIZ. Ceiling -> 3
ARREDONDA UTILIZ. Ceiling -> -2
ARREDONDA UTILIZ. Ceiling -> 6
ARREDONDA UTILIZ. Ceiling -> -1
*************************************************
COSENO PARA 180 graus PI-> -1
COSENO PARA 0 graus -> 1
*************************************************
*************************************************
e elevado ao quadrado -> 7,38905609893065
e elevado na zero -> 1
*************************************************
173
CAPTULO 5: TPICOS DIVERSOS EM C#
www.juliobattisti.com.br
ARREDONDA UTILIZ. Floor -> 2
ARREDONDA UTILIZ. Floor -> -3
ARREDONDA UTILIZ. Floor -> 5
ARREDONDA UTILIZ. Floor -> -2
*************************************************
RESTO DA DIVISO 10/4 -> 2
RESTO DA DIVISO 250/6 -> 4
RESTO DA DIVISO 10/5 -> 0
*************************************************
LOGARITMO NATURAL DE 10 -> 2,30258509299405
LOG DE 100 NA BASE 10 -> 2
LOG DE 16 NA BASE 2 -> 4
*************************************************
LOGARITMO DE 10 -> 1
LOGARITMO DE 100 -> 2
LOGARITMO DE 1000 -> 3
*************************************************
MXIMO ENTRE -5 E -6 -> -5
MXIMO ENTRE 5 E 6 -> 6
*************************************************
MNIMO ENTRE -5 E -6 -> -6
MNIMO ENTRE 5 E 6 -> 5
*************************************************
2 ELEVADO NA 2 -> 4
2 ELEVADO NA 3 -> 8
2 ELEVADO NA 4 -> 16
5 ELEVADO NA 2 -> 25
*************************************************
ROUND EM 2,49 -> 2
ROUND EM 2,4599 -> 2
10,4987564 COM 3 CASAS -> 10,499
*************************************************
SENO PARA 90 graus PI/2-> 1
SENO PARA 0 graus -> 0
*************************************************
SINAL PARA -32,15 -> -1
174 www.juliobattisti.com.br
ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB
SINAL PARA 32,15 -> 1
*************************************************
RAIZ QUADRADA DE 25 -> 5
RAIZ QUADRADA DE 144 -> 12
*************************************************
TANENTE PARA 60 graus PI/3 -> 1,73205080756888
TANENTE PARA 0 graus -> 0
TANENTE PARA 180 graus PI -> 1,63317787283838E+16
A Estrutura System.DateTime Datas e Horas
No namespace System temos uma estrutura chamada System.DateTime. Para realizar operaes com valores de data
e hora utilizamos os campos, propriedades e mtodos desta estrutura. A estrutura System.DateTime bastante flexvel.
S para se ter uma idia, existem sete construtores diferentes para esta estrutura.
Vamos apresentar um exemplo onde utilizamos os principais construtores da estrutura System.DateTime. Considere o
exemplo da Listagem 5.4
Listagem 5.4 Construtores de System.DateTime ex4cap5.cs
using System;
class ex4cap5
{
// Exemplo 4 - Captulo 5.
// Construtores de System.DateTime.
// Por: Jlio Battisti
// MCP, MCP+I, MCSE, MCSE+I, MCSE, MCDBA
public static void Main()
{
// Utilizao de diversos construtores de System.DateTime.
DateTime constrex1 = new DateTime(2001,7,21);
DateTime constrex2 = new DateTime(0);
DateTime constrex3 = new DateTime(2001,7,21,16,30,45);
175
CAPTULO 5: TPICOS DIVERSOS EM C#
www.juliobattisti.com.br
//Exibio dos resultados
Console.WriteLine(****************************************);
Console.WriteLine(DATA E HORA ATUAIS -> {0},DateTime.Now);
Console.WriteLine(CONSTRUTOR -dia,ms,ano -> {0},constrex1);
Console.WriteLine(CONSTRUTOR -milisegundos -> {0},constrex2);
Console.WriteLine(CONSTRUTOR -d,m,a,h,min,seg -> {0},constrex3);
Console.WriteLine(****************************************);
}
}
Digite o exemplo da Listagem 5.4 e salve o mesmo em um arquivo chamado ex4cap5.cs, na pasta C:\ExCsharp\cap5.
Compile e execute o exemplo da Listagem 5.4. Voc obter os resultados indicados na Figura 5.4.
Figura 5.4: Executando o programa ex4cap5.exe.
Neste exemplo utilizamos os trs construtores mais utilizados. Observe o cdigo a seguir:
DateTime constrex1 = new DateTime(2001,7,21);
Neste exemplo estamos utilizando um construtor no qual so passados trs valores: ano, ms e dia. Os valores para
hora, minuto e segundo so inicializados com zero, conforme pode ser confirmado na Figura 5.4.
DateTime constrex2 = new DateTime(0);
Neste exemplo utilizamos um construtor no qual passamos, com nico parmetro, o nmero de milisegundos a partir
da menor data suportada pelo Framework .NET. Como passamos um valor zero, o mesmo ir exibir a menor data
possvel, que, conforme podemos confirmar pela sada do programa, : 1/1/0001 00:00:00.
176 www.juliobattisti.com.br
ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB
DateTime constrex3 = new DateTime(2001,7,21,16,30,45);
Neste exemplo utilizamos um construtor no qual so passados seis valores: ano, ms, dia, hora, minuto e segundo.
Campos da Estrutura System.DateTime
A estrutura DateTime tem dois campos:
DateTime.MaxValue: Este campo retorna o valor da maior data/hora suportada pela estrutura DateTime. O
valor retornado : 31/12/9999 23:59:59, para o sistema de Data/Hora do Brasil.
DateTime.MinValue: Este campo retorna o valor da menor data/hora suportada pela estrutura DateTime. O
valor retornado : 1/1/0001 00:00:00, para o sistema de Data/Hora do Brasil.
Propriedades da Estrutura System.DateTime
Na Tabela 5.1 temos a descrio das propriedades da estrutura System.DateTime.
Tabela 5.1 Propriedades da estrutura System.DateTime
Propriedade Descrio
Date Retorna apenas a parte referente data.
Day Retorna apenas o dia.
DayOfWeek Retorna um nmero que indica o dia da semana. O nmero varia de zero para o
Domingo, 1 para a segunda-feira, 2 para a tera-feira e assim por diante, at 6 para o
sbado.
DayOfYear Retorna um nmero que indica o dia do ano. Retorna 1 para 1 de Janeiro, 2 para 02 de
Janeiro e assim por diante, at 365 (ou 366 se for ano bissexto) para 31 de Dezembro.
Hour Retorna apenas a hora.
Minute Retorna apenas o minuto.
Month Retorna apenas o ms.
Now Retorna a Data e a Hora do sistema.
Second Retorna os segundos.
Year Retorna apenas o Ano.
177
CAPTULO 5: TPICOS DIVERSOS EM C#
www.juliobattisti.com.br
Vamos apresentar um exemplo no qual utilizamos as propriedades da estrutura System.DateTime.
Considere o exemplo da Listagem 5.5
Listagem 5.5 Propriedades de System.DateTime ex5cap5.cs
using System;
class ex5cap5
{
// Exemplo 5 - Captulo 5.
// Propriedades de System.Date.
// Por: Jlio Battisti
// MCP, MCP+I, MCSE, MCSE+I, MCSE, MCDBA
public static void Main()
{
// Utilizao de diversos construtores de System.DateTime.
DateTime constrex1 = DateTime.Now;
//Exibio dos resultados
Console.WriteLine(****************************************);
Console.WriteLine(HORA DO SISTEMA -> {0},constrex1.Hour);
Console.WriteLine(MINUTO DO SISTEMA -> {0},constrex1.Minute);
Console.WriteLine(SEGUNDOS DO SISTEMA -> {0},constrex1.Second);
Console.WriteLine(ANO DO SISTEMA-> {0},constrex1.Year);
Console.WriteLine(MS DO SISTEMA-> {0},constrex1.Month);
Console.WriteLine(DIA DO SISTEMA-> {0},constrex1.Day);
Console.WriteLine(DATA COMPLETA -> {0},constrex1.Date);
Console.WriteLine(DIA DA SEMANA -> {0},constrex1.DayOfWeek);
Console.WriteLine(DIA DO ANO ->
{0},constrex1.DayOfYear);
}
}
178 www.juliobattisti.com.br
ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB
Figura 5.5: Executando o programa ex5cap5.exe.
O Namespace System.IO Operaes com Arquivos e Pastas
Na verso do ASP Active Server Pages, que acompanha o Windows 2000 ASP 3.0, temos um objeto chamado
FileSystemObject. Com o uso deste objeto temos acesso ao sistema de arquivos do servidor. Existem diversos mtodos
que possibilitam obter informaes sobre drives, pastas e arquivos. O Framework .NET fornece o namespace System.IO,
no qual encontramos diversas classes para operaes com drives, pastas e arquivos.
Nesta seo apresentaremos alguns mtodos e propriedades das classes System.IO.File e System.IO.FileInfo. Nos
demais captulos deste livro vamos utilizar novamente estas classes, alm da classe System.IO.Directory.
A Classe System.IO.File Operaes com Arquivos
A classe System.IO.File fornece mtodos para criar, copiar, mover e abrir arquivos. Quando criamos um novo arquivo,
utilizando o mtodo para criao de arquivos da classe File, so definidas permisses de acesso total para todos os
usurios, por padro. o famoso Everyone -> Full Control.
Alguns mtodos recebem caminhos como parmetros. Existem vrias maneiras de especificar um caminho. Pode ser
o caminho completo: C:\\Documentos\relatorio.doc. Pode ser o caminho para uma pasta: C:\\Documentos. Pode ser
um caminho relativo, em relao ao diretrio atual: Documentos\\Fiscais\2001. Pode ser um caminho de rede no
formato UNC (Universal Naming Convention). Por exemplo, para usar o formato UNC para acessar um arquivo
chamado vendas.doc, que est em uma pasta compartilhada chamada Vendas em um servidor chamado vendassrv,
Digite o exemplo da Listagem 5.5 e salve o mesmo em um arquivo chamado ex5cap5.cs, na pasta C:\ExCsharp\cap5.
Compile e execute o exemplo da Listagem 5.5. Voc obter os resultados indicados na Figura 5.5.
179
CAPTULO 5: TPICOS DIVERSOS EM C#
www.juliobattisti.com.br
devemos utilizar o seguinte caminho: \\\\vendassrv\vendas\vendas.doc. Todo caminho UNC inicia com duas barras,
porm a barra invertida considerada um caractere especial e todo caractere especial deve ser precedido de uma barra
invertida. O mesmo comentrio vlido para os casos anteriores, onde ao invs de uma estamos utilizando duas
barras. Por isso cada barra invertida representada duas vezes.
Mtodos da Classe System.IO.File
Na Tabela 5.2 temos a descrio dos principais mtodos da classe System.IO.File.
Tabela 5.2 Principais mtodos da classe System.IO.File.
Mtodo Descrio
AppendText Anexa texto a um arquivo j existente ou cria um novo arquivo se ainda no existir o
arquivo passado como parmetro.
Copy Efetua a cpia de um arquivo para uma pasta diferente ou para a mesma pasta com um
nome diferente. Podemos especificar se o arquivo deve ser substitudo caso o mesmo j
exista.
Create Cria um arquivo em uma pasta especificada como parmetro.
Delete Exclui um arquivo passado como parmetro. Caso o arquivo no exista, ser gerada uma
exceo.
Exists Determina se o arquivo passado como parmetro existe.
GetAttributes Obtm os atributos do arquivo passado como parmetro.
GetCreationTime Retorna a data e a hora em que o arquivo foi criado.
GetLastAccessTime Retorna a data e a hora em que o arquivo foi acessado pela ltima vez.
GetLastWriteTime Retorna a data e a hora em que foram gravadas informaes no arquivo, pela ltima vez.
Move Move o arquivo para uma nova localizao.
SetAttributes Define os atributos de um arquivo.
SetCreationTime Define a informao sobre a hora e a data em que o arquivo foi criado.
SetLastAccessTime Define a informao sobre a ltima data e hora em que o arquivo foi acessado.
SetLastWriteTime Define a informao sobre a ltima data e hora em que foram feitas gravaes no
arquivo.
Vamos apresentar um exemplo no qual utilizamos alguns mtodos da classe System.IO.File. Neste exemplo vamos
criar um arquivo chamado teste.txt. Este arquivo ser criado na pasta C:\. Depois utilizaremos alguns mtodos da
classe System.IO.File.
180 www.juliobattisti.com.br
ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB
Considere o exemplo da Listagem 5.6
Listagem 5.6 Mtodos da classe System.IO.File ex6cap5.cs
using System;
using System.IO;
class ex6cap5
{
// Exemplo 6 - Captulo 5.
// Mtodos de System.IO.File
// Por: Jlio Battisti
// MCP, MCP+I, MCSE, MCSE+I, MCSE, MCDBA
public static void Main()
{
// Vamos copiar o arquivo C:\autoexec.bat
// para C:\teste.bat
File.Copy(C:\\autoexec.bat,C:\\teste.bat);
// Agora passaremos a utilizar alguns mtodos.
// Vamos testar se o arquivo teste.bat foi criado.
Console.WriteLine(Existe teste.bat ? {0},File.Exists(C:\\teste.bat));
// Exibe os atributos do arquivo teste.bat
Console.WriteLine(Atributos de teste.bat ->
{0},File.GetAttributes(C:\\teste.bat));
// Exibe a data e hora de criao do arquivo teste.bat
Console.WriteLine(teste.bat foi criado em ->
{0},File.GetCreationTime(C:\\teste.bat));
// Exibe a data e hora do ltimo acesso ao arquivo teste.bat
Console.WriteLine(teste.bat foi acessado em ->
{0},File.GetLastAccessTime(C:\\teste.bat));
// Exibe a data e hora da ltima gravao no arquivo teste.bat
181
CAPTULO 5: TPICOS DIVERSOS EM C#
www.juliobattisti.com.br
Console.WriteLine(teste.bat foi gravado em ->
{0},File.GetLastWriteTime(C:\\teste.bat));
// Deleto o arquivo teste.bat
File.Delete(C:\\teste.bat);
}
}
Digite o exemplo da Listagem 5.6 e salve o mesmo em um arquivo chamado ex6cap5.cs, na pasta C:\ExCsharp\cap5.
Compile e execute o exemplo da Listagem 5.6. Voc obter os resultados indicados na Figura 5.6.
Figura 5.6: Executando o programa ex6cap5.exe.
IMPORTANTE: Se o
arquivo C:\teste.bat j
existir, ser gerado o erro
de execuo indicado nas
Figuras 5.7 e 5.8.
Figura 5.7: Erro gerado se o arquivo C:\teste.bat j existir.
182 www.juliobattisti.com.br
ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB
Figura 5.8: Erro gerado se o arquivo C:\teste.bat j existir.
Tambm importante salientar que, para termos acesso classe File, fizemos referncia ao namespace System.IO no
incio do programa:
using System.IO;
Se no tivssemos feito esta referncia, ao invs de utilizar simplesmente File, teramos que utilizar o caminho completo:
System.IO.File
A Classe System.IO.FileInfo Informaes Sobre Arquivos
A classe System.IO.FileInfo fornece algumas propriedades que retornam informaes sobre um arquivo, tais como:
nome do arquivo, nome do diretrio, caminho completo e tamanho.
As consideraes sobre o caminho a ser fornecido como parmetro so as mesmas que foram feitas para a classe
System.IO.File.
Propriedades da Classe System.IO.FileInfo
Na Tabela 5.3 temos a descrio das principais propriedades da classe System.IO.FileInfo.
Tabela 5.3 Principais propriedades da classe System.IO.FileInfo.
Propriedade Descrio
Name Retorna o nome do arquivo.
Length Retorna o tamanho do arquivo ou pasta passado como parmetro.
183
CAPTULO 5: TPICOS DIVERSOS EM C#
www.juliobattisti.com.br
Vamos apresentar um exemplo no qual utilizamos as propriedades da classe System.IO.FileInfo.
Considere o exemplo da Listagem 5.7.
Listagem 5.7 Propriedades da classe System.IO.FileInfo ex7cap5.cs
using System;
using System.IO;
class ex7cap5
{
// Exemplo 7 - Captulo 5.
// Propriedades de System.IO.FileInfo
// Por: Jlio Battisti
// MCP, MCP+I, MCSE, MCSE+I, MCSE, MCDBA
public static void Main()
{
// Vamos criar uma varivel meuarquivo, do tipo FileInfo,
// a qual aponta para o arquivo C:\autoexec.bat
FileInfo meuarquivo = new FileInfo(C:\\autoexec.bat);
// Agora passaremos a utilizar algumas propriedades.
// Vamos verificar o nome do arquivo c:\autoexec.bat.
Console.WriteLine(Nome -> {0},meuarquivo.Name);
// Vamos verificar o nome do arquivo c:\autoexec.bat.
Propriedade Descrio
Directory Retorna uma instncia de um objeto do tipo Directory, a qual aponta para a pasta onde
est o arquivo.
DirectoryName Retorna o caminho completo para o arquivo passado como parmetro.
184 www.juliobattisti.com.br
ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB
Console.WriteLine(Tamanho -> {0} bytes,meuarquivo.Length);
// Vamos verificar o nome do arquivo c:\autoexec.bat.
Console.WriteLine(Caminho completo -> {0},meuarquivo.DirectoryName);
}
}
Digite o exemplo da Listagem 5.7 e salve o mesmo em um arquivo chamado ex7cap5.cs, na pasta C:\ExCsharp\cap5.
Compile e execute o exemplo da Listagem 5.7. Voc obter os resultados indicados na Figura 5.9.
Figura 5.9: Executando o programa ex7cap5.exe.
O Tratamento de Excees
Tratar excees de fundamental importncia para que um programa no seja encerrado inesperadamente. Uma
exceo pode acontecer durante o processamento do programa, quando algo inesperado acontece e deve ser tratado
pelo programa, para que o mesmo no seja encerrado sem que o usurio saiba o que est acontecendo. Dois exemplos
tpicos de excees:
O programa tenta fazer uma leitura no disquete e no existe disquete no drive.
Uma diviso por zero.
As excees devem ser detectadas e opes devem ser oferecidas para o usurio do programa. Por exemplo, no caso do
disquete que no est no drive, a exceo deve ser detectada e o programa deve exibir uma mensagem solicitando que o
usurio insira um disquete no drive. Este procedimento muito mais amigvel do que simplesmente encerrar o programa.
185
CAPTULO 5: TPICOS DIVERSOS EM C#
www.juliobattisti.com.br
Outra grande vantagem do Framework .NET que o tratamento de excees padronizado, independentemente da
linguagem que est sendo utilizada. Uma exceo gerada em um componente escrito em C++ pode ser tratada em um
cliente escrito em C# e vice-versa.
Neste tpico veremos como tratar excees em nossos programas C#.
Utilizando try e catch
Para definir o tratamento de excees em nossos programas precisamos organizar os cdigos em um bloco try e um
bloco catch. Dentro do bloco try colocamos o cdigo que pode gerar uma exceo por exemplo os comandos que
faro a leitura de um arquivo no disquete e que, se o disquete no estiver no drive, ser gerada uma seo. O cdigo
para o tratamento da exceo colocado dentro do bloco catch.
Vamos apresentar um exemplo no qual utilizamos try e catch para fazer o tratamento de excees. O nosso programa
solicita que o usurio digite dois nmeros. Depois, o programa faz a diviso dos nmeros e exibe o resultado. Para
forar uma exceo vamos fornecer um valor zero para o segundo nmero, de tal forma que o programa, ao tentar
fazer uma diviso por zero, ir gerar uma exceo.
Considere o exemplo da Listagem 5.8.
Listagem 5.8 Tratamento de excees com try e catch ex8cap5.cs
using System;
class ex8cap5
{
// Exemplo 8 - Captulo 5.
// Tratamento de excees com try e catch.
// Por: Jlio Battisti
// MCP, MCP+I, MCSE, MCSE+I, MCSE, MCDBA
public static void Main()
{
// Incio do bloco try.
// Contm o cdigo que pode gerar a exceo.
try
{
186 www.juliobattisti.com.br
ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB
// Declarao das variveis.
int divisao;
// Entrada dos valores de x e y
Console.Write(Digite o NUMERADOR ->);
String Aux1=Console.ReadLine();
Console.Write(Digite o DENOMINADOR ->);
String Aux2=Console.ReadLine();
// Clculo da diviso.
divisao = Convert.ToInt32(Aux1) / Convert.ToInt32(Aux2);
// Exibio dos resultados.
Console.WriteLine(O valor da DIVISO -> {0},divisao);
}
// Final do bloco try.
// Incio do bloco catch.
// Cdigo que ser executado se uma exceo
// for gerada no bloco try.
catch (Exception e)
{
Console.WriteLine(FOI GERADA A SEGUINTE EXCEO: + e.Message);
}
// Final do bloco catch.
}
}
Digite o exemplo da Listagem 5.8 e salve o mesmo em um arquivo chamado ex8cap5.cs, na pasta C:\ExCsharp\cap5.
Compile e execute o exemplo da Listagem 5.8. Digite 10 para o numerador e 2 para o denominador. Voc obter os
resultados indicados na Figura 5.10.
187
CAPTULO 5: TPICOS DIVERSOS EM C#
www.juliobattisti.com.br
Figura 5.10: Executando, sem excees, o programa ex8cap5.exe.
Observe que o programa executa normalmente. Agora vamos forar uma exceo, e para isso digitaremos 0 para o
segundo valor, forando uma diviso por zero. Vamos executar novamente o programa. Digite 10 para o primeiro valor
e 0 para o segundo. Voc obter os resultados indicados na Figura 5.11.
Neste segundo caso, ao tentar fazer uma diviso por zero, uma exceo ser gerada. Ao ser gerada a execuo, o
cdigo do bloco catch ser executado. O bloco catch recebe um parmetro do tipo Exception. Exception uma classe
do namespace System System.Exception. Uma das propriedades desta classe Message, a qual contm a mensagem
associada com a exceo. No nosso exemplo a mensagem : Attempted to divide by zero, o que confirma a nossa
tentativa de fazer uma diviso por zero.
Figura 5.11: Executando, forando uma exceo, o programa ex8cap5.exe.
188 www.juliobattisti.com.br
ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB
Existem classes que tratam excees mais especficas, como por exemplo:
System.OutOfMemoryException
System.OverFlowException
System.NullReferenceException
System.NotSupportedException
System.NotImplementedException
System.NotFiniteNumberException
System.MissingMethodException
System.MissingMemberException
System.MissingFieldException
System.MethodAccessException
System.MemberAccessException
System.InvalidProgramException
System.InvalidOperationException
System.InvalidCastException
System.IndexOutOfRangeException
System.FormatException
System.FieldAccessException
System.ExecutionEngineException
System.EntryPointNotFoundException
System.DuplicateWaitObjectException
System.DllNotFoundException
System.DivideByZeroException
Vamos utilizar algumas destas classes nos demais captulos deste livro.
Utilizando try e finally
Em determinadas situaes queremos que um determinado bloco de cdigo seja executado, mesmo que no tenha sido
gerada nenhuma exceo. Para que isso seja possvel podemos utilizar finally ao invs de catch. O cdigo dentro do
bloco finally sempre executado, mesmo que no tenha sido gerada nenhuma exceo.
Vamos modificar um pouco o exemplo anterior.
Considere o exemplo da Listagem 5.9.
189
CAPTULO 5: TPICOS DIVERSOS EM C#
www.juliobattisti.com.br
Listagem 5.9 Tratamento de excees com try e finally ex9cap5.cs
using System;
class ex9cap5
{
// Exemplo 9 - Captulo 5.
// Tratamento de excees com try e finally.
// Por: Jlio Battisti
// MCP, MCP+I, MCSE, MCSE+I, MCSE, MCDBA
public static void Main()
{
// Bloco try.
// Contm o cdigo que pode gerar a exceo.
try
{
// Declarao das variveis.
int divisao;
// Entrada dos valores de x e y
Console.Write(Digite o NUMERADOR ->);
String Aux1=Console.ReadLine();
Console.Write(Digite o DENOMINADOR ->);
String Aux2=Console.ReadLine();
// Clculo da diviso.
divisao = Convert.ToInt32(Aux1) / Convert.ToInt32(Aux2);
// Exibio dos resultados.
190 www.juliobattisti.com.br
ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB
Console.WriteLine(O valor da DIVISO -> {0},divisao);
}
// Final do bloco try.
// Incio do bloco finally.
// Cdigo que ser executado mesmo que nenhuma exceo
// seja gerada no bloco try.
finally
{
Console.WriteLine(CDIGO EXECUTADO TENHA OU NO SIDO GERADA UMA EXCEO);
}
// Final do bloco finally.
}
}
Digite o exemplo da Listagem 5.9 e salve o mesmo em um arquivo chamado ex9cap5.cs, na pasta C:\ExCsharp\cap5.
Compile e execute o exemplo da Listagem 5.9. Digite 10 para o numerador e 2 para o denominador. Voc obter os
resultados indicados na Figura 5.12. Observe que o cdigo do bloco finally foi executado, mesmo sem ter sido gerada
nenhuma exceo.
Figura 5.12: Executando, sem excees, o programa ex9cap5.exe.
191
CAPTULO 5: TPICOS DIVERSOS EM C#
www.juliobattisti.com.br
Figura 5.13: Aviso de que uma exceo foi gerada.
Agora vamos forar uma exceo, e para isso digitaremos 0 para o segundo valor, forando uma diviso por zero.
Vamos executar novamente o programa. Digite 10 para o primeiro valor e 0 para o segundo. Na Figura 5.13 aberta
uma janela indicando que ocorreu uma exceo no programa.
Neste caso, como no havia um bloco catch, a exceo no foi tratada. Por isso surgiu a janela indicada na Figura 5.13.
D um clique em OK para fechar a janela de aviso e observe que o cdigo do bloco finally foi executado, mesmo tendo
sido gerada uma exceo, conforme indicado pela Figura 5.14:
Figura 5.14: O cdigo do bloco finally sempre executado.
192 www.juliobattisti.com.br
ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB
Mas, se quisermos ter as duas coisas, ou seja:
Cdigo para tratamento de excees.
Cdigo que sempre executa.
Neste caso temos que juntar os blocos catch e finally, em um arranjo conhecido como try catch finally. Vamos
alterar o exemplo anterior para termos uma estrutura try catch finally, de tal forma que as excees sejam tratadas
e tenhamos um cdigo que sempre executa no encerramento do programa.
Considere o exemplo da Listagem 5.10.
Listagem 5.10 Tratamento de excees com try catch finally ex10cap5.cs
using System;
class ex10cap5
{
// Exemplo10 - Captulo 5.
// Tratamento de excees com try - catch - finally.
// Por: Jlio Battisti
// MCP, MCP+I, MCSE, MCSE+I, MCSE, MCDBA
public static void Main()
{
// Bloco try.
// Contm o cdigo que pode gerar a exceo.
try
{
// Declarao das variveis.
int divisao;
// Entrada dos valores de x e y
Console.Write(Digite o NUMERADOR ->);
String Aux1=Console.ReadLine();
193
CAPTULO 5: TPICOS DIVERSOS EM C#
www.juliobattisti.com.br
Console.Write(Digite o DENOMINADOR ->);
String Aux2=Console.ReadLine();
// Clculo da diviso.
divisao = Convert.ToInt32(Aux1) / Convert.ToInt32(Aux2);
// Exibio dos resultados.
Console.WriteLine(O valor da DIVISO -> {0},divisao);
}
// Final do bloco try.
// Incio do bloco catch.
// Cdigo que ser executado se uma exceo
// for gerada no bloco try.
catch (Exception e)
{
Console.WriteLine(FOI GERADA A SEGUINTE EXCEO: + e.Message);
}
// Final do bloco catch.
// Incio do bloco finally.
// Cdigo que ser executado mesmo que nenhuma exceo
// seja gerada no bloco try.
finally
{
Console.WriteLine(CDIGO EXECUTADO TENHA OU NO SIDO GERADA UMA EXCEO);
}
// Final do bloco finally.
}
}
194 www.juliobattisti.com.br
ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB
Digite o exemplo da Listagem 5.10 e salve o mesmo em um arquivo chamado ex10cap5.cs, na pasta C:\ExCsharp\cap5.
Compile e execute o exemplo da Listagem 5.10. Digite 10 para o numerador e 2 para o denominador. Voc obter os
resultados indicados na Figura 5.15. Observe que o cdigo do bloco finally foi executado, mesmo sem ter sido gerada
nenhuma exceo. Como no foi gerada exceo, o cdigo do bloco catch no foi executado.
Figura 5.15: Executando, sem excees, o programa ex10cap5.exe.
Agora vamos forar uma exceo, e para isso digitaremos 0 para o segundo valor, forando uma diviso por zero.
Vamos executar novamente o programa. Digite 10 para o primeiro valor e 0 para o segundo. Na Figura 5.16 observamos
que a exceo foi identificada e a mensagem respectiva foi emitida. Isto indica que o cdigo do bloco catch foi
executado e, portanto, a exceo foi tratada. Tambm podemos observar que o cdigo do bloco finally foi executado,
mesmo tendo sido gerada uma exceo.
Figura 5.16: Execuo, com excees, do programa ex10cap5.exe.
195
CAPTULO 5: TPICOS DIVERSOS EM C#
www.juliobattisti.com.br
Concluso
Neste captulo encerramos nosso estudo sobre os aspectos bsicos do C#. Estudamos os elementos da linguagem C#
que sero utilizados no restante do livro. Com esse captulo encerramos a Parte I do livro, na qual falamos sobre o
Framework .NET e sobre a linguagem C#. Estes captulos formam a base para o restante do livro. A partir do Captulo
6, com o qual iniciamos a Parte II deste livro, estaremos tratando da criao de pginas ASP.NET.
196 www.juliobattisti.com.br
ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB
P A R T E
2
Fundamentos do ASP.NET
197
CAPTULO 6: UMA INTRODUO AO ASP.NET
www.juliobattisti.com.br
Introduo
Na Parte I deste livro (Captulos de 1 a 5) tratamos dos conceitos bsicos do
Framework .NET e da linguagem C#. Neste captulo iniciamos a Parte II do livro,
na qual vamos apresentar esta nova verso da tecnologia ASP (Active Server Pages)
ASP.NET.
Vamos iniciar o captulo fazendo um rpido histrico sobre as vrias verses do
ASP, desde o seu lanamento com o IIS 3.0 at a nova verso ASP.NET que faz
parte do Framework .NET.
Em seguida vamos falar sobre as vantagens e novas caractersticas e o porqu de
precisarmos de uma nova verso, sendo que a ltima verso nem completou dois
anos. Falaremos sobre as diversas novidades do ASP.NET e como cada uma poder
ajudar no desenvolvimento mais rpido de aplicaes Web melhores, mais
confiveis e mais seguras.
Dentre as principais novidades que vamos apresentar neste captulo e detalhar
nos demais, podemos destacar as seguintes:
Separao entre lgica e apresentao.
Mais fcil de implementar.
Suporte a mltiplas linguagens.
Web Form Controls controles mais avanados e inteligentes.
Todas as vantagens oferecidas pelo Framework .NET.
Uma vez feita a propaganda do ASP.NET vamos verificar se todo o suporte
ao ASP.NET j est instalado, para que voc possa acompanhar os exemplos
deste livro.
Para finalizar o captulo apresentaremos alguns exemplos simples, apenas para
termos uma idia de como uma pgina ASP.NET.
Ao final deste captulo voc dever estar apto a relacionar as principais melhorias
do ASP.NET em relao s verses anteriores. Voc tambm ser capaz de entender
a estrutura de uma pgina ASP.NET bem como a maneira com que as mesmas so
processadas pelo servidor IIS Internet Information Services.
Mais uma Verso?
ASP, ASP 2.0, ASP 3.0 e agora ASP.NET.
C A P T U L O
6
Uma Introduo ao ASP.NET
198 www.juliobattisti.com.br
ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB
Menos de dois anos aps o lanamento do ASP 3.0, o qual faz parte do IIS 5.0 com o Windows 2000, a Microsoft lana
mais uma verso da tecnologia ASP Active Server Pages. Na verdade no apenas o lanamento de mais uma
verso. O ASP.NET est inserido em um contexto maior, que a iniciativa .NET da Microsoft. Alm de estar inserido
no contexto do .NET, a tecnologia ASP.NET apresenta enormes diferenas em relao ao ASP 3.0, o que no
permite que a caracterizemos simplesmente como um upgrade do ASP 3.0.
A tecnologia ASP.NET segue os mesmos princpios do Framework .NET, cujo principal objetivo facilitar o
desenvolvimento de aplicaes. No caso especfico do ASP.NET, aplicaes Web. Conforme veremos mais adiante,
com ASP.NET as aplicaes Web passam a usufruir de todos os recursos do Framework .NET.
A tecnologia ASP teve uma enorme aceitao por parte da comunidade de desenvolvedores. Para comprovar tal afirmao
basta conferir o nmero de sites que utilizam ASP. Esta aceitao no se deve somente fora de mercado da Microsoft,
mas tambm facilidade de desenvolvimento propiciada pela utilizao de ASP. Antes de falarmos sobre a nova
verso ASP.NET, vamos ver exatamente o que a tecnologia de Active Server Pages da Microsoft.
Uma Introduo Tecnologia ASP
A Internet deixou de ser uma rede somente para pesquisas acadmicas e passou a ser conhecida no mundo inteiro
quando recebeu uma interface grfica. Isso foi possvel graas ao desenvolvimento dos servidores Web, a utilizao
do protocolo HTTP (Hypertext Transfer Protocol), da linguagem HTML (Hypertext Markup Language) e de um
programa conhecido como Browser (Navegador). Com essa receita, estava formada a WWW World Wide Web ou
simplesmente Web.
O contedo dos sites ficava armazenado em arquivos de cdigo HTML (.htm ou .html) nos servidores Web ou servidores
HTTP como tambm so conhecidos. O usurio utiliza um programa, o Browser, para acessar as pginas HTML. Com
essa combinao, uma pgina HTML era capaz de exibir, alm de texto, elementos grficos. Com isso a internet
passou a ser mais atraente e comeou a conquistar um nmero cada vez maior de usurios.
Na Figura 6.1 temos uma viso geral dos elementos descritos.
Figura 6.1: Internet com contedo esttico.
199
CAPTULO 6: UMA INTRODUO AO ASP.NET
www.juliobattisti.com.br
O problema da linguagem HTML que a mesma fornece contedo esttico, isto , no dinmico. Vamos exemplificar.
Se utilizamos o HTML para publicar uma lista de preos de um catlogo de produtos. Todo o contedo do catlogo
com a lista de preos faz parte do prprio cdigo HTML. Cada vez que tivermos que alterar um preo temos que editar
o arquivo HTML e salvar as alteraes. Somente aps fazermos isto que o usurio passar a ter acesso s modificaes.
Com o crescimento da Internet e o uso cada vez maior da rede para operaes de comrcio, ficou claro que a
tecnologia de pginas estticas do HTML no seria suficiente para a criao de sites e aplicaes Web que
suportassem o Comrcio Eletrnico.
Ento comearam a surgir tecnologias para a criao dinmica de contedo, a partir de informaes contidas em
bancos de dados e outras fontes de informaes. A tecnologia pioneira foi a dobradinha CGI com a linguagem Perl.
A Microsoft, como no poderia deixar de ser, resolveu entrar nesta briga. Em primeiro lugar lanou o seu prprio
servidor Web, que o IIS Internet Information Services. Por ser gratuito e devido grande base Windows instalada,
o IIS rapidamente foi adotado por uma grande parcela de sites. Com a verso 3 do IIS, a Microsoft lana a sua
tecnologia para a criao de pginas dinmicas, o ASP 1.0 Active Server Pages 1.0.
Com a tecnologia ASP, ao invs de pginas .htm ou .html, criamos pginas com a extenso .asp. Estas pginas contm,
alm de cdigo HTML, o chamado cdigo ASP, o qual pode realizar uma srie de operaes que tornam as pginas
dinmicas. Vamos utilizar o exemplo anterior, onde queramos construir um catlogo de preos. Com a tecnologia
ASP, podemos fazer com que a pgina, ao ser carregada, busque a lista de preos em um banco de dados, monte uma
pgina com estas informaes e retorne a pgina para o usurio, exibindo sempre os resultados mais atualizados. Na
Figura 6.2 temos uma viso desta nova fase, com contedo dinmico.
Figura 6.2: Internet com contedo dinmico.
Alm de criar uma pgina que exibe as informaes mais atualizadas, podemos criar formulrios interativos, onde o
usurio pode inserir o cdigo ou nome de um produto e enviar tais informaes para o servidor IIS. Uma pgina ASP
200 www.juliobattisti.com.br
ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB
recebe estas informaes, conecta com um banco de dados e faz uma pesquisa utilizando os critrios passados pelo
usurio. Uma vez encerrada a pesquisa, a pgina ASP retorna apenas os resultados que atendem os critrios da pesquisa.
Observe que agora, alm de receber informaes da Internet, o usurio tambm pode enviar informaes.
Vamos detalhar um pouco mais este processo.
Contedo Dinmico na Internet
Com o crescimento da Internet e a necessidade de constantes alteraes no contedo das pginas, surge uma segunda
gerao de sites na Internet, capazes de entregar contedo sempre atualizado, alm de permitir que o usurio interaja
com as pginas Web, enviando informaes e no apenas recebendo. Nesta fase surge a possibilidade de ligao das
pginas HTML com o contedo de Bancos de dados. Conforme descrevemos no tpico anterior, a tecnologia pioneira
para a criao de contedo dinmico foi a dobradinha CGI/Perl. No diagrama da Figura 6.2 temos uma viso geral
deste processo.
Pelo diagrama, podemos ver a possibilidade de o usurio enviar informaes para a Internet, e no apenas receber
informaes. Isto possibilitou o desenvolvimento de uma srie de servios, simplesmente impossveis de criar, apenas
com a utilizao de pginas criadas somente com HTML.
Para enviar informaes, o usurio preenche os campos de um formulrio (o qual criado com a utilizao de HTML) e,
ao clicar em um boto Enviar, os dados so enviados para o site da Web. Ao chegar no servidor Web, estes dados precisam
ser recebidos por um programa capaz de entender o formato dos dados e armazen-los em um Banco de dados.
Os primeiros programas, capazes de realizar esta tarefa, seguiam a especificao conhecida como CGI Common
Gateway Interface. Muitas aplicaes Web foram desenvolvidas, utilizando-se a especificao CGI, sendo que vrias
ainda continuam sendo utilizadas. A utilizao de Scripts desenvolvidos na linguagem Perl um exemplo de utilizao
de CGI. O Script recebe os dados enviados pelo formulrio, decodifica estes dados e armazena o resultado em um
Banco de dados. Embora bastante funcional, a utilizao de CGI comeou a apresentar alguns problemas, e com isso
novas alternativas foram surgindo. Est fora do escopo deste livro, discutir os problemas da utilizao de CGI.
Dentre as vrias alternativas que surgiram para a gerao de contedo dinmico, podemos citar a tecnologia de Active
Server Pages, a qual faz parte do servidor Web IIS (Internet Information Services), da Microsoft. Podemos criar uma
pgina ASP, capaz de receber os dados enviados por um formulrio e armazenar estes dados em um Banco de dados,
como por exemplo o Microsoft Access ou o Microsoft SQL Server.
Com a conexo de pginas com Bancos de dados, uma srie de possibilidades novas surgiu, como por exemplo:
Criao de pginas para pesquisa em Banco de dados.
Cadastro de usurios que acessam o site, bem como a entrega de contedo personalizado, de acordo com as
preferncias do usurio. Por exemplo, ao entrar no site, o usurio informa um nome de usurio e senha, com o
qual o mesmo foi previamente cadastrado. Com isso aberta uma pgina com opes e contedo personalizados,
de acordo com preferncias especificadas pelo usurio.
201
CAPTULO 6: UMA INTRODUO AO ASP.NET
www.juliobattisti.com.br
Desenvolvimento de aplicaes residentes em servidores Web e acessveis atravs do Navegador. Devemos
observar que estas aplicaes ainda eram limitadas e no possuam todas as funcionalidades das aplicaes
convencionais, desenvolvidas para o ambiente Windows.
Apesar das suas limitaes, um novo panorama desenhava-se na Internet, com a possibilidade da criao de sites mais
dinmicos, atravs da conexo com Bancos de dados. Apenas para exemplificar o funcionamento de uma pesquisa em
Banco de dados, atravs da Internet, observe a Figura 6.3.
Figura 6.3: Pesquisa em um Banco de dados, atravs da Internet.
Vamos analisar os passos executados, desde o momento em que o usurio preenche o critrio de pesquisa, at o
momento em que o resultado da consulta retornado:
O usurio acessa a pgina onde temos um formulrio para a digitao de um ou mais critrios de pesquisa. Por
exemplo, pode ser uma consulta a uma base dos CEPs de todo o Brasil. O usurio poderia digitar o nome da
Cidade, selecionar um Estado e digitar o nome ou parte do nome da Rua.
Aps preencher o(s) critrio(s) de pesquisa, o usurio clica em um boto Enviar ou Pesquisar. Os dados digitados
no formulrio so enviados para o servidor.
Um Script CGI, ou uma pgina ASP, no servidor, recebe os dados enviados pelo usurio. Com estes dados,
montado um comando (normalmente uma String SQL Structured Query Language), o qual vai efetuar a
consulta no Banco de dados. Aps montado o comando, o mesmo enviado para o Servidor de Banco de
dados (o qual pode ser uma mquina separada, ou pode estar instalado no prprio servidor Web).
O Servidor de Banco de dados recebe o comando de pesquisa, localiza um ou mais registros que atendam o(s)
critrio(s) de pesquisa e retorna o resultado para o Script CGI, ou para a Pgina ASP.
202 www.juliobattisti.com.br
ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB
Com o resultado retornado pelo Servidor de Banco de dados, o Script CGI, ou a Pgina ASP, monta uma
pgina HTML, normalmente no formato de uma tabela, e envia esta pgina HTML de volta para o Navegador
do cliente. Caso no seja encontrado nenhum registro que atenda o(s) critrio(s) especificado(s), retornada
uma pgina com uma mensagem de que no foi encontrado nenhum registro.
Veja que, ao mesmo tempo em que aumentaram as possibilidades de desenvolvimento, tambm aumentaram as
complexidades a serem gerenciadas, tanto na criao de pginas, quanto no gerenciamento dos sites. Observe que
ainda nem falamos de questes tais como segurana, proteo do Banco de dados contra acessos no autorizados, ou
at mesmo ataques de Hackers tentando roubar informao ou corromper a informao do Banco de dados.
A tecnologia ASP 3.0 possibilita a criao do formulrio de pesquisa descrito no nosso exemplo. Utilizando ASP 3.0
em conjunto com o padro COM/COM+ da Microsoft, podemos criar aplicaes Web de 3 ou mais camadas.
Mas, se podemos criar aplicaes to sofisticadas e funcionais com ASP 3.0, porque precisamos de uma nova verso?
Vamos responder a esta pergunta no prximo item, onde estaremos falando sobre as principais melhorias do ASP.NET
em relao ao ASP 3.0. Nos demais captulos do livro vamos aprender a utilizar os novos recursos do ASP.NET.
Novidades e Melhorias do ASP.NET
Neste item vamos apresentar as novidades e vantagens do ASP.NET. Mais do que uma simples justificativa para uma
nova verso, procuro demonstrar os benefcios de utilizarmos ASP.NET para a criao de aplicaes WEB.
Faz Parte do Framework .NET
Pode parecer bvio, mas nunca demais salientar este aspecto. ASP.NET parte integrante do Framework .NET, e
desta maneira tem acesso a todos os benefcios da plataforma .NET.
Em uma pgina ASP.NET temos acesso a todas as classes da biblioteca de classes do Framework .NET .NET
Framework Class Library. Tambm temos acesso a um tipo comum de dados e a todos os benefcios do Framework
.NET. S estes benefcios j justificam uma migrao do ASP 3.0 para o ASP.NET.
Suporte a Mltiplas Linguagens
Com as verses anteriores do ASP estvamos limitados praticamente a duas linguagens de Script: VBScript e JScript.
Alm disso, por serem linguagens de Script as mesmas eram interpretadas, ou seja, ao carregar uma pgina ASP, o IIS
precisa ler linha por linha de cdigo, interpretar e executar.
Com ASP.NET podemos utilizar qualquer linguagem que esteja habilitada para o Framework .NET. Inicialmente so
disponibilizadas as linguagens VB.NET, C# e JScript. Apesar do nome JScript, esta e as demais linguagens so
compiladas, o que significa que toda pgina ASP.NET compilada antes de ser executada. Na primeira vez que uma
pgina ASP.NET acessada, a mesma compilada em uma Classe do Framework .NET. A verso compilada mantida
em Cache para melhorar o desempenho para os prximos acessos. Qualquer alterao na pgina automaticamente
203
CAPTULO 6: UMA INTRODUO AO ASP.NET
www.juliobattisti.com.br
detectada pelo Framework .NET; a pgina recompilada e a verso em Cache atualizada, fazendo com que o cliente
tenha sempre acesso verso mais atualizada da pgina. Se no houver mudanas continua sendo utilizada a verso
que est no Cache, o que torna a carga da pgina muito mais rpida.
Alm disso, diversas empresas de Software j anunciaram que esto portando suas linguagens para que sejam compatveis
com o Framework .NET. Desta maneira voc poder utilizar, para a criao de pginas ASP.NET, a linguagem com a
qual est mais familiarizado, desde que a mesma esteja habilitada ao .NET. Voc prefere Delphi? Sem problemas. f
do COBOL? Por que no?
Menos Cdigo Para Mais Trabalho
Com o ASP.NET temos acesso a uma srie de facilidades que diminuem a quantia de cdigo que o programador
precisa escrever, principalmente no trato com funes bsicas. Estas funes bsicas, como a manuteno de estado
entre chamadas de uma pgina, so responsabilidade do Framework .NET. Isso faz com que o programador tenha que
desenvolver apenas a lgica da aplicao, sem ter que se preocupar com aspectos bsicos da Infra-estrutura.
Uma srie de controles mais inteligentes e com melhor funcionalidade foi criada, os chamados Server controls. Estes
controles fornecem grande funcionalidade com um mnimo de programao. Alguns artigos fazem referncia
inteligncia dos server controls. Um dos aspectos considerados inteligentes que, no momento da carga da pgina,
o controle detecta, por exemplo, se o navegador do cliente o Internet Explorer ou o Netscape Navigator e adapta o
seu comportamento e exibio de acordo com o navegador do cliente.
Com ASP tarefas simples, como por exemplo validar os dados digitados em formulrios, exigem a criao de cdigo
especfico. Com os controles inteligentes do ASP.NET, fazer a validao simplesmente questo de configurar
algumas propriedades do controle e pronto, a verificao ser feita no momento em que a pgina for acessada. Nos
Captulos 7, 8 e 9 estaremos falando sobre os diversos controles disponveis. Daremos destaque especial s seguintes
categorias de controles:
HTML Server Controls.
Validation Server Controls.
Web Server Controls.
Separao Entre o Cdigo HTML e o Cdigo ASP
Esta uma das melhorias que eu mais aprecio. Com ASP 3.0 ou verses anteriores, ns tnhamos uma mistura
(literalmente) entre o cdigo ASP e o cdigo HTML, o que torna o cdigo de difcil leitura e documentao. Apenas
para exemplificar, vamos apresentar uma pgina ASP que faz conexo com um banco de dados do Microsoft Access
e exibe todos os registros de uma determinada tabela do banco de dados. Os registros so exibidos na forma de uma
tabela. O Cdigo HTML para a criao da tabela, que ser exibida para o usurio, gerado a partir de uma mescla
entre cdigo ASP e cdigo HTML.
Na Listagem 6.1 temos um exemplo de pgina ASP que faz conexo com um banco de dados do Microsoft Access.
204 www.juliobattisti.com.br
ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB
Listagem 6.1 Uma pgina ASP cdigo ASP e HTML misturado.
<%@ Language=VBScript %>
<HTML>
<HEAD>
<TITLE>Listagem de Clientes</TITLE>
</HEAD>
<BODY>
<H1>
<FONT color=navy>Clientes da Empresa ABC LTDA.</FONT>
</H1>
<%
O Primeiro passo criar a conexo com o Banco de dados
Para isto crio um objeto do tipo Connection
Cria um Objeto do Tipo ADODB.Connection
Set conn = Server.CreateObject(ADODB.Connection)
Agora abro uma conexo utilizando OLE-DB
O cdigo a seguir aparece em duas linhas por questo de espao, porm o mesmo
deve ser digitado em uma nica linha.
conn.Open PROVIDER=MICROSOFT.JET.OLEDB.4.0;DATA SOURCE=c:\meus documentos\nwind.mdb
O prximo passo criar uma instruo SQL
a qual utilizada para criar a listagem de Clientes.
O cdigo a seguir aparece em duas linhas por questo de espao, porm o mesmo
deve ser digitado em uma nica linha.
inst_sql=SELECT Clientes.CodigoCliente, Clientes.Cargo,
Clientes.Endereco,Clientes.Fone FROM Clientes
Esta instruo SQL retorna os campos CodigoCliente, Cargo,
Endereco e Fone, da tabela Clientes.
Agora criamos um Objeto RecordSet.
Este Objeto ir executar a instruo SQL e
receber o resultado da Consulta.
Set Clientes = Server.CreateObject(ADODB.Recordset)
205
CAPTULO 6: UMA INTRODUO AO ASP.NET
www.juliobattisti.com.br
Agora executamos a Instruo SQL
retornando os registros da tabela Clientes.
Clientes.Open inst_sql, conn, 3, 3
Os dois ltimos parmetros sero discutidos
no prximo Captulo.
Neste ponto j tenho todos os registros retornados
pela instruo SQL. Estes registros esto armazenados
no objeto Clientes, que um objeto do tipo Recordset.
Agora passo a montar a pgina que ser retornada para o
Navegador do Cliente. Vamos montar uma tabela com o
resultado da consulta.
%>
<P>
<HR>
<TABLE bgColor=gray border=1 borderColor=navy cellPadding=1 cellSpacing=1
width=100%>
<TR>
<TD align=middle bgColor=gray>Cdigo</TD>
<TD align=middle bgColor=gray>Cargo</TD>
<TD align=middle bgColor=gray>Endereo</TD>
<TD align=middle bgColor=gray>Fone</TD>
</TR>
<%
Inicio um Loop para percorrer todos os registros
do RecordSet Clientes, exibindo um Registro em
cada Linha da tabela.
Do Until Clientes.eof %>
<TR>
<TD align=middle bgColor=gray><%=Clientes.Fields(CodigoCliente)%></TD>
<TD align=middle bgColor=gray><%=Clientes.Fields(Cargo)%></TD>
<TD align=middle bgColor=gray><%=Clientes.Fields(Endereco)%></TD>
<TD align=middle bgColor=gray><%=Clientes.Fields(Fone)%></TD>
</TR>
206 www.juliobattisti.com.br
ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB
<%
Clientes.MoveNext
loop %>
</TABLE>
</P>
<HR>
</BODY>
</HTML>
Na Figura 6.4 temos esta pgina carregada no IE Internet Explorer.
Observe que por mais organizados que sejamos, inserindo comentrios e endentaes no cdigo, no nada fcil a
leitura e interpretao de uma pgina ASP. Isso acontece devido, principalmente, intercalao de cdigo ASP e
cdigo HTML. Em uma mesma pgina ASP posso ter vrias sees de cdigo ASP. Cada seo inicia com <% e
encerra com %>. Tudo o que no estiver entre estes dois marcadores cdigo HTML.
Figura 6.4: Pgina ASP de exemplo.
207
CAPTULO 6: UMA INTRODUO AO ASP.NET
www.juliobattisti.com.br
J com ASP.NET isto no acontece. A parte de apresentao da pgina separada da parte de processamento, isto , da
parte onde est o cdigo responsvel pela lgica de processamento da pgina. Com isto estamos separando a lgica da
apresentao, o que facilita a manuteno das pginas.
Maiores Facilidades Para Criao e Utilizao de Componentes
Esta mais uma das vantagens propiciadas pelo Framework .NET. Conforme descrevemos nos Captulos 1 e 2, a
criao de componentes com o Framework .NET ficou muito mais fcil. Mais do que a criao, a distribuio e
utilizao destes componentes ficou extremamente simplificada. No existe mais a necessidade de registrar um
determinado componente como acontece com os componentes COM/COM+.
Outra novidade importante a possibilidade de diferentes verses de um componente executarem em um mesmo
servidor. possvel, inclusive, a execuo simultnea de diferentes verses de um mesmo componente, o que
conhecido por execuo syde by syde. Ao facilitar a criao e utilizao de componentes, o Framework .NET
incentiva a reutilizao de cdigo.
Compatibilidade com Qualquer Navegador
O resultado da execuo de uma pgina ASP.NET cdigo HTML retornado para o cliente. Qualquer navegador
capaz de interpretar corretamente HTML, em tese. Na prtica o que acontece que existem pequenas diferenas e at
mesmo inconsistncias entre a maneira como o cdigo HTML interpretado. Para minimizar este problema, o
ASP.NET conta com os controles que rodam no servidor e so capazes de fornecer diferentes sadas, dependendo do
navegador que fez a solicitao da pgina. Na prtica isto significa que um controle da interface de uma pgina
ASP.NET, que roda no servidor, capaz de gerar diferentes sadas, dependendo do navegador do cliente. Esta
caracterstica conhecida por AUI Adaptative User Interface.
Check List Para Acompanhar os Exemplos Deste Livro
Na Introduo deste livro descrevi as caractersticas do computador que estou utilizando. A seguir, repito estas
informaes.
Para criar os exemplos deste livro, utilizei um servidor com as seguintes configuraes:
Pentium 450
256 MB RAM
Windows 2000 Server em Portugus
IIS 5.0
Microsoft .NET Framework SDK
Nome do servidor: Servidor
Endereo IP: 10.204.123.1
208 www.juliobattisti.com.br
ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB
Mscara de sub-rede: 255.255.255.0
Domnio DNS: groza.com
Pasta padro: D:\Inetpub\wwwroot
O Framework .NET est disponvel para vrias verses do Windows. ASP.NET suportado no Windows 2000 e no
Windows NT 4 com Service Pack 6a. A utilizao de Web Services suportada em todas as plataformas suportadas
pelo Microsoft .NET Framework SDK, com exceo do Windows 95.
O endereo para acessar a pgina inicial do servidor o seguinte: http://www.groza.com ou http://localhost. Sempre
que for feita referncia a um destes dois endereos, voc deve substituir pelo endereo do equipamento que voc est
utilizando para acompanhar os exemplos deste livro.
Ao instalarmos o IIS criada uma pasta conhecida por Home Directory. O Home Directory a pasta padro que
acessada quando digitamos o endereo do servidor IIS, como por exemplo: http://localhost. Dentro da pasta padro
podemos definir um documento padro, como por exemplo index.asp. Com isso ao acessar o servidor http://localhost,
a pgina padro (index.asp) do diretrio padro ser automaticamente carregada. O diretrio padro criado na pasta
\Inetpub\wwwroot do drive onde o Windows 2000 est instalado. Ao instalar o IIS o usurio pode alterar a localizao
da pasta padro. No computador que estou utilizando, o Windows 2000 Server est instalado em D:\Win2k. Por isso o
Home Directory do servidor est em D:\Inetpub\wwwroot.
Dentro da pasta wwwroot irei criar uma pasta para cada captulo, conforme indicado na Tabela 6.1.
Tabela 6.1 Pastas criadas no Home Directory do servidor IIS
Captulo Pasta
Captulo6 D:\Inetpub\wwwroot\chap6
Captulo7 D:\Inetpub\wwwroot\chap7
Captulo8 D:\Inetpub\wwwroot\chap8
Captulo9 D:\Inetpub\wwwroot\chap9
Captulo10 D:\Inetpub\wwwroot\chap10
Captulo11 D:\Inetpub\wwwroot\chap11
Captulo12 D:\Inetpub\wwwroot\chap12
Captulo13 D:\Inetpub\wwwroot\chap13
Captulo14 D:\Inetpub\wwwroot\chap14
Captulo15 D:\Inetpub\wwwroot\chap15
Criarei os exemplos de cada captulo dentro da respectiva pasta. Por exemplo, ao criar o exemplo 1 deste captulo, vou
salv-lo na pasta D:\Inetpub\wwwroot\chap6, com o nome de chap6ex1.aspx. O exemplo 2 deste captulo ser salvo
como chap6ex2.aspx e assim por diante.
209
CAPTULO 6: UMA INTRODUO AO ASP.NET
www.juliobattisti.com.br
Um detalhe importante sobre o endereo para acessarmos e testarmos os exemplos de
cada captulo. Vamos considerar a pgina chap6ex1.aspx. Ao criarmos uma pasta, dentro
do Home Directory, a pasta passa a fazer parte do endereo. Ento, para acessarmos
uma pgina que est dentro da pasta chap6, precisamos adicionar chap6 ao endereo.
Por ltimo s adicionar o nome da pgina a ser acessada. Para acessar a pgina
chap6ex1.aspx, utilizaramos o seguinte endereo: http://localhost/chap6/chap6ex1.aspx.
Para acessarmos uma pgina chamada ex10chap13.aspx, gravada na pasta chap13,
utilizamos o seguinte endereo: http://localhost/chap13/ex10chap13.aspx.
Lembrando sempre que localhost uma referncia ao servidor local, ou seja, na prpria
mquina onde estamos trabalhando. Ao invs de localhost podemos utilizar o nome DNS completo da mquina, no
meu caso: http://www.groza.com.
Tambm cabe lembrar que, para que as pginas ASP.NET possam ser processadas,
necessrio que voc tenha instalado o Framework .NET conforme descrito na introduo,
no seguinte item:
Como obter e instalar o Microsoft .NET Framework SDK.
ASP e ASP.NET Podem Rodar no Mesmo Servidor?
Sim. importante salientar este ponto. Ao instalarmos o Framework .NET, estamos
habilitando o suporte a pginas ASP.NET, porm as pginas ASP tradicionais continuam
sendo processadas normalmente. Ou seja, continuamos tendo suporte ao cdigo ASP.
Desta maneira podemos migrar as aplicaes j desenvolvidas, aos poucos para ASP.NET.
Podemos inclusive fazer com que um formulrio de uma pgina ASP seja processado
por uma pgina ASP.NET e vice-versa, isto tudo no mesmo servidor.
Enfim Vamos Iniciar com ASP.NET
Vamos conhecer as principais caractersticas de uma pgina ASP.NET.
A Extenso do Arquivo Mudou .aspx
A primeira diferena que notamos na extenso dos arquivos. As pginas ASP, desde a verso inicial at a verso 3.0, tm
a extenso .asp. Esta extenso obrigatria, para que o IIS reconhea a pgina como uma pgina ASP e passe o
processamento para o interpretador ASP (ASP.DLL). J as pginas ASP.NET tm a extenso .aspx, a qual reconhecida
pelo IIS (aps a instalao do Framework .NET). O processamento da pgina ASP.NET passado para o controle do
Framework .NET. O servio responsvel pelo processamento das pginas ASP.NET est contido na DLL XSPISAPI.DLL.
NOTA: As pginas
ASP.NET tm a extenso
.aspx ao invs de .asp.
Falaremos mais sobre as
diferenas do ASP.NET em
relao ao ASP, no
prximo item.
IMPORTANTE: Se voc
estiver utilizando uma
configurao diferente
para testar os exemplos
deste livro, utilize as
configuraes do
equipamento que estiver
utilizando em substituio
s descritas neste item.
Por exemplo, sempre que
for solicitado acesso
http://www.groza.com,
substitua este endereo
pelo endereo que voc
estiver utilizando.
210 www.juliobattisti.com.br
ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB
Inserindo Cdigo ASP.NET
Para inserirmos cdigo em uma pgina ASP.NET utilizamos a tag <SCRIPT>, com o atributo RUNAT igual a
server. A linguagem padro para a criao de pginas ASP.NET o VB.NET. Observe bem que no o VBScript
e sim o Visual Basic NET VB.NET. No exemplo a seguir estamos definindo uma seo de cdigo, na qual
utilizaremos o VB.NET:
<script language=VB runat=server>
comando1
comando2
...
comandon
</script>
Na Listagem 6.2 colocamos a estrutura bsica de uma pgina ASP.NET, onde temos uma seo de cdigo e uma seo
com os elementos que formam a parte visual, ou de apresentao da pgina.
Listagem 6.2 A estrutura bsica de uma pgina ASP.NET.
<html>
<script language=VB runat=server>
comando1
comando2
...
comandon
</script>
<body>
controles e
demais
elementos
da interface
- Server controls
- Web Forms
- etc
</body>
</html>
Toda pgina ASP.NET tem esta estrutura. Uma parte inicial onde temos o cdigo, responsvel pela lgica da pgina.
Na seo de cdigo, como chamada, podemos colocar comandos para fazer a conexo com um banco de dados, para
realizar clculos, para responder a eventos que acontecem na pgina, como por exemplo um clique do usurio em um
211
CAPTULO 6: UMA INTRODUO AO ASP.NET
www.juliobattisti.com.br
boto, enfim, toda a lgica de programao necessria ao funcionamento da pgina. A seo de cdigo representada
pelo seguinte trecho.
<script language=VB runat=server>
comando1
comando2
...
comandon
</script>
Na segunda parte da pgina, a partir da tag <body>, colocamos os elementos de apresentao da interface. Nesta parte
podemos colocar desde cdigo HTML bsico, at controles mais avanados como os disponibilizados pelo ASP.NET.
Nos Captulos 7, 8 e 9 estaremos estudando os controles disponveis com o ASP.NET.
Tudo o que voc j conhece de HTML pode ser utilizado na seo de apresentao da pgina.
Se ao invs de utilizarmos o VB quisssemos utilizar a linguagem C#, teramos que definir a tag <script>, da seguinte maneira:
<script language=C# runat=server>
comando1
comando2
...
comandon
</script>
Observe que a estrutura de uma pgina ASP.NET deixa bem clara a separao entre
cdigo ASP.NET e cdigo de apresentao, bem diferente do que acontecia com o ASP
3.0 onde sees de cdigo ASP so intercaladas com sees de cdigo HTML.
A estrutura apresentada na Listagem 6.2 o que chamamos de Code Inline, ou seja, o
cdigo na prpria pgina ASP.NET, embora em uma seo de cdigo, separada da seo
de apresentao.
Outra maneira de procedermos a separao entre cdigo e apresentao atravs da
tcnica chamada de Code Behind. Com esta tcnica colocamos o cdigo em um arquivo
separado da pgina ASP.NET. Na pgina ASP.NET colocamos um comando para acessar o arquivo onde est o cdigo.
Para utilizar Code Behind utilizamos o seguinte comando:
<%@Page Inherits=nome_da_classe Src=Caminho para o arquivo com o cdigo %>
Por exemplo, vamos criar o cdigo utilizando a linguagem C# e salvar o cdigo em um arquivo chamado codex1.cs, na
mesma pasta onde est a pgina ex1.aspx. No incio da pgina ex1.aspx, devemos colocar o seguinte comando, para
termos acesso ao cdigo do arquivo codex1.cs:
NOTA: Nos exemplos
deste livro estaremos
utilizando o C#. Para uma
introduo linguagem
C# consulte os Captulos
3, 4 e 5.
212 www.juliobattisti.com.br
ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB
<%@Page Inherits=codex1 Src=codex1.cs %>
Esta deve ser a primeira linha da pgina, antes inclusive da tag <html>.
A utilizao de Code Behind facilita o reaproveitamento de cdigo. Vamos supor que estejamos criando uma srie de
pginas que acessam um banco de dados no SQL Server 2000. Podemos colocar o cdigo de acesso ao banco de dados
em um arquivo separado e utilizar a diretiva @Page para ter acesso a este cdigo em cada pgina onde o acesso ao
SQL Server 2000 for necessrio. Se por algum motivo a forma de acesso tiver que ser modificada, basta alterar o
arquivo com o cdigo e, pronto, as pginas que fazem uso deste arquivo passaro a acessar a verso atualizada. Se a
pgina j tiver sido acessada anteriormente e estiver no cache de pginas no servidor IIS, o Framework .NET detecta
que houve mudanas em um dos elementos da pgina. Na primeira vez que a pgina for solicitada aps as mudanas,
uma nova verso da pgina ser compilada e enviada para o usurio. A nova verso ser mantida no cache para
melhorar o desempenho. Se novas mudanas forem detectadas, o processo todo se repete.
Um Pequeno Exemplo, s Para Comear
Vamos apresentar alguns exemplos, para que voc possa ver o ASP.NET em funcionamento. Neste momento no
entrarei em maiores detalhes sobre o cdigo. Irei detalhar mais a estrutura, a disponibilizao e o acesso s pginas no
servidor IIS.
Exemplo 1
Vamos criar um exemplo bastante simples. A nossa pgina contm dois controles do tipo texto, onde o usurio pode
digitar informaes. A pgina tambm contm um boto de comando. Ao clicar no boto de comando, gerado o
evento Click do respectivo boto. Vamos utilizar este evento. No evento Click do boto de comando vamos verificar os
valores digitados nos campos usurio e senha e compar-los com valores previamente definidos, no prprio cdigo do
evento. Se os valores digitados forem iguais aos valores previamente definidos, emitimos uma mensagem: LOGON
EFETUADO COM SUCESSO !!!!; caso contrrio emitimos a mensgem LOGON FALHOU, TENTE
NOVAMENTE!!!.
Na Listagem 6.3 temos o cdigo para a criao da pgina proposta.
Listagem 6.3 O primeiro exemplo de pgina ASP.NET chap6ex1.aspx.
<html>
<script language=C# runat=server>
public void Botao_Click(Object sender,EventArgs e)
{
if (Nome.Value == user1 && Senha.Value == senha123)
{
Message.InnerHtml = LOGON EFETUADO COM SUCESSO !!!!;
213
CAPTULO 6: UMA INTRODUO AO ASP.NET
www.juliobattisti.com.br
}
else
{
Message.InnerHtml = LOGON FALHOU, TENTE NOVAMENTE !!!;
}
}
</script>
<body>
<form method=post runat=server>
<h3>Digite o nome:
<input id=Nome type=text size=40 runat=server>
<h3>Digite a senha:
<input id=Senha type=password size=40 runat=server>
<input type=submit value=Enter OnServerClick=Botao_Click
runat=server>
<h1>
<span id=Message runat=server> </span>
</h1>
</form>
</body>
</html>
Digite o cdigo da Listagem 6.3 e salve o mesmo em um arquivo chamado chap6ex1.aspx, na pasta chap6, dentro da
pasta wwwroot, conforme descrito anteriormente. Para acessar esta pgina utilize o seguinte endereo:
http://localhost/chap6/chap6ex1.aspx
Ao carregarmos esta pgina no Internet Explorer obtemos o resultado indicado na Figura 6.5.
Digite user1 para o nome e senha123 para a senha. D um clique no boto Enter. Voc receber uma mensagem
dizendo que o logon foi efetuado com sucesso. Agora digite jose para o nome e senha123 para a senha. D um clique
no boto Enter. Voc receber uma mensagem informando que o logon falhou e que voc deve tentar novamente,
conforme indicado na Figura 6.6.
Sem detalhar o cdigo vamos comentar os principais componentes do nosso exemplo.
214 www.juliobattisti.com.br
ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB
Criao da interface Para criarmos a interface da pgina utilizamos alguns controles HTML chamados de
Controles HTML do Servidor HTML Server Controls. Observe o atributo runat=server destes controles,
indicando que os mesmos so HTML Server Controls.
Figura 6.5: O primeiro exemplo chap6ex1.aspx.
Por padro, as tags HTML normais so tratadas como texto e no temos acesso s propriedades das mesmas, atravs
de cdigo. Com o uso de HTML Server Controls os controles HTML so tratados como elementos do servidor e
podemos ter acesso a estes controles atravs de programao. No exemplo da Listagem 6.2 estamos acessando a
propriedade Value dos controles Nome e Senha, para verificar os valores digitados pelo usurio. No teramos como
acessar estas propriedades, utilizando os controles HTML tradicionais.
Por exemplo, para acessar o valor digitado no controle Nome, acessamos a propriedade Value deste controle, utilizando
a seguinte sintaxe:
Nome.Value
Cdigo para responder a um evento.
A lgica do exemplo da Listagem 6.2 pode ser resumida da seguinte maneira:
Quando o usurio clica no boto Enter disparado o evento Click deste boto, o qual
dispara o cdigo contido no procedimento Botao_Click. Na prpria definio do controle
indicamos o nome do procedimento e do evento, conforme indicado a seguir:
<input type=submit value=Enter OnServerClick=Botao_Click
runat=server>
NOTA: Teremos um
captulo completo sobre
HTML Server Controls
Captulo 7.
215
CAPTULO 6: UMA INTRODUO AO ASP.NET
www.juliobattisti.com.br
Figura 6.6: Utilizando o primeiro exemplo chap6ex1.aspx.
O OnServerClick indica o evento Ao Clicar, o qual disparado quando o usurio clica
no boto. O valor atribudo propriedade OnServerClick, que no nosso exemplo foi
Botao_Click, define o nome do procedimento que ser executado em resposta ao evento.
Este evento pode estar na Seo de Cdigo da pgina, que o caso do nosso exemplo,
ou pode estar em uma classe herdada, caso estejamos utilizando Code Behind, conforme
descrito anteriormente.
A seo de cdigo Na seo de cdigo da pgina chap6ex1.asp, logo aps a
tag <html, temos o procedimento Botao_Click. Este procedimento est escrito
em linguagem C#, conforme definido pela tag <script> no incio da pgina:
<script language=C# runat=server>
No procedimento Botao_Click testamos os valores digitados pelo usurio nos campos
Nome (Nome.Value) e Senha (Senha.Value). Dependendo dos valores utilizados
retornamos uma ou outra mensagem. Observe que o cdigo no procedimento Botao_Click
cdigo C# padro. Temos um teste if, no qual so feitos dois testes ligados pelo operador
lgico AND (&&).
Em resumo acontece o seguinte:
1. A pgina chap6ex1.aspx carregada.
2. O usurio preenche os campos Nome e Senha e d um clique no boto Enter.
3. O evento Click do boto disparado.
4. Em resposta ao evento Click, o procedimento Botao_Click executado.
NOTA: Na prtica, se
estivssemos criando um
formulrio para logon, o
nosso evento Botao_Click
deveria fazer conexo
com um banco de dados
ou com o Active Directory
do Windows 2000, para
verificar as credenciais
fornecidas. Se o nome de
usurio e senha estiver
correto, o acesso
liberado; caso contrrio
uma mensagem de erro
retornada para o usurio.
Embora sem utilidade
prtica, o exemplo
chap6ex1.aspx serve,
didaticamente, para
216 www.juliobattisti.com.br
ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB
5. Dependendo dos valores digitados pelo usurio, uma ou outra mensagem ser retornada.
Agora que apresentamos um exemplo bastante simples, apenas para comearmos com o ASP.NET, vamos ver um
exemplo que faz conexo com um banco de dados do SQL Server 2000.
Banco de Dados do SQL Server 2000 Para os Exemplos Deste Livro
Ao instalarmos o Framework .NET instalada uma miniverso do SQL Server 2000, na qual esto disponveis diversos
bancos de dados de exemplo. Se voc j tiver o SQL Server 2000 instalado, as suas configuraes sero mantidas.
Para os exemplos deste livro estaremos utilizando os seguintes bancos de dados:
pubs
Northwind
Esta miniverso do SQL Server se instala como uma instncia chamada NETSDK. Para
fazer referncia a esta instncia do SQL Server, onde esto os bancos que utilizaremos
nos exemplos deste livro, precisamos utilizar o nome do servidor e o nome da instncia.
Por exemplo, estou trabalhando em um computador cujo nome SERVIDOR. Para fazer
referncia instncia NETSDK utilizo a seguinte nomenclatura:
SERVIDOR\NETSDK
Se o computador que voc est utilizando tem o nome SERVNET, para fazer referncia
a instncia NETSDK voc deve utilizar a seguinte nomenclatura:
SERVNET\NETSDK
O Segundo Exemplo Conectando com um Banco de Dados
O nosso segundo exemplo um pouco mais complexo do que o exemplo anterior. Vamos apresentar uma
pgina ASP.NET que faz conexo com um banco de dados do SQL Server e exibe todos os registros de uma
determinada tabela.
A primeira diferena que voc ir notar em relao ao ASP 3.0 que no temos mais o objeto Recordset, o qual
bastante utilizado com o ASP 3.0, para conexes de pginas com bancos de dados.
Na Listagem 6.4 temos o cdigo para a criao da pgina proposta.
Listagem 6.4 O segundo exemplo: conectando com o banco de dados pubs
chap6ex2.aspx.
<%@ Import Namespace=System.Data %>
<%@ Import Namespace=System.Data.SqlClient %>
<html>
NOTA: Para um curso
completo de SQL Server
2000 consulte o livro:
SQL SERVER 2000
Administrao &
Desenvolvimento Curso
Completo, de minha
autoria, publicado pela
editora Axcel Books
(www.axcel.com.br).
NOTA: A partir do
Captulo 10 estaremos
tratando em detalhes da
conexo de pginas
ASP.NET com banco de
dados.
217
CAPTULO 6: UMA INTRODUO AO ASP.NET
www.juliobattisti.com.br
<script language=C# runat=server>
protected void Page_Load(Object Src, EventArgs E )
{
// Crio uma conexo com o banco de dados pubs localizado no servidor local.
// Vamos acessar a instncia SERVIDOR\NETSDK.
SqlConnection myConnection = new SqlConnection(server=SERVIDOR\\NETSDK; +
uid=sa;pwd=;database=pubs);
// Conectamos com o banco de dados utilizando um comando SQL,
// o qual retorna todos os dados da tabela Authors, do banco de
// dados pubs.
SqlDataAdapter myCommand = new SqlDataAdapter(SELECT +
* FROM Authors, myConnection);
// Criamos e preenchemos um objeto DataSet.
// Observe que no temos mais o objeto Recordset,
// como era de praxe com o ASP 3.0.
DataSet ds = new DataSet();
myCommand.Fill(ds);
// Conectamos um controle DataGrid com o DataSet criado anteriormente.
// MyDataGrid o id (nome) de um controle do tipo
// DataGrid que est na seo de apresentao da pgina.
DataView source = new DataView(ds.Tables[0]);
MyDataGrid.DataSource = source ;
MyDataGrid.DataBind();
}
</script>
<body>
<% Exibe as informaes do DataGrid no corpo da pgina. %>
<h3><font face=Verdana>Registros da tabela Authors!</font></h3>
<% Os registros da tabela Authors so exibidos no DataGrid. %>
218 www.juliobattisti.com.br
ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB
<ASP:DataGrid id=MyDataGrid runat=server
Width=700"
BackColor=#ccccff
BorderColor=black
ShowFooter=false
CellPadding=3
CellSpacing=0"
Font-Name=Verdana
Font-Size=8pt
HeaderStyle-BackColor=#aaaadd
MaintainState=false
/>
</body>
</html>
Figura 6.7: Os registros da tabela Authors chap6ex2.aspx.
219
CAPTULO 6: UMA INTRODUO AO ASP.NET
www.juliobattisti.com.br
Digite o cdigo da Listagem 6.4 e salve o mesmo em um arquivo chamado chap6ex2.aspx, na pasta chap6, dentro da
pasta wwwroot, conforme descrito anteriormente. Para acessar esta pgina utilize o seguinte endereo: http://localhost/
chap6/chap6ex2.aspx
Ao carregarmos esta pgina no Internet Explorer obtemos o resultado indicado na Figura 6.7
Alguns comentrios sobre o exemplo chap6ex2.aspx, sem entrar em maiores detalhes sobre o cdigo do exemplo.
Cad o meu Objeto Recordset?
Nada de objetos do tipo Recordset. Com ASP.NET utilizamos ADO.NET para fazer a conexo com banco de dados. O
ADO.NET utiliza o objeto Dataset ao invs do objeto Recordset. Para a conexo com bancos de dados utilizamos uma
srie de classes do namespace System.Data, o qual faz parte do .NET Framework Class Library.
Para ter acesso s classes de um determinado namespace, precisamos adicionar uma referncia ao mesmo, no incio da
pgina ASP.NET, utilizando a diretiva Import, conforme indicado no trecho de cdigo a seguir:
<%@ Import Namespace=System.Data %>
<%@ Import Namespace=System.Data.SqlClient %>
Observe que estamos fazendo referncia a dois namespaces: System.Data e System.Data.SqlCliente. Vamos tratar
exaustivamente dos membros destes namespaces nos captulos 10 e 11.
Conectando com o Banco de Dados
Na seo de cdigo da pgina temos os comandos para conexo com o banco de dados pubs da instncia
SERVIDOR\NETSDK. Um detalhe importante a maneira como informamos o nome da instncia, conforme indicado
pelo trecho de cdigo a seguir:
SqlConnection myConnection = new SqlConnection(server=SERVIDOR\\NETSDK; +
uid=sa;pwd=;database=pubs);
Observe que utilizamos duas barras invertidas ao invs de uma nica barra. Isto necessrio porque a barra invertida
considerada um caractere de escape com significado especial para a linguagem C#. Quando, ao invs do caractere de
escape, queremos que o C# entenda o mesmo como um caractere normal, temos que preced-lo de uma barra invertida.
Na prtica as duas barras invertidas so interpretadas, pelo C#, como uma nica barra, o que produz o resultado
desejado: SERVIDOR\NETSDK.
Neste exemplo utilizamos as seguintes classes do namespace System.Data.SqlClient:
SqlConnection
SqlDataAdapter
Tambm utilizamos as seguintes classes do namespace System.Data:
220 www.juliobattisti.com.br
ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB
DataSet
DataView
Um Controle Poderoso Para Exibir os Dados
Na seo de apresentao utilizamos o controle DataGrid para fazer a exibio dos registros da tabela Authors.
Observe o quo poderoso este controle. Simplesmente atravs da configurao da sua propriedade DataSource,
na seo de cdigo, definimos os registros a serem exibidos pelo controle. Esta definio feita nas seguintes
linhas de cdigo:
MyDataGrid.DataSource = source ;
MyDataGrid.DataBind();
Veja que no precisamos utilizar um lao While para percorrer todos os registros da tabela Authors, como tnhamos
que fazer com o objeto RecordSet.
O controle DataGrid faz parte dos chamados Web Server Controls. No Captulo 8 aprenderemos a utilizar os diversos
Web Server Controls disponveis.
Posso Ter um Comando que Ultrapassa uma Linha?
A resposta um sonoro Sim.
Diferente do ASP 3.0, em nossas pginas ASP.NET, os comandos da seo de cdigo podem estar em mais do que uma
linha, sem problemas. Inclusive na Listagem 6.3 temos comandos que ultrapassam uma linha e a pgina carrega sem
maiores problemas, conforme exemplificado no trecho a seguir:
SqlDataAdapter myCommand = new SqlDataAdapter(SELECT +
* FROM Authors, myConnection);
Isso possvel pois cada comando do C# finalizado com um ponto-e-vrgula (;).
O Bom e Velho SQL Continua o Mesmo?
A resposta outro sonoro Sim.
Voc deve ter observado que utilizamos um comando SQL para retornar os dados da tabela authors. Utilizamos um
comando SELECT, conforme indicado a seguir:
SqlConnection myConnection = new SqlConnection(server=SERVIDOR\\NETSDK; +
uid=sa;pwd=;database=pubs);
Vamos alterar o comando SQL para introduzir uma condio. Queremos que sejam retornados somente os registros
para os autores em que a cidade (city) Oakland. Para isso basta que seja utilizada uma clusula where para especificar
a condio city=Oakland, conforme indicado a seguir:
221
CAPTULO 6: UMA INTRODUO AO ASP.NET
www.juliobattisti.com.br
SqlDataAdapter myCommand = new SqlDataAdapter(SELECT +
* FROM Authors where city=Oakland, myConnection);
Faa esta alterao na pgina chap6ex2.aspx e salve a nova verso da pgina na pasta chap6, com o nome de
chap6ex3.aspx. Ao carregar esta nova verso, obteremos o resultado indicado na Figura 6.8.
Figura 6.8: Definindo um critrio com a clusula where chap6ex3.aspx.
Concluso
Neste captulo apresentamos o ASP.NET.
Iniciamos o captulo justificando o porqu de mais uma verso para a tecnologia ASP
Active Server Pages. Vimos que ASP.NET no apenas mais uma verso, mas sim uma
mudana de paradigma, uma vez que com ASP.NET temos acesso a todas as vantagens
do Framework .NET. Dentre as principais vantagens do ASP.NET, destacamos:
O Framework .NET.
Suporte a mltiplas linguagens.
O programador precisa escrever menos cdigo.
Separao entre o cdigo HTML e o cdigo ASP.NET.
Maior facilidade na criao e utilizao de componentes, o que facilita a
reutilizao de cdigo.
Um conjunto de controles avanados:
1. HTML Server Controls.
2. Web Server Controls.
3. Validation Server Controls.
NOTA: No Anexo III
apresento uma reviso
dos conceitos bsicos da
linguagem SQL Struc-
tured Query Language.
Antes de estudar os
captulos 10 e 11 seria
interessante dar uma
olhada no Anexo II O
modelo de dados
relacionais, e no Anexo III
Fundamentos da
linguagem SQL.
222 www.juliobattisti.com.br
ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB
Em seguida fizemos um Check List para verificar se o computador que voc est utilizando est apto a rodar pginas
ASP.NET. Tambm falamos sobre o Home Directory do servidor IIS e como acessar pginas gravadas em subpastas
do Home Directory.
Na seqncia apresentamos a estrutura bsica de uma pgina ASP.NET. Tambm aprendemos a definir uma seo de
cdigo atravs da tag <script>.
Para finalizar o captulo apresentamos dois exemplos, sem detalhar o cdigo dos exemplos. No primeiro exemplo
apresentamos alguns HTML Server Controls. No segundo exemplo utilizamos algumas classes do Framework .NET,
mais especificamente dos namespaces System.Data e System.Data.SqlCliente, para fazer acessar os dados do banco
de dados pubs do SQL Server 2000.
No prximo captulo estudaremos os HTML Server Controls disponveis. Veremos um a um, todos os controles
disponveis, bem como as propriedades de cada um. Tambm apresentaremos alguns exemplos prticos para ilustrar o
uso dos HTML Server Controls.
223
CAPTULO 7: HTML SERVER CONTROLS
www.juliobattisti.com.br
Introduo
Uma das inovaes mais bem-vindas do ASP.NET a disponibilizao de uma
srie de controles mais poderosos, flexveis e inteligentes. Com ASP.NET
temos acesso a diversos controles que permitem a criao de pginas com uma
aparncia grfica mais parecida com os programas tradicionais do Windows, alm
de termos acesso a um rico modelo de eventos, o que j estava disponvel em
aplicaes tradicionais do Windows, a um bom tempo.
Com as verses anteriores, criar pginas com uma aparncia grfica mais elaborada
no era tarefa das mais fceis. Para alcanar uma aparncia mais profissional,
tnhamos que lanar mo de uma srie de tecnologias diferentes, o que era bastante
trabalhoso. Com o ASP.NET temos uma srie de elementos, conhecidos como
controles de servidor, que nos ajudam na tarefa de criar pginas com uma aparncia
mais profissional, e que so exibidas da mesma maneira nos diferentes
navegadores.
Com as tags HTML tradicionais, o que temos so elementos estticos em uma
pgina. Em outras palavras, uma tag do tipo HTML <INPUT>, colocada em um
formulrio HTML tradicional, utilizada para que o usurio faa uma entrada de
texto, um elemento esttico. No existem eventos para este campo e no temos
como acessar as propriedades do campo atravs de programao. Com o modelo
de pgina das verses anteriores do ASP, tnhamos algumas limitaes. O exemplo
de limitao mais tpico que tnhamos na criao de pginas ASP era a situao
na qual precisvamos que a pgina fosse recarregada em perodos determinados.
Por exemplo, uma pgina que fornece informaes sobre cotaes de aes precisa
ser atualizada de minuto em minuto. Para atualizar a pgina, o usurio precisava
utilizar o comando de atualizao do seu Browser. J com ASP.NET e o modelo
baseado em eventos podemos fazer com que seja disparado um evento, por
exemplo, de minuto em minuto. No cdigo do evento podemos inserir os comandos
necessrios para que a pgina seja recarregada, automaticamente, com a verso
mais atualizada, de minuto em minuto.
Com a utilizao dos controles de servidor (Server Controls) temos uma mudana
na maneira como criamos nossas pginas. O novo modelo utiliza a programao
baseada em eventos. Aes que acontecem em um ou mais controles da pgina
podem ser detectadas pelo servidor e uma ao pode ser tomada em resposta ao
evento. Conforme voc j deve ter notado, o tradicional modelo de programao
baseado em eventos, s que agora trazido para o mundo do desenvolvimento de
aplicaes e pginas Web.
Existem diversos tipos de controles de servidor, dentre os quais podemos destacar
os seguintes tipos:
C A P T U L O
7
HTML Server Controls
224 www.juliobattisti.com.br
ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB
HTML Server Controls.
Validation Server Controls.
Web Server Controls.
Neste captulo vamos estudar os HTML Server Controls. Vamos apresentar os controles existentes, bem como as
diversas propriedades de cada controle. Tambm vamos apresentar uma srie de pginas que ilustram a utilizao
destes controles.
Antes de iniciarmos com a apresentao dos controles, veremos o que mudou na maneira como uma pgina carregada
no servidor e disponibilizada para o usurio. Veremos que o modelo das pginas mudou significativamente no ASP.NET,
em relao s verses anteriores. Tambm falaremos sobre o cache automtico de pginas no servidor.
Uma Classe Chamada Page
A classe Page faz parte do namespace System.Web.UI. Este namespace possui uma srie de classes e interfaces, as
quais permitem a criao de controles e pginas, os quais formam a interface com o usurio em nossas aplicaes
Web. Temos, por exemplo, uma classe chamada Control, a qual disponibiliza todos os controles que podem ser utilizados
em pginas ASP.NET. Tambm existe um controle chamado Page, o qual automaticamente criado toda vez que
feita a requisio de uma pgina ASP.NET. Fazer a requisio significa acessar a pgina. Tambm esto disponveis
classes que nos possibilitam a ligao de dados com controles de um formulrio e a manuteno de estado entre
diferentes requisies mesma pgina.
Eventos ao Carregar uma Pgina ASP.NET
Quando acessamos uma pgina .aspx, como por exemplo: http://www.microsoft.com/net/default.aspx, uma srie de eventos
disparada. semelhante ao carregamento de uma aplicao Windows tradicional. Ao carregarmos uma aplicao
Windows desenvolvida, por exemplo, em Visual Basic, so disparados diversos eventos. Por exemplo, ao carregar o
formulrio principal da aplicao, disparado o evento OnLoad; ao exibir o formulrio na tela disparado o evento
OnActivate e assim por diante. Ao carregarmos uma pgina .aspx so disparados, em seqncia, os seguintes eventos:
Page_Init: Disparado quando a pgina inicializada.
Page_Load: Disparado quando a pgina carregada.
Contorl Event: disparado se um evento associado com um controle da pgina faz com que a mesma tenha
que ser recarregada.
Page_Unload: Disparado quando a pgina retirada da memria.
A diferena bsica entre os eventos Page_Init e Page_Load em relao aos controles da pgina. Quando o evento
Page_Init dispara, os controles da pgina ainda esto com seus valores padro, pois o estado dos mesmos, caso tenham
sido alterados, ainda no foi carregado. J quando dispara o evento Page_Load, os controles esto com seus estados
atualizados, sendo que j temos acesso aos reais valores de cada controle.
225
CAPTULO 7: HTML SERVER CONTROLS
www.juliobattisti.com.br
Esta seqncia de eventos refora a idia de que o modelo de programao baseado em eventos foi transportado para
o mundo das aplicaes Web, pelo ASP.NET.
A Classe Page
Toda pgina .aspx acessada a partir de um servidor onde est instalado o Framework .NET, quer a pgina contenha
cdigo ASP.NET ou somente cdigo HTML, compilada e criado um objeto do tipo Page, o qual fica armazenado
no cache de memria do servidor. Em outras palavras, ao acessarmos uma pgina .aspx, a mesma compilada, sendo
gerada uma instncia da classe Page, sendo esta instncia armazenada no cache do servidor para melhorar a velocidade
de acesso pgina. Qualquer alterao na pgina , automaticamente, detectada pelo Framework .NET, a nova verso
compilada e armazenada no cache de memria do servidor, em substituio verso anterior.
Na classe Page esto definidos as propriedades, mtodos e eventos comuns a todas as pginas processadas pelo
Runtime do ASP.NET. A classe Page funciona como um Conteiner para todos os componentes que fazem parte da
pgina. Como analogia, nas aplicaes Windows, temos a figura do Formulrio (Form), o qual um Container para
todos os elementos da aplicao.
Os Eventos da Classe Page
Na Tabela 7.1 temos a descrio dos eventos da classe Page.
Tabela 7.1 Eventos da classe Page.
Evento Descrio
AbortTransaction Ocorre quando uma transao cancelada.
CommitTransaction Ocorre quando uma transao finalizada com sucesso.
DataBinding Ocorre quando um controle de servidor (Server Control) vinculado a uma fonte de dados.
Error Ocorre quando detectada uma exceo que no foi tratada.
Init Ocorre quando a pgina inicializada.
Load Ocorre quando a pgina carregada e todos os seus controles tiverem sido carregados.
PreRender Ocorre antes que qualquer informao seja enviada para o navegador do cliente.
Unload Ocorre quando o processamento da pgina finalizado. Isto ocorre aps todas as
informaes terem sido enviadas para o navegador do cliente.
Vamos a um exemplo no qual utilizamos o evento Load da pgina, para emitir uma mensagem.
Na Listagem 7.1 temos um exemplo de pgina, onde definimos o valor de um controle da pgina controle Mensagem,
durante o evento Load da pgina.
226 www.juliobattisti.com.br
ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB
Listagem 7.1 Utilizando o evento Load chap7ex1.aspx.
<html>
<script language=C# runat=server>
void Page_Load(Object Src, EventArgs E)
{
Mensagem.Value = ltimo acesso em: + DateTime.Now;
}
</script>
<body>
<input id=Mensagem type=text size=60 runat=server>
</body>
</html>
Digite o cdigo da Listagem 7.1 e salve o mesmo em um arquivo chamado chap7ex1.aspx, na pasta chap7, dentro da
pasta wwwroot, conforme descrito anteriormente. Para acessar esta pgina utilize o seguinte endereo: http://localhost/
chap7/chap7ex1.aspx
Ao carregarmos esta pgina no Internet Explorer obtemos o resultado indicado na Figura 7.1.
Figura 7.1: O evento Load da pgina chap7ex1.aspx.
Em primeiro lugar quero reforar o fato de termos disposio um modelo de programao baseado em eventos, o que
para o ambiente Web um avano significativo em relao s verses anteriores.
227
CAPTULO 7: HTML SERVER CONTROLS
www.juliobattisti.com.br
O segundo detalhe para o qual gostaria de chamar a ateno a utilizao de um controle de servidor. Mais
especificamente, utilizamos um HTML Server Control, para exibir a mensagem definida no evento Load da pgina.
Utilizamos o controle Input, conforme indicado no trecho de cdigo a seguir:
<input id=Mensagem type=text size=60 runat=server>
Observe a propriedade runat=server definindo que este um controle de servidor e que, portanto, temos acesso s
suas propriedades atravs do cdigo da pgina. Foi exatamente isto que fizemos no evento Load, quando definimos o
valor da propriedade Load do evento Mensagem, conforme indicado a seguir:
void Page_Load(Object Src, EventArgs E)
{
Mensagem.Value = ltimo acesso em: + DateTime.Now;
}
Podemos utilizar os eventos da classe Page, para uma srie de funes, tais como:
Cdigo para conexo com banco de dados.
Cdigo para verificao das permisses de acesso.
Cdigo para configurao dos controles da pgina.
As Propriedades da Classe Page
Na Tabela 7.2 temos a descrio das propriedades da classe Page.
Tabela 7.2 Propriedades da classe Page.
Propriedade Descrio
Application Faz referncia a um objeto do tipo Application. Um nico objeto do tipo Application
criado para cada aplicao Web. A instncia do objeto Application compartilhada por
todos os clientes que acessam pginas da aplicao Web.
Cache Retorna uma referncia a um objeto do tipo Cache, o qual pode ser utilizado para
armazenar dados que so utilizados nas prximas solicitaes da pgina. O objeto cache
utiliza campos do tipo oculto para manter o estado dos elementos de uma pgina entre
uma chamada e outra da pgina.
ClientTarget Esta propriedade permite alterar a deteco automtica do Browser do cliente, que feita
pelo Framework .NET, e especificar o Browser que deve ser considerado para a montagem
da pgina de retorno para o usurio.
EnableViewState um valor Boleano (True ou False). O valor desta propriedade indica se os controles da
pgina devem ou no manter o seu estado entre uma chamada e outra da pgina. Esta
propriedade afeta todos os controles da pgina. Por padro definida em True.
228 www.juliobattisti.com.br
ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB
Propriedade Descrio
ErrorPage Pode ser utilizada para retornar ou definir a pgina que deve ser carregada, caso seja
detectada uma exceo no tratada.
IsPostBack um valor Boleano. Se for verdadeiro (True), indica que a pgina est sendo recarregada
pelo usurio, o que conhecido como um round-trip (ida e volta). Quando for False,
significa que a pgina est sendo carregada pela primeira vez e, conseqentemente, no
existem valores de estado armazenados no cache do servidor, para os controles da
pgina. Podemos utilizar esta propriedade para detectar se est sendo feita a carga inicial
da pgina e, em caso afirmativo, utilizar o evento Page_Load para definir os valores
iniciais, para os controles da pgina.
IsValid Com o ASP.NET temos os chamados Validation Controls. Estes controles so capazes de
fazer a validao dos dados digitados em um formulrio. Se a validao de todos os
controles ocorrer com sucesso, a propriedade IsValid definida como True; caso contrrio,
a propriedade ser definida como False. Se a pgina no tiver nenhum controle de
validao, a propriedade retornar True.
Request Permite que tenhamos acesso aos dados enviados com a requisio HTTP da pgina. Esta
propriedade retorna uma referncia ao objeto Request. Estudaremos este objeto em
detalhes, ainda neste captulo.
Response Permite que tenhamos acesso aos dados enviados com HTTP response da pgina. Esta
propriedade retorna uma referncia ao objeto Response. Um Response est, geralmente,
associado com um formulrio. Estudaremos este objeto em detalhes, ainda neste captulo.
Server Retorna uma referncia ao objeto Server.
Session Retorna uma referncia ao objeto Session.
TraceEnabled uma propriedade Boleana. Retorna True se o Trace para a pgina estiver habilitado e
False, em caso contrrio. O objeto Trace utilizado para depurao de pginas.
Trace Retorna uma referncia ao objeto Trace, caso o mesmo tenha sido habilitado.
User Obtm informaes a respeito do usurio que est fazendo a requisio da pgina.
Validators Retorna uma coleo que contm todos os controles de validao da pgina.
Vamos a um exemplo no qual exibimos o valor de diversas propriedades da classe Page.
Na Listagem 7.2 temos um exemplo de pgina, onde so exibidos os valores de diversas propriedades da classe page.
Listagem 7.2 Propriedades da classe Page chap7ex2.aspx.
<%@ Import Namespace=System %>
<html>
<script language=C# runat=server>
229
CAPTULO 7: HTML SERVER CONTROLS
www.juliobattisti.com.br
void Page_Load(Object Src, EventArgs E)
{
PrApplication.Value = Convert.ToString(Page.Application);
PrCache.Value = Convert.ToString(Page.Cache);
PrClientTarget.Value = Convert.ToString(Page.ClientTarget);
PrEnableViewState.Value = Convert.ToString(Page.EnableViewState);
Page.ErrorPage = http://localhost/erros/erro.aspx;
PrErrorPage.Value = Convert.ToString(Page.ErrorPage);
PrIsPostBack.Value = Convert.ToString(Page.IsPostBack);
PrIsValid.Value = Convert.ToString(Page.IsValid);
PrRequest.Value = Convert.ToString(Page.Request);
PrResponse.Value = Convert.ToString(Page.Response);
PrServer.Value = Convert.ToString(Page.Server);
PrSession.Value = Convert.ToString(Page.Session);
PrTrace.Value = Convert.ToString(Page.Trace);
PrUser.Value = Convert.ToString(Page.User);
}
</script>
<body>
<H1>Propriedades da classe Page !!! </H1>
<TABLE>
<TR>
<TD>
<B>Propriedade</B>
</TD>
<TD>
<B>Valor retornado.</B>
</TD>
</TR>
<TR>
<TD>
<B>Application: </B>
230 www.juliobattisti.com.br
ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB
</TD>
<TD>
<input id=PrApplication type=text size=60 runat=server>
</TD>
</TR>
<TR>
<TD>
<B>Cache: </B>
</TD>
<TD>
<input id=PrCache type=text size=60 runat=server>
</TD>
</TR>
<TR>
<TD>
<B>ClientTarget: </B>
</TD>
<TD>
<input id=PrClientTarget type=text size=60 runat=server>
</TD>
</TR>
<TR>
<TD>
<B>EnableViewState: </B>
</TD>
<TD>
<input id=PrEnableViewState type=text size=60 runat=server>
</TD>
</TR>
<TR>
<TD>
<B>ErrorPage: </B>
</TD>
231
CAPTULO 7: HTML SERVER CONTROLS
www.juliobattisti.com.br
<TD>
<input id=PrErrorPage type=text size=60 runat=server>
</TD>
</TR>
<TR>
<TD>
<B>IsPostBack: </B>
</TD>
<TD>
<input id=PrIsPostBack type=text size=60 runat=server>
</TD>
</TR>
<TR>
<TD>
<B>IsValid: </B>
</TD>
<TD>
<input id=PrIsValid type=text size=60 runat=server>
</TD>
</TR>
<TR>
<TD>
<B>Request: </B>
</TD>
<TD>
<input id=PrRequest type=text size=60 runat=server>
</TD>
</TR>
<TR>
<TD>
<B>Response: </B>
</TD>
<TD>
<input id=PrResponse type=text size=60 runat=server>
232 www.juliobattisti.com.br
ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB
</TD>
</TR>
<TR>
<TD>
<B>Server: </B>
</TD>
<TD>
<input id=PrServer type=text size=60 runat=server>
</TD>
</TR>
<TR>
<TD>
<B>Session: </B>
</TD>
<TD>
<input id=PrSession type=text size=60 runat=server>
</TD>
</TR>
<TR>
<TD>
<B>Trace: </B>
</TD>
<TD>
<input id=PrTrace type=text size=60 runat=server>
</TD>
</TR>
<TR>
<TD>
<B>User: </B>
</TD>
<TD>
<input id=PrUser type=text size=60 runat=server>
233
CAPTULO 7: HTML SERVER CONTROLS
www.juliobattisti.com.br
</TD>
</TR>
</TABLE>
</body>
</html>
Digite o cdigo da Listagem 7.2 e salve o mesmo em um arquivo chamado chap7ex2.aspx, na subpasta chap7, dentro
da pasta wwwroot, conforme descrito anteriormente. Para acessar esta pgina utilize o seguinte endereo: http://
localhost/chap7/chap7ex2.aspx
Ao carregarmos esta pgina no Internet Explorer obtemos o resultado indicado na Figura 7.2.
Figura 7.2: Propriedades da classe Page chap7ex2.aspx.
Alguns comentrios sobre o exemplo.
234 www.juliobattisti.com.br
ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB
No incio da pgina utilizamos uma diretiva Import:
<%@ Import Namespace=System %>
Utilizamos esta diretiva para termos acesso classe Convert, do namespace System. Utilizamos o mtodo ToString da
classe Convert Convert.ToString, para converter os valores retornados pelas propriedades da classe Page, em valores
de texto, e atribuir os valores de texto para controles do tipo input na seo de apresentao da pgina.
Na seo de cdigo acessamos os valores para as propriedades da classe page. Por exemplo, para a propriedade
Application, utilizamos o seguinte cdigo:
PrApplication.Value = Convert.ToString(Page.Application);
Page.Application retorna o valor da propriedade Application. O valor retornado convertido para String pelo mtodo
Convert.ToString. O valor j convertido para String atribudo propriedade Value do controle PrApplication, na
seo de apresentao da pgina. O resultado prtico disso tudo que o valor da propriedade Application ser exibido
no controle PrApplication, na seo de apresentao.
Na seo de apresentao utilizamos uma tabela para exibir os controles melhor alinhados. Para isso utilizamos as tags
do HTML para construo de tabelas:
<TABLE> </TABLE> para a criao da tabela.
<TR> </TR> para a criao de uma nova linha.
<TD> </TD> para a criao de uma nova clula em cada linha.
Para acessar as propriedades do objeto page, utilizamos a sintaxe padro para acesso aos
componentes de um objeto:
nome_do_objeto.nome_componente
Por exemplo, para acessar a propriedade Cache, do objeto page, utilizamos a seguinte sintaxe:
Page.Cache.
Mtodos da Classe Page
Na Tabela 7.3 temos a descrio dos mtodos da classe Page.
NOTA: Para maiores
detalhes sobre os
comandos bsicos da
linguagem HTML consulte
o Anexo I.
IMPORTANTE: Quando uma pgina .aspx carregada, a mesma compilada como um objeto que uma instncia da classe
Page. Sendo um objeto, temos acesso a suas propriedades, mtodos e eventos.
235
CAPTULO 7: HTML SERVER CONTROLS
www.juliobattisti.com.br
Tabela 7.3 Mtodos da classe Page.
Mtodos Descrio
DataBind Executa uma operao de DataBind para todos os controles da pgina.
FindControl Permite que localizemos um determinado controle, na pgina.
MapPath Retorna o caminho fsico para um determinado diretrio virtual.
Validate Faz com que os controles de validao da pgina faam a validao de seus contedos.
O Processamento de uma Pgina ASP.NET
Vamos analisar mais alguns detalhes sobre a maneira como uma pgina ASP.NET processada no servidor e retornada
para o usurio.
Para acessar uma pgina, o usurio digita o endereo da pgina no seu navegador, como por exemplo: http://
www.juliobattisti.com.br/certificacao.aspx.
O navegador envia a requisio da pgina para o servidor IIS, atravs de uma requisio HTTP (HTTP Request). O
servidor localiza os dados solicitados, envia de volta para o usurio e fecha a conexo. Este aspecto bsico no mudou,
at porque faz parte da definio do protocolo HTTP, independente do contedo que est sendo carregado. Porm,
com ASP.NET, tivemos muitas melhorias em relao maneira como a pgina carregada e como as informaes so
mantidas entre uma requisio e outra.
Com o modelo atual, parte do processamento acontece no navegador do cliente e parte no servidor. Normalmente no
cliente so colocados os elementos visuais da pgina. No servidor so feitos os processamentos do cdigo de script da
pgina. Porm o processamento do tipo tudo de uma s vez, ou seja, o cliente envia a requisio, o servidor
processa todos os elementos da pgina, formata uma sada e retorna a sada formatada para o cliente. Para que possa
haver um novo processamento, uma nova requisio da pgina precisa ser feita.
Com ASP.NET temos uma mudana neste modelo, devido criao dos chamados Server Controls. Um controle do
tipo Server Control fornece elementos visuais para uma pgina ASP.NET, ao mesmo tempo que processado no
servidor. Estes controles tm, inclusive, um modelo de eventos que pode ser acessado via cdigo. Com isso temos
disponvel um modelo de desenvolvimento baseado em eventos, semelhante ao desenvolvimento de aplicaes Win-
dows tradicionais.
Outra mudana que possvel, graas aos Server Controls, em relao iterao entre a pgina e o servidor.
Como os Server Controls possuem eventos, podemos escrever cdigo para ser executado em resposta a estes eventos.
Este cdigo de eventos processado no servidor. Dentro de uma mesma requisio de pgina, podem ser disparados
diversos eventos, medida que o usurio vai trabalhando na pgina. Para cada evento, o cdigo respectivo, caso
exista, processado no servidor. Observem que o cliente fica indo e voltando do servidor, para processar o
cdigo associado a eventos. Cada ida e vinda equivale a uma requisio. Este processo de ida e vinda conhecido
como server round-trip.
236 www.juliobattisti.com.br
ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB
Para que um round-trip seja disparado, basta que o usurio realize alguma ao na pgina, ao esta que dispara um
evento. Por exemplo, clicar em um campo para entrada de texto, para provocar um evento Click do respectivo controle.
Manuteno de Estado Fundamental
Conforme descrevemos no item anterior, o processo de round-trip faz com que diversas requisies sejam enviadas
para uma mesma pgina .aspx. Se para cada requisio, toda a pgina tivesse que ser novamente processada, o
desempenho deixaria muito a desejar. Alm disso o protocolo HTTP stateless, ou seja, no mantida nenhuma
informao entre uma requisio e outra. Para resolver este problema e manter o estado entre requisies, o ASP.NET
utiliza um processo conhecido como ViewState, para manter todas as informaes da pgina entre uma requisio e
outra. O ViewState contm o estado (valores, propriedades, aparncia, etc.) para todos os controles de usurio de uma
pgina ASP.NET. A informao de estado armazenada na forma de pares de valores. O objeto responsvel pela
manuteno de estado derivado da classe System.Web.UI.StateBag. Todas as informaes de estado so armazenadas
como uma string, a qual enviada de volta para o cliente. O navegador do cliente recebe a string com a informao
sobre os controles e configura cada um com os mesmos valores que tinham no momento da requisio. A string com
as informaes de estado so retornadas na forma de um campo oculto, o qual, evidentemente, no exibido na
pgina. Podemos ver o contedo desta string, verificando o cdigo-fonte da pgina que retornada. Por exemplo, no
IE, podemos utilizar o comando Exibir -> Cdigo-fonte.
Conforme descrevemos anteriormente, o processo de ViewState habilitado por padro.
Se por algum motivo quisermos desabilitar este processo, podemos utilizar a propriedade
EnableViewState. Para desabilitar o mecanismo de ViewState utilize o seguinte comando
no incio da pgina:
<%@Page EnableViewState=false %>
Com o mecanismo de round-trip e ViewState, o ASP.NET traz para o mundo stateless do
protocolo HTTP um modelo capaz de fazer a manuteno de estado para aplicaes
Web. Este um grande avano, pois com as verses anteriores o programador era obrigado
a fazer verdadeiros malabarismos para conseguir uma manuteno de estado eficiente.
Com ASP.NET o prprio Framework .NET nos disponibiliza mecanismos eficientes para a manuteno de estado.
Esta mais uma das caractersticas que comprovam o objetivo do Framework .NET em oferecer o mximo de
funcionalidade, deixando para o desenvolvedor apenas o cdigo relacionado com a lgica e a apresentao da aplicao.
HTML Server Controls
Agora que j conhecemos um pouco mais sobre o processamento de pginas ASP.NET e sobre a classe page, estamos
prontos para comear a estudar os HTML Server Controls. Vamos iniciar o nosso estudo entendendo o que so HTML
Server Controls.
IMPORTANTE:Tambm
podemos desabilitar o
mecanismo de ViewState
em nvel de controle.
Veremos isso mais
adiante.
237
CAPTULO 7: HTML SERVER CONTROLS
www.juliobattisti.com.br
Uma Definio Para HTML Server Controls
Em primeiro lugar so controles de servidor, isto , so processados no servidor. Para definir um controle como sendo
de servidor, devemos definir a sua propriedade runat como sendo igual a server, conforme o exemplo a seguir:
<input id=Senha type=password size=40 runat=server>
A propriedade runat=server faz com que o controle seja compilado juntamente com a pgina e executado, no
servidor, cada vez que a pgina requisitada. Observe que esta forma de processamento demanda mais recursos do
servidor do que os controles HTML tradicionais.
Em segundo lugar os controles disponibilizam um modelo de programao baseado em eventos. Esta uma mudana
importante em relao s verses anteriores. Por exemplo, quando o usurio clica em um boto Enviar, os valores do
formulrio so enviados para o servidor e o evento Click do boto disparado. Podemos escrever o cdigo que executa
quando o evento disparado. Ns j fizemos uso desta tcnica no Exemplo da Listagem 6.1 chap6ex1.aspx.
Na seo de apresentao do exemplo citado, temos um controle do tipo Submit um boto de comando. Este controle
criado com a linha de cdigo a seguir:
<input type=submit value=Enter OnServerClick=Botao_Click runat=server>
Observe a propriedade OnServerClick=Botao_Click. Esta propriedade define o nome do procedimento que ser
executado, no servidor, em resposta ao evento Click do boto.
Na seo de cdigo da pgina criamos um procedimento chamado Botao_Click, o qual executado em resposta ao
evento Click do boto de comando, conforme indicado no cdigo a seguir:
<script language=C# runat=server>
public void Botao_Click(Object sender,EventArgs e)
{
if (Nome.Value == user1 && Senha.Value == senha123)
{
Message.InnerHtml = LOGON EFETUADO COM SUCESSO !!!!;
}
else
{
Message.InnerHtml = LOGON FALHOU, TENTE NOVAMENTE !!!;
}
}
</script>
Cada controle de servidor considerado, pelo Framework .NET, como um objeto da pgina. Como um objeto, o
controle possui propriedades, mtodos e eventos, os quais so acessveis atravs do cdigo de programao.
238 www.juliobattisti.com.br
ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB
HTML Server controls devem ser colocados dentro de um formulrio, na pgina ASP.NET. Criamos um formulrio,
conforme veremos mais adiante, com as tags <FORM> </FORM>. Alm disso, a propriedade runat, do formulrio,
deve ser definida como: runat=server.
Como a utilizao de Server Controls exige mais recursos do servidor do que o uso de controles tradicionais, somente
devemos utilizar Server Controls, quando as suas caractersticas forem necessrias. Porm com o avano e sofisticao
das aplicaes Web, vai ser difcil acharmos uma situao em que possamos dispensar o modelo baseado em eventos,
disponibilizado pelos Server Controls.
Em algumas situaes simples pode ser dispensvel a utilizao de Server Controls. Como por exemplo, quando o
elemento um link para outra pgina e no precisamos processar a informao do link, no servidor. Agora vamos
estudar os diversos HTML Server Controls disponveis.
HTML Server Controls Disponveis
Existem algumas propriedades que so comuns a todos os HTML Server Controls disponveis. Isto acontece porque
os mesmos herdam estas propriedades a partir de uma classe comum a todos.
A Classe Base System.Web.UI.HtmlControls.HtmlControl
A classe base para todos os HTML Server Controls System.Web.UI.HtmlControls.HtmlControl. Esta classe expe
uma srie de propriedades e mtodos comuns a todos os HTML Server Controls.
Na Tabela 7.4 temos a descrio das principais propriedades da classe System.Web.UI.HtmlControls.HtmlControl
Tabela 7.4 Principais propriedades da classe System.Web.UI.HtmlControls.HtmlControl.
Propriedade Descrio
Attributes Retorna uma coleo de todos os atributos do tipo pares de nome/valor contidos na
pgina .aspx, na qual est o controle.
ClientID Retorna a identificao do controle. Esta identificao gerada pelo ASP.NET e utilizada,
dentre outras coisas, para manter o estado do controle.
Disabled Utilizado para retornar ou definir um valor que indica se o controle est ou no desabilitado.
EnableViewState Utilizado para retornar ou definir um valor boleano que indica se o controle de estado
est habilitado (true) ou desabilitado (false), para o controle.
ID Utilizado para retornar ou definir um nome associado ao controle. Este nome utilizado
no cdigo para acessar as propriedades e mtodos do controle.
Page Retorna uma referncia para a pgina que contm o controle.
239
CAPTULO 7: HTML SERVER CONTROLS
www.juliobattisti.com.br
Vamos, finalmente, comear a estudar os HTML Server Controls disponveis.
HTMLForm Control
Este controle utilizado para a criao de formulrios. o tradicional <form> </form>.
Na prtica, todo controle de servidor deve ser colocado dentro de um formulrio. O que
define o controle como um Server Control o atributo runat=server.
Sintaxe para o controle Form:
<form
runat=server
id=identificao_no_cdigo
method=POST | GET
action=endereo
>
Controles que definem os elementos do formulrio
</form>
Onde temos as seguintes propriedades:
runat=server: Define que um controle de servidor, ou seja, que ser processado no servidor.
id=identificao_no_cdigo: Um nome que atribumos ao controle, nome este que ser usado para acessar
as propriedades e mtodos do controle, atravs de programao.
method: Existem dois mtodos para enviar um formulrio para o servidor: POST e GET. O mtodo GET
mais limitado, sendo que na grande maioria das vezes utilizamos o mtodo POST.
action: O endereo de uma pgina que ir receber os dados digitados no formulrio e realizar alguma ao
com os dados. Por exemplo, podemos criar um formulrio de cadastro, onde o formulrio digita os seus dados
para o cadastramento. O formulrio de cadastro criado como uma pgina ASP.NET chamada cadastro.aspx.
O usurio preenche os dados e clica em um boto Enviar. Ao clicar no boto Enviar, os dados digitados pelo
usurio sero passados para a pgina definida na propriedade action vamos cham-la de insere.aspx. A
pgina insere.aspx recebe os dados digitados pelo usurio, insere os mesmos em uma tabela de um banco de
dados do SQL Server 2000 e retorna uma mensagem para o usurio. As etapas do exemplo descrito esto
ilustradas na Figura 7.3.
Propriedade Descrio
Site Retorna informao a respeito do Web site.
Visible Utilizado para retornar ou definir um valor que indica se o controle ou no visvel.
NOTA: Para uma referncia
a todas as propriedades e
mtodos da classe
System.Web.UI.Html-
Controls.HtmlControl, consulte
a documentao do Frame-
work .NET, no item .NET
Framework Reference.
240 www.juliobattisti.com.br
ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB
Figura 7.3: Dados de um formulrio sendo processados.
Vamos apresentar um exemplo.
Exemplo: Neste exemplo criaremos uma pgina com um controle HtmlForm. No
formulrio colocaremos dois controles HtmlInputText (detalharemos este controle mais
adiante) e um controle HtmlButton (tambm detalharemos este controle mais adiante).
Ao carregar a pgina, o usurio digita um valor no primeiro campo e clica no boto
Enviar. O valor digitado pelo usurio, no primeiro campo, repetido no segundo campo.
Na Listagem 7.3 temos a pgina do exemplo proposto.
Listagem 7.3 Um formulrio simples chap7ex3.aspx.
<html>
<script language=C# runat=server>
public void Enviar_Click(Object sender,EventArgs e)
{
Voltou.Value = Digitou.Value;
}
</script>
<body>
<form method=post runat=server>
<table>
<tr>
NOTA: No podemos
incluir mais do que um
controle HtmlForm em
uma pgina. Se voc
inserir mais do que um
HtmlForm, uma exceo
ser gerada. Por padro,
method definido como
POST e a propriedade
action definida com o
endereo da prpria
pgina.
241
CAPTULO 7: HTML SERVER CONTROLS
www.juliobattisti.com.br
<td><h3>Digite um texto:</h3> </td>
<td><input id=Digitou type=text size=40 runat=server></td>
</tr>
<tr>
<td><h3>Voc digitou: </h3> </td>
<td><input id=Voltou type=text size=40 runat=server> </td>
</tr>
<tr>
<td><h3>Clique no boto ></h3></td>
<td><input type=submit value=Enviar OnServerClick=Enviar_Click
runat=server></td>
</tr>
</table>
</form>
</body>
</html>
Digite o cdigo da Listagem 7.3 e salve o mesmo em um arquivo chamado chap7ex3.aspx, na pasta chap7, dentro da
pasta wwwroot, conforme descrito anteriormente. Para acessar esta pgina utilize o seguinte endereo: http://localhost/
chap7/chap7ex3.aspx
Ao carregarmos esta pgina no Internet Explorer obtemos um formulrio com dois campos para digitao de texto.
Digite a mensagem: Exemplo de formulrio, no primeiro controle e d um clique no boto Enviar. A mensagem
Exemplo de formulrio ser exibida no segundo campo, conforme indicado na Figura 7.4.
Figura 7.4: Um exemplo de formulrio chap7ex3.aspx.
242 www.juliobattisti.com.br
ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB
Agora uma pequena demonstrao de como o ASP.NET mantm o estado dos controles. No nosso exemplo vamos
provar que o valor contido nos campos do formulrio mantido no servidor. Pressione F5 para atualizar a pgina do
nosso exemplo (se voc estiver utilizando o Netscape pressione Ctrl+R). Com o ASP 3.0 e verses anteriores, ao
pressionarmos F5, a pgina seria recarregada e os campos apareceriam em branco ou com os seus valores padro. No
caso do ASP.NET so exibidos os valores atualmente definidos, ou seja, o estado atual da pgina foi mantido. Pressione
F5 e observe. O texto Exemplo de formulrio ser exibido nos dois campos, o que comprova a manuteno automtica
de estado com o ASP.NET.
Algumas observaes sobre o cdigo do nosso exemplo.
No definimos a propriedade action do formulrio. Com isso, ao clicar no boto Enviar, a pgina chama a si mesma,
pois, conforme descrito, o valor padro para a propriedade action o endereo da prpria pgina, onde est o formulrio.
No formulrio definimos um evento a ser disparado em resposta ao clique no boto enviar. Esta definio feita na
seguinte linha de cdigo:
<td><input type=submit value=Enviar OnServerClick=Enviar_Click runat=server></td>
Neste caso definimos que, ao ocorrer o evento Click (OnServerClick), deve ser executado o procedimento Enviar_Click.
O procedimento enviar Click, atribui o valor digitado no campo Digitou propriedade Value do campo Voltou. Isto
equivalente a copiar o contedo do campo Digitou para o campo Voltou. O procedimento Enviar_Click est na seo
de cdigo da pgina, conforme indicado na figura a seguir:
<script language=C# runat=server>
public void Enviar_Click(Object sender,EventArgs e)
{
Voltou.Value = Digitou.Value;
}
</script>
HTMLInputText Control
utilizado para a criao de campos, em um formulrio, onde o usurio pode digitar texto. Este controle utilizado
para criar controles que rodam no servidor, para os tipos e funes indicados na Tabela 7.5. O que define o controle
como sendo de servidor a propriedade runat=server.
NOTA: Apenas para lembrar, voc pode desabilitar a manuteno automtica de estado utilizando a seguinte diretiva, no incio da pgina:
<%@Page EnableViewState=false %>
243
CAPTULO 7: HTML SERVER CONTROLS
www.juliobattisti.com.br
Tabela 7.5 HTMLInputText Control
Tipo Descrio
Texto <input type=text>. Para a digitao de informaes como por exemplo:
nome, endereo, telefone, e-mail, etc.
Senha <input type=password>. Para a digitao de senhas. Ao ser digitada
uma senha, so exibidos somente asteriscos (*) no Windows 95, 98,
NT ou 2000; j no Windows XP so exibidos pontos grandes.
Sintaxe para o controle input:
<input
type=text | password
runat=server
id=identificao_no_cdigo
maxlength=nmero mximo de caracteres
size=tamanho de exibio da caixa para digitao
value=valor padro para o campo
>
runat=server: Define que um controle de servidor, ou seja, que ser processado no servidor.
id=identificao_no_cdigo: Um nome que atribumos ao controle, nome este que ser usado para acessar
as propriedades e mtodos do controle, atravs de programao.
maxlength: tamanho mximo de caracteres para o campo.
size: tamanho da caixa que exibida para o campo. Se for menor que o tamanho mximo do campo, ao digitar
informao, quando o texto digitado atingir o tamanho mximo de exibio, o texto ser deslocado para a
esquerda, para que o usurio continue digitando.
value: Valor padro associado ao campo. Ao carregarmos a pgina o controle exibido em branco, a menos
que exista um valor padro para o mesmo, caso em que ser exibido o valor padro.
No exemplo da pgina chap7ex3.aspx, utilizamos dois controles do tipo <input type=text>, conforme indicado pelo
trecho de cdigo a seguir:
...
<td><h3>Digite um texto:</h3> </td>
<td><input id=Digitou type=text size=40 runat=server></td>
...
<td><h3>Voc digitou: </h3> </td>
<td><input id=Voltou type=text size=40 runat=server> </td>
...
244 www.juliobattisti.com.br
ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB
Vamos modificar algumas propriedades destes controles. Vamos definir um valor padro para o controle Digitou.
Vamos definir o valor padro Exemplo de ASP.NET. Tambm vamos definir um tamanho mximo de 20 para a
caixa de exibio do campo Digitou. Aps as alteraes propostas, o nosso cdigo deve ficar assim:
...
<td><h3>Digite um texto:</h3> </td>
<td><input id=Digitou type=text size=20 runat=server
value=Exemplo de ASP.NET></td>
...
<td><h3>Voc digitou: </h3> </td>
<td><input id=Voltou type=text size=40 runat=server> </td>
...
Faa estas alteraes no cdigo da Listagem 7.3 e salve a mesma com o nome de chap7ex4.aspx, na subpasta chap7,
da pasta wwwroot descrita anteriormente. Para acessar esta nova verso da pgina, utilize o seguinte endereo: http:/
/localhost/chap7/chap7ex4.aspx
Ao carregar esta pgina voc obter os resultados indicados na Figura 7.5.
Figura 7.5: Um exemplo HtmlTextControl chap7ex4.aspx.
HTMLInputCheckBox
utilizado para a criao de controles de seleo em um formulrio. Os controles do tipo CheckBox so exibidos
como pequenos quadradinhos. So controles do tipo marcado/desmarcado. Se o controle estiver marcado, ao clicarmos
ele ser desmarcado. Se o controle estiver desmarcado, ao clicarmos ele ser marcado. Normalmente utilizado em
grupos. Em um grupo de controles do tipo CheckBox podemos selecionar mais do que um controle. Por exemplo, para
245
CAPTULO 7: HTML SERVER CONTROLS
www.juliobattisti.com.br
criar um formulrio de cadastro, onde o cliente pode informar as reas de interesse em uma livraria. Podemos utilizar
controles do tipo CheckBox, onde o cliente pode selecionar uma ou mais reas de interesse. Apresentaremos este
exemplo logo em seguida.
Sintaxe para o controle CheckBox:
<input
type=checkbox
runat=server
id=identificao_no_cdigo
checked
>
Onde temos:
runat=server: Define que um controle de servidor, ou seja, que ser processado no servidor.
id=identificao_no_cdigo: Um nome que atribumos ao controle, nome este que ser usado para acessar
as propriedades e mtodos do controle, atravs de programao.
checked: Valor boleano que indica se o controle est marcado (True) ou no (False).
Vamos apresentar um exemplo.
Exemplo: Vamos criar um formulrio onde o cliente digita o Nome, o E-mail e seleciona as res de preferncia, nas
quais deseja receber informaes por e-mail. Utilizaremos o evento Click do boto Enviar, para exibir os valores
digitados pelo usurio. Para exibio dos valores vamos utilizar um controle do tipo caixa de texto HtmlTextArea
control; mais adiante falaremos em detalhes sobre este controle.
Na Listagem 7.4 temos a pgina do exemplo proposto.
Listagem 7.4 O controle CheckBox chap7ex5.aspx.
<html>
<script language=C# runat=server>
public void Enviar_Click(Object sender,EventArgs e)
{
Dados.Visible = true;
//Declarao das variveis auxiliares
String Aux;
// Comeo a montar uma string que ser atribuda
// propriedade Value do controle Dados.
246 www.juliobattisti.com.br
ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB
Aux = Nome.Value;
Aux = Aux + \n + Email.Value;
if (Negocios.Checked==true)
{
Aux= Aux +\n +Negcios;
}
if (Administrao.Checked==true)
{
Aux= Aux +\n +Administrao;
}
if (Informtica.Checked==true)
{
Aux= Aux +\n +Informtica;
}
if (Fico.Checked==true)
{
Aux= Aux +\n +Fico;
}
Dados.Value = Aux;
}
</script>
<body>
<form method=post runat=server>
<table>
<tr>
<td><h3>Nome:</h3> </td>
<td><input id=Nome type=text size=40 runat=server></td>
</tr>
<tr>
<td><h3>E-mail: </h3> </td>
247
CAPTULO 7: HTML SERVER CONTROLS
www.juliobattisti.com.br
<td><input id=Email type=text size=40 runat=server> </td>
</tr>
<tr>
<td colspan=2">Selecione as res de interesse:</td>
</tr>
<tr>
<td><h3>Negcios:</h3> </td>
<td><input id=Negocios type=checkbox runat=server> </td>
</tr>
<tr>
<td><h3>Administrao:</h3> </td>
<td><input id=Administrao type=checkbox runat=server> </td>
</tr>
<tr>
<td><h3>Informtica:</h3> </td>
<td><input id=Informtica type=checkbox runat=server> </td>
</tr>
<tr>
<td><h3>Fico:</h3> </td>
<td><input id=Fico type=checkbox runat=server> </td>
</tr>
<tr>
<td><h3>Dados do cliente:</h3> </td>
<td><textarea id=Dados cols=60" rows=10" visible=false
runat=server></textarea> </td>
</tr>
<tr>
<td><h3>Clique no boto ></h3></td>
<td><input type=submit value=Enviar OnServerClick=Enviar_Click
runat=server></td>
</tr>
</table>
</form>
</body>
</html>
248 www.juliobattisti.com.br
ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB
Digite o cdigo da Listagem 7.4 e salve o mesmo em um arquivo chamado chap7ex5.aspx, na pasta chap7, dentro da
pasta wwwroot, conforme descrito anteriormente. Para acessar esta pgina utilize o seguinte endereo: http://localhost/
chap7/chap7ex5.aspx
Ao carregarmos esta pgina no Internet Explorer obtemos um formulrio com dois campos para digitao de texto.
Um para o nome do usurio e outro para o e-mail. Tambm so exibidos quatro controles do tipo checkbox onde o
usurio pode escolher uma ou mais das seguintes opes:
Negcios
Administrao
Informtica
Fico
Ao carregar a pgina pela primeira vez, o controle do tipo textarea est oculto, pois definimos sua propriedade visible
como false. Para o nome digite Jos da Silva e para o e-mail digite josedasilva@abc.com.br. Selecione as opes
Negcios e Informtica, conforme indicado na Figura 7.6
Figura 7.6: Um exemplo com controles checkbox chap7ex5.aspx.
249
CAPTULO 7: HTML SERVER CONTROLS
www.juliobattisti.com.br
Figura 7.7: Exibio dos dados digitados e das opes selecionadas.
Desmarque a opo Negcios e marque as opes Administrao e Fico. D um clique no boto Enviar e observe
que as novas opes j so exibidas no controle do tipo textarea.
Alguns comentrios sobre o cdigo do nosso exemplo.
Na seo de apresentao (entre as tags <body> e </body>) criamos um formulrio. Neste formulrio colocamos
dois controles do tipo text para que o usurio possa digitar o nome e o e-mail. Depois inclumos quatro controles
do tipo checkbox para que o usurio possa selecionar uma ou mais preferncias.
Novamente utilizamos uma tabela para fazer o alinhamento dos controles.
Na seo de cdigo utilizamos o evento Click do boto Enviar. Dentro deste evento
tornamos o controle Dados visvel e depois declaramos uma varivel do tipo String
Aux. A vamos concatenando os valores digitados para o nome e o e-mail
varivel Aux, conforme indicado no trecho de cdigo a seguir:
D um clique no boto Enviar. Um controle do tipo textarea ser exibido na parte final da pgina, com os dados que
voc digitou para o Nome e o e-mail do usurio, alm das informaes selecionadas, conforme indicado na Figura 7.7.
NOTA: Para maiores
informaes sobre os
comandos bsicos da
linguagem HTML consulte
o Anexo I.
250 www.juliobattisti.com.br
ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB
Dados.Visible = true;
//Declarao das variveis auxiliares
String Aux;
// Comeo a montar uma string que ser atribuda
// propriedade Value do controle Dados.
Aux = Nome.Value;
Aux = Aux + \n + Email.Value;
Lembrando do Captulo 3, o + o operador de concatenao e o \n o cdigo para troca de linha.
Na seqncia utilizamos a instruo if para determinar se o controle Negcios foi selecionado. Em caso
afirmativo concatenamos Negcios varivel Aux, conforme indicado no trecho de cdigo a seguir:
if (Negocios.Checked==true)
{
Aux= Aux +\n +Negcios;
}
O mesmo procedimento utilizado para determinar se as demais opes foram ou no selecionadas.
Na ltima linha da seo de cdigo definimos a propriedade Value do controle Dados (controle do tipo textarea)
como sendo igual varivel Aux, conforme indicado no seguinte comando:
Dados.Value = Aux;
HtmlTextArea Control
Utilizamos este controle no exemplo da Listagem 7.4. Vamos apresentar mais alguns detalhes sobre este controle. O
controle textarea utilizado para a digitao ou exibio de grandes quantidades de texto. A sua funo semelhante
funo dos campos do tipo memo no Microsoft Access.
Sintaxe para o controle CheckBox:
<textarea
runat=server
id=identificao_no_cdigo
cols=nmero de colunas
name=nome enviado para o navegador
rows=nmero de linhas
onserverchange=onserverchangehandler
251
CAPTULO 7: HTML SERVER CONTROLS
www.juliobattisti.com.br
>
Texto para ser exibido no controle.
</textarea>
A propriedade onserverchange utilizada para definir um evento que ser executado em resposta ao envio da pgina
para processamento no servidor.
Observe que este controle possui uma tag de abertura <textarea> e uma de fechamento </textarea>. Utilizamos esta
sintaxe no exemplo do item anterior:
<td><textarea id=Dados cols=60" rows=10" visible=false runat=server></textarea>
Ao invs desta sintaxe tradicional podemos utilizar a seguinte sintaxe:
<textarea id=TextArea1" cols=40 rows=4 runat=server />
Observe que simplesmente colocamos uma barra antes do sinal de fechamento >. Podemos utilizar qualquer uma das
duas sintaxes.
HTMLInputRadioButton Control
utilizado para a criao de controles de seleo em um formulrio. Os controles do tipo RadioButton so exibidos
como pequenos crculos. So controles do tipo marcado/desmarcado. Se o controle estiver marcado, ao clicarmos ele
ser desmarcado. Se o controle estiver desmarcado, ao clicarmos ele ser marcado. Normalmente utilizado em grupos.
Em um grupo de controles do tipo RadioButton podemos selecionar somente um controle. Ao clicarmos em um
controle, se outro controle do grupo estava marcado, ser desmarcado. Para criar um grupo de controles do tipo
RadioButton definimos todos os controles com o mesmo valor para a propriedade name.
Sintaxe para o controle CheckBox:
<input
type=checkbox
runat=server
id=identificao_no_cdigo
checked
name=nome do grupo
>
Onde temos:
runat=server: Define que um controle de servidor, ou seja, que ser processado no servidor.
id=identificao_no_cdigo: Um nome que atribumos ao controle, nome este que ser usado para acessar
as propriedades e mtodos do controle, atravs de programao.
checked: Valor boleano que indica se o controle est marcado (True) ou no (False).
name: nome do grupo. Para criar um grupo de controles do tipo RadioButton basta definir o mesmo nome para
todos os controles do grupo.
252 www.juliobattisti.com.br
ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB
Vamos apresentar um exemplo.
Exemplo: Vamos criar um formulrio com trs controles do tipo RadioButton. O usurio seleciona uma opo e clica
no boto Enviar. Para processar as informaes enviadas pela pgina vamos utilizar a propriedade OnServerChange
do controle RadioButton. Esta propriedade permite que seja definido um procedimento que ser executado quando a
pgina for processada, em resposta a uma alterao no controle. Este procedimento detecta o tipo de carto selecionado
e exibe o tipo de carto em um controle do tipo text.
Na Listagem 7.5 temos a pgina do exemplo proposto.
Listagem 7.5 Controles do tipo RadioButton chap7ex6.aspx.
<html>
<script language=C# runat=server>
void Server_Change(object Source, EventArgs e)
{
if (Visa.Checked == true)
Exibe.Value=O SEU CARTO VISA!;
else if (Master.Checked == true)
Exibe.Value=O SEU CARTO MASTER CARD!;
else if (Outros.Checked == true)
<l Exibe.Value=OUTROS TIPOS DE CARTO!;
}
</script>
<body>
<form runat=server>
<h3><font face=Verdana>Selecione o tipo de carto:</font></h3>
<input type=radio
id=Visa
name=Cartao
OnServerChange=Server_Change
runat=server/>
Visa<br>
<input type=radio
id=Master
name=Cartao
253
CAPTULO 7: HTML SERVER CONTROLS
www.juliobattisti.com.br
OnServerChange=Server_Change
runat=server/>
Master Card<br>
<input type=radio
id=Outros
name=Cartao
OnServerChange=Server_Change
runat=server/>
Outros
<p>
<input id=Exibe type=text size=60 runat=server>
<p>
<input type=submit id=Enviar
value=Enviar
runat=server>
</form>
</body>
</html>
Digite o cdigo da Listagem 7.5 e salve o mesmo em um arquivo chamado chap7ex6aspx, na pasta chap7, dentro da
pasta wwwroot, conforme descrito anteriormente. Para acessar esta pgina utilize o seguinte endereo: http://localhost/
chap7/chap7ex6aspx
Ao carregarmos esta pgina no Internet Explorer, obtemos um formulrio com trs controles do tipo RadioButton.
Podemos selecionar um dos controles. D um clique na opo Visa. Agora d um clique na opo Master Card.
Observe que a opo Visa foi, automaticamente, desmarcada. D um clique no boto Enviar. Voc obter o resultado
indicado na Figura 7.8.
A novidade neste exemplo que, ao invs de utilizar o evento Click do boto de comando, utilizamos um evento
definido pela propriedade OnServerChange dos controles do tipo RadioButton.
254 www.juliobattisti.com.br
ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB
Figura 7.8: Um exemplo com controles RadioButton chap7ex6.aspx.
Controles Para a Criao de Tabelas: HtmlTable,
HtmlTableRow e HtmlTableCell Controls
Os controles HtmlTable, HtmlTableRow e HtmlTableCell so os controles de servidor, equivalentes s tags HTML
para a criao de tabelas: <table> </table>, <tr> </tr> e <td> </td>, respectivamente.
A vantagem de utilizarmos os controles de servidor que temos acesso a uma srie de propriedades e mtodos dos
controles de servidor. Por exemplo, podemos adicionar ou remover linhas e colunas dinamicamente, com base em
eventos ocorridos na pgina. Atravs de programao podemos utilizar os mtodos das colees
HtmlTableRowCollection e HtmlTableCellCollection para adicionar ou remover elementos da tabela.
Vamos estudar cada um dos controles individualmente, e depois vamos apresentar alguns exemplos de utilizao.
O Controle HtmlTable
Temos a seguinte sintaxe para este controle:
<table
runat=server
id=identificao_no_cdigo
align=left | center | right
bgcolor=cor de fundo
border=tamanho da borda em pixels
255
CAPTULO 7: HTML SERVER CONTROLS
www.juliobattisti.com.br
bordercolor=cor da borda
cellpadding=espao entre a borda e o contedo da clula, em pixels.
cellspacing= espao entre as clulas, em pixels
height=altura da tabela
rows=um objeto do tipo coleo de linhas - HtmlTableRowCollection
width=largura da tabela
>
<tr><td></td></tr>
<tr><td></td></tr>
</table>
Observe que, alm de definir uma coleo de linhas, no parmetro rows, tambm podemos acrescentar linhas e clulas
utilizando as tags tradicionais: <tr> </tr> para adicionar linhas e <td> </td> para adicionar clulas dentro de uma linha
(colunas da tabela).
Quando utilizamos um server control HtmlTable para criar uma tabela, podemos imaginar a tabela como sendo formada
por uma coleo de linhas. Podemos adicionar ou remover itens desta coleo, atravs do cdigo de programao.
Tambm podemos imaginar cada linha, como uma coleo de clulas. Podemos adicionar ou remover itens desta
coleo, utilizando cdigo de programao. No final deste item veremos um exemplo prtico de adio de linhas e
clulas utilizando cdigo de programao.
O Controle HtmlTableRow
Temos a seguinte sintaxe para este controle:
<tr
runat=server
id=identificao_no_cdigo
align=alinhamento para o contedo da linha
bgcolor=cor de segundo plano
bordercolor=cor da borda
height=altura da linha
cells=um objeto do tipo HtmlTableCellCollection
valign=alinhamento vertical do contedo da linha
>
<td>Contedo da clula</td>
<td> Contedo da clula </td>
<td> Contedo da clula </td>
</tr>
256 www.juliobattisti.com.br
ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB
O Controle HtmlTableCell
Temos a seguinte sintaxe para este controle:
<td ou th
runat=server
id=identificao_no_cdigo
align=alinhamento para o contedo da linha
bgcolor=cor de segundo plano
bordercolor=cor da borda
height=altura da clula
nowrap=true | false
rowspan ou colspan=nmero de linhas ou clulas para mesclar
valign=alinhamento vertical do contedo da linha
width=largura da clula
>
Contedo da clula.
</td or /th>
Duas propriedades merecem maiores comentrios.
nowrap: Pode ter o seu valor definido como true; neste caso ocorre o retorno automtico do texto ao alcanar
o final da clula, caso o contedo da clula no caiba no tamanho definido para a clula. Se o valor for
definido em false, no ocorrer o retorno automtico.
colspan ou rowspan: Esta propriedade utilizada para mesclar clulas. Por exemplo, se temos uma tabela com
duas colunas, porm em uma das linhas queremos mesclar as duas colunas, utilizamos o seguinte cdigo:
<tr>
<td width=100% colspan=2">Contedo da Clula</td>
</tr>
Um Exemplo Prtico
Vamos apresentar um exemplo, no qual demonstramos a capacidade de adicionar linhas e clulas, dinamicamente, a
uma tabela, utilizando cdigo de programao. Ao carregar a pgina, exibida uma tabela de uma nica clula. Vamos
criar um formulrio onde so apresentados dois campos para o usurio. No primeiro, o usurio digita o nmero de
linhas para a tabela. No segundo campo, o usurio digita o nmero de colunas. Ao clicar no boto Enviar, utilizaremos
o evento Load da pgina, para criar uma tabela com o nmero de linhas e colunas especificadas pelo usurio.
Na Listagem 7.6 temos a pgina do exemplo proposto.
257
CAPTULO 7: HTML SERVER CONTROLS
www.juliobattisti.com.br
Listagem 7.6 Adicionando linhas e clulas, dinamicamente chap7ex7.aspx.
<html>
<head>
<script language=C# runat=server>
void Page_Load(Object sender, EventArgs e) {
int row = 0;
// Vamos gerar, dinamicamente, uma tabela
// com o nmero de linhas e clulas, especificado
// pelo usurio.
int numrows = Convert.ToInt32(Linhas.Value);
int numcells = Convert.ToInt32(Colunas.Value);
// O lao de fora define o nmero de linhas.
// para cada linha, isto , para cada passagem do lao
// de fora, o lao mais interno executado tantas vezes
// quantas forem o nmero de colunas especificadas.
for (int j=0; j<numrows; j++)
{
//Declaramos uma varivel do tipo HtmlTableRow
HtmlTableRow r = new HtmlTableRow();
// Define a cor de segundo plano, alternadamente
// para linhas pares e mpares.
if (row%2 == 1)
r.BgColor=Gainsboro;
row++;
for (int i=0; i<numcells; i++)
{
// Declaro e crio um novo objeto do tipo HtmlTableCell()
258 www.juliobattisti.com.br
ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB
HtmlTableCell c = new HtmlTableCell();
// Defino o contedo da clula que foi recm criada.
c.Controls.Add(new LiteralControl(Linha + j.ToString() + , Coluna +
i.ToString()));
// Adiciono a clula coleo de clulas da linha.
r.Cells.Add(c);
}
// Adiciono a linha coleo de linhas da tabela.
Table1.Rows.Add(r);
}
}
</script>
</head>
<body>
<h3><font face=Verdana>HtmlTable Example</font></h3>
<form runat=server>
<font face=Verdana size=-1">
<p>
<table id=Table1"
CellPadding=5
CellSpacing=0
Border=1"
BorderColor=black
runat=server />
<p>
Nmero de linhas :
<input id=Linhas type=text size=10 value=1" runat=server>
<BR>
Nmero de colunas :
<input id=Colunas type=text size=10 value=1" runat=server>
<BR>
259
CAPTULO 7: HTML SERVER CONTROLS
www.juliobattisti.com.br
<input type=submit value=Gerar a tabela dinamicamente. runat=server>
</font>
</form>
</body>
</html>
Digite o cdigo da Listagem 7.6 e salve o mesmo em um arquivo chamado chap7ex7aspx, na pasta chap7, dentro da
pasta wwwroot, conforme descrito anteriormente. Para acessar esta pgina utilize o seguinte endereo: http://localhost/
chap7/chap7ex7aspx
Ao carregarmos esta pgina no Internet Explorer, obtemos uma tabela com uma linha e uma coluna e um formulrio
com dois campos para digitao. O valor padro destes campos definido como 1, conforme indicado na Figura 7.9.
Digite 3 para o nmero de linhas e 3 para o nmero de colunas. D um clique no boto Gerar a tabela dinamicamente.
Uma tabela com trs linhas e trs colunas por linha ser automaticamente gerada, conforme indicado na Figura 7.10.
Figura 7.9: Formulrio para gerao automtica de tabela chap7ex7.aspx.
260 www.juliobattisti.com.br
ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB
Figura 7.10: Um exemplo de tabela gerada dinamicamente.
Alguns comentrios sobre o cdigo da pgina chap7ex7.aspx.
Na seo de apresentao da pgina, criamos um formulrio com dois campos para digitao do nmero de
linhas e colunas da tabela a ser gerada dinamicamente. Tambm colocamos um boto do tipo Submit.
Na seo de cdigo interessante observar que no utilizamos o evento Click do boto Enviar do formulrio.
Poderamos ter utilizado este evento, como j fizemos em exemplos anteriores. No exemplo da pgina
chap7ex7.aspx optamos por utilizar o evento Load do objeto Page. Lembrando do que foi apresentado no incio
do captulo, toda pgina APS.NET, ao ser carregada, compilada e um objeto do
tipo Page gerado. Este objeto baseado na classe Page do namespace
System.Web.UI. Sendo um objeto, temos aceso a seus mtodos, propriedades e
demais membros. A seguir temos o cdigo para a declarao do evento Load da
pgina:
void Page_Load(Object sender, EventArgs e)
Iniciamos o procedimento declarando trs variveis do tipo inteiro:
int row = 0;
int numrows = Convert.ToInt32(Linhas.Value);
int numcells = Convert.ToInt32(Colunas.Value);
A varivel row utilizada para definir se estamos em uma linha mpar (1, 3, etc.) ou em
uma linha par (2, 4, etc). Para as linhas pares definiremos uma cor de fundo diferente,
para dar um efeito especial na apresentao da tabela.
IMPORTANTE: Uma
tabela dinmica
formada por uma coleo
de linhas, onde cada linha
formada por uma
coleo de clulas. Com
esta idia em mente
que, atravs do cdigo do
evento Load, vamos criar
uma tabela com o
nmero de linhas e
colunas digitado pelo
usurio.
261
CAPTULO 7: HTML SERVER CONTROLS
www.juliobattisti.com.br
A varivel numrows contm o nmero de linhas digitado pelo usurio. Observe que temos que converter o valor
digitado pelo usurio para um tipo Int32. Esta operao necessria porque os valores digitados em um campo de um
formulrio so considerados valores de texto. A varivel numcells contm o nmero de colunas digitado pelo usurio.
Tambm convertemos este nmero para Int32.
Em seguida iniciamos dois laos for. O lao for externo varia de 0 at o nmero de linhas especificado pelo usurio.
O lao for interno varia, para cada valor do lao externo, de 0 at o nmero de colunas especificado pelo usurio,
conforme indicado pelo trecho de cdigo a seguir:
for (int j=0; j<numrows; j++)
{
//Declaramos uma varivel do tipo HtmlTableRow
HtmlTableRow r = new HtmlTableRow();
// Define a cor de segundo plano, alternadamente
// para linhas pares e mpares.
if (row%2 == 1)
r.BgColor=Gainsboro;
row++;
for (int i=0; i<numcells; i++)
{
// Declaro e crio um novo objeto do tipo HtmlTableCell()
HtmlTableCell c = new HtmlTableCell();
// Defino o contedo da clula que foi recm criada.
c.Controls.Add(new LiteralControl(Linha + j.ToString() + ,
Coluna + i.ToString()));
// Adiciono a clula coleo de clulas da linha.
r.Cells.Add(c);
}
// Adiciono a linha coleo de linhas da tabela.
Table1.Rows.Add(r);
}
262 www.juliobattisti.com.br
ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB
No incio do lao, declaramos e inicializamos uma varivel r, do tipo HtmlTableRow. Estamos criando um objeto do
tipo HtmlTableRow. Isto feito com o seguinte cdigo:
HtmlTableRow r = new HtmlTableRow();
Em seguida um teste para definir se estamos em uma linha par ou mpar. O teste divide o nmero da linha por 2 e
retorna o resto da diviso. Se este resto for igual a 1 estamos em uma linha mpar e a cor de segundo plano alterada.
Observe que, para alterar a cor de segundo plano, utilizamos a propriedade BgColor do objeto r, que um objeto do
tipo HtmlTableRow( ). Isto feito pelo seguinte trecho de cdigo:
if (row%2 == 1)
r.BgColor=Gainsboro;
row++;
Gainsboro o nome de uma cor. Ao invs do nome poderamos utilizar os tradicionais cdigos de seis dgitos
hexadecimais. Por exemplo: #000000 para preto, #FFFFFF para branco, #FF0000 para vermelho e assim por diante.
Aps definirmos o nome da cor, incrementamos a varivel inteira row. Observe que com ASP.NET e a biblioteca de
classes do Framework .NET, a programao para Web ficou muito mais parecida com a programao tradicional para
Windows, orientada a eventos.
Na seqncia do cdigo entramos no lao for interno. Neste lao declarada e inicializada uma varivel c, do tipo
HtmlTableCell( ). Para cada passagem do lao interno vamos adicionar uma clula, a coleo de clulas do objeto
HtmlTableRow atual. Na prtica estamos adicionando as colunas para a linha atual. Tambm feita a definio do
contedo para a clula.
A declarao da varivel do tipo HtmlTableCell( ) feita com o seguinte comando:
HtmlTableCell c = new HtmlTableCell();
A definio do contedo da clula feita com o seguinte comando:
c.Controls.Add(new LiteralControl(Linha + j.ToString() + , Coluna + i.ToString()));
A adio da clula c coleo de clulas da linha r feita com o seguinte comando:
r.Cells.Add(c);
Para cada passada do lao interno uma nova clula adicionada linha. Ao final, a linha ter tantas clulas quantas
forem as colunas especificadas pelo usurio.
Uma vez que adicionamos vrias clulas coleo de clulas da linha, o passo final adicionar a linha coleo de
linhas da tabela. Isto feito no seguinte comando:
Table1.Rows.Add(r);
Para cada passada do lao externo uma nova linha adicionada coleo de linhas da tabela. Ao final teremos uma
tabela com tantas linhas quantas especificadas pelo usurio e, em cada linha, tantas clulas quantas o nmero de
colunas especificado pelo usurio. Em resumo: exatamente o resultado proposto pelo exemplo.
263
CAPTULO 7: HTML SERVER CONTROLS
www.juliobattisti.com.br
HTMLSelect Control
utilizado para a criao de controles do tipo caixa de seleo, onde so apresentados diversos itens em uma
lista, onde o usurio pode selecionar um determinado item. A funcionalidade idntica tag <SELECT> </
SELECT) do HTML.
Sintaxe para o controle Select:
<select
runat=server
id=identificao_no_cdigo
OnServerChange=onserverchangehandler
DataSource=fonte de dados
DataTextField=descrio do campo ao qual vinculada a caixa de seleo
DataValueField=valor do campo ao qual vinculada a caixa de seleo
Multiple
Items=coleo de elementos do tipo options
SelectedIndex=ndice do elemento atualmente selecionado
Size=nmero de itens visveis ao mesmo tempo. Por padro 1"
Value=Valor do item atualmente selecionado
>
<option>Texto para a opo 1</option>
<option>Texto para a opo 2</option>
...
<option>Texto para a opo n</option>
</select>
Eu no me canso de repetir: Sendo este um controle de servidor, o mesmo criado como um objeto no momento da
compilao da pgina ASP.NET. Sendo um objeto, temos acesso a suas propriedades e mtodos.
Temos duas maneiras de definir os elementos da lista:
Utilizando a maneira tradicional, onde cada elemento definido atravs de um conjunto de tags <option>
Texto </option>, com uma tag para cada elemento da lista.
Utilizando a coleo Items, qual podemos adicionar dinamicamente, atravs de programao, elementos do
tipo options. Esta coleo uma instncia da classe ListItemCollection, a qual pertence ao namespace
System.Web.UI.WebControls. Esta classe possui mtodos para adicionar e remover elementos, utilizando
programao.
Vamos apresentar um exemplo.
264 www.juliobattisti.com.br
ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB
Exemplo: Vamos criar um formulrio onde temos trs controles:
Uma lista com alguns nomes de cores. Ao lado desta lista temos um boto Aplicar. Ao clicar neste boto, a cor
selecionada na lista ser aplicada como cor de segundo plano de um controle do tipo texto existente no formulrio.
Um campo onde o usurio pode adicionar uma cor lista de cores. Ao lado deste campo temos um boto. Ao
clicar neste boto, a cor digitada no campo ser adicionada lista de cores. Para isso utilizaremos o evento
Click deste boto.
Um campo onde exibimos um determinado texto e onde aplicada a cor de segundo plano selecionada na lista
de cores.
Na Listagem 7.7 temos a pgina do exemplo proposto.
Listagem 7.7 Adicionando elementos dinamicamente a uma lista chap7ex8.aspx.
<html>
<head>
<script language=C# runat=server>
void Aplicar_Click(object Source, EventArgs e)
{
Span1.Style[background-color] = ColorSelect.Value;
}
void AdicionaALista_Click(object Source, EventArgs e)
{
ColorSelect.Items.Add(Text1.Value);
}
</script>
</head>
<body>
<h3><font face=Verdana>Exemplo de lista dinmica!</font></h3>
<form runat=server>
Selecione uma cor:<br>
265
CAPTULO 7: HTML SERVER CONTROLS
www.juliobattisti.com.br
<select id=ColorSelect runat=server>
<option>SkyBlue</option>
<option>LightGreen</option>
<option>Gainsboro</option>
<option>LemonChiffon</option>
</select>
<input type=button runat=server Value=Aplicar OnServerClick=Aplicar_Click>
<p> A cor desejada no est na lista? Digite a cor desejada:<br>
<input type=text id=Text1" runat=server>
<input type=button runat=server Value=AdicionaALista
OnServerClick=AdicionaALista_Click>
<p>
<span id=Span1" runat=server>
Clique no boto Aplicar para definir a cor de segundo plano!
</span>
</form>
</body>
</html>
Digite o cdigo da Listagem 7.7 e salve o mesmo em um arquivo chamado chap7ex8aspx, na pasta chap7, dentro da
pasta wwwroot, conforme descrito anteriormente. Para acessar esta pgina utilize o seguinte endereo: http://localhost/
chap7/chap7ex8.aspx
Na lista de cores selecione SkyBlue e d um clique no boto Aplicar. Observe que a cor de segundo plano do texto, no
final do formulrio, alterada, conforme indicado na Figura 7.11.
Agora vamos adicionar uma cor lista. No campo para digitao de texto digite Red e d um clique no boto
AdicionaALista. Abra a lista e observe que a cor Red (vermelho) j faz parte das opes da Lista, conforme indicado
na Figura 7.12.
266 www.juliobattisti.com.br
ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB
Figura 7.11: Alterando a cor de fundo usando uma lista chap7ex8.aspx.
Figura 7.12: Elemento adicionado dinamicamente lista.
Alguns comentrios sobre o cdigo da pgina chap7ex8.aspx.
267
CAPTULO 7: HTML SERVER CONTROLS
www.juliobattisti.com.br
Quando o usurio seleciona uma cor na lista de cores e clica no boto Aplicar, disparado o evento Click do
boto. Em resposta a este evento executado o procedimento Aplicar_Click. Este procedimento utiliza a
propriedade Style do controle Span1 para definir a cor de segundo plano como sendo a cor selecionada na lista
de cores. O procedimento Aplicar_Click est indicado no trecho de cdigo a seguir:
void Aplicar_Click(object Source, EventArgs e)
{
Span1.Style[background-color] = ColorSelect.Value;
}
Para adicionar um elemento lista de cores, utilizamos o evento Click do boto
AdicionaALista. Neste procedimento utilizamos o mtodo Add da coleo Items
da lista, conforme indicado no trecho de cdigo a seguir:
void AdicionaALista_Click(object Source, EventArgs e)
{
ColorSelect.Items.Add(Text1.Value);
}
Passamos para o mtodo Add o valor digitado no campo Text1 do formulrio: Text1.Value.
Vou repetir mais uma vez: Observe o quanto o modelo de programao para o ASP.NET
se parece com a programao tradicional de aplicaes Windows orientada a eventos.
HTMLAnchor Control
utilizado para a criao de links em pginas ASP.NET. A funcionalidade idntica
tag <a> </a) do HTML. A diferena que, por ser um controle de servidor, o mesmo
processado pelo Framework .NET no servidor IIS, o que nos disponibiliza uma srie de
mtodos e propriedades para o controle HtmlAnchor.
Sintaxe para o controle HtmlAnchor:
<a
runat=server
id=identificao_no_cdigo
href=enereo absoluto ou relativo
name=nome quando adicionado lista de favoritos do navegador
OnServerClick=nome do procedimento a ser executado em resposta a um click no
link
target=abre na mesma janela, em uma nova janela, em um frame da janela atual,
etc
title=ttulo a ser exibido na janela de ttulo do navegador
>
Texto do link.
</a>
NOTA: A propriedade Style
utilizada para definir
aspectos visuais dos
elementos, como cor da
fonte, tamanho, negrito,
itlico, etc. Existe uma
definio para os vrios
atributos visuais possveis de
serem alterados. Estes
atributos fazem parte das
chamadas CSS Cascading
Style Sheets. Para maiores
informaes sobre CSS e uma
referncia completa sobre os
diversos atributos disponveis,
consulte um dos seguintes
endereos: www.w3.org ou
www.wdsl.com.
268 www.juliobattisti.com.br
ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB
Vamos apresentar um exemplo simples.
Exemplo: Vamos criar um formulrio com dois links. Um link aponta para a pgina chap7ex8.aspx e outro para a
pgina chap7ex7.aspx.
Na Listagem 7.8 temos a pgina do exemplo proposto.
Listagem 7.8 O controle HtmlAnchor chap7ex9.aspx.
<%@ Import Namespace=System %>
<html>
<script language=C# runat=server>
</script>
<body>
<l
<H1>Selecione um dos links abaixo !!! </H1>
<TABLE>
<TR>
<TD>
<a href=chap7ex7.aspx runat=server id=link1">
Exemplo 7 do Captulo 7.
</a>
</TD>
</TR>
<TR>
<TD>
<a href=chap7ex8.aspx runat=server id=link2">
Exemplo 8 do Captulo 7.
</a>
</TD>
</TR>
</TABLE>
</body>
</html>
269
CAPTULO 7: HTML SERVER CONTROLS
www.juliobattisti.com.br
Digite o cdigo da Listagem 7.8 e salve o mesmo em um arquivo chamado chap7ex9aspx, na pasta chap7, dentro da
pasta wwwroot, conforme descrito anteriormente. Para acessar esta pgina utilize o seguinte endereo: http://localhost/
chap7/chap7ex9.aspx
Voc obter o resultado indicado na Figura 7.13.
Figura 7.13: O controle HtmlAnchor chap7ex9.aspx.
HtmlInputButton Control
utilizado para a criao de um boto de comando em um formulrio. O boto de comando normalmente utilizado
para enviar os dados do formulrio para processamento. J tivemos diversos exemplos de utilizao deste controle.
Para v-lo em funcionamento, inclusive com cdigo para responder ao evento Click do boto, consulte os seguintes
exemplos deste captulo:
chap7ex3.aspx
chap7ex4.aspx
chap7ex5.aspx
chap7ex8.aspx
Sintaxe para o controle HtmlInputButton:
<input
type=button | submit | reset
270 www.juliobattisti.com.br
ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB
runat=server
id=identificao_no_cdigo
OnServerClick=nome do procedimento a ser executado em resposta ao evento Click
>
HtmlButton Control
utilizado para a criao de botes de comandos mais sofisticados dos que os criados pelo controle HtmlInputButton.
Com este controle temos acesso a uma srie de mtodos e eventos, os quais permitem a criao de alguns efeitos
interessantes. Alm do texto podemos associar uma determinada figura com o boto de comando.
Sintaxe para o controle HtmlButton:
<button
runat=server
id=identificao_co_cdigo
OnServerClick=procedimento a ser executado ao clicarmos no boto
>
texto ou image
</button>
Este elemento bastante rico em funcionalidade. Podemos aplicar uma srie de efeitos interessantes ao mesmo.
Vamos criar um formulrio, baseado em um exemplo da documentao do Framework .NET, onde temos dois controles
HtmlButton. Vamos utilizar o evento Click de cada controle para informar quando um dos controles foi clicado.
Tambm vamos utilizar a propriedade Style para definir algumas caractersticas visuais de cada controle. Em um dos
controles alm do texto, adicionaremos uma pequena imagem. A imagem est em um arquivo chamado seta.gif, o qual
deve estar gravado na pasta Chap7. Para o segundo boto vamos aplicar um efeito onmouseover, ou seja, quando o
usurio estiver com o mouse sobre alguma parte do boto, faremos com que a cor de segundo plano do boto seja
modificada. Quando o mouse sair da rea do boto, volta a cor de segundo plano original.
Na Listagem 7.9 temos a pgina do exemplo proposto.
Listagem 7.9 O controle HtmlButton chap7ex10.aspx.
<html>
<head>
<script language=C# runat=server>
void Button1_OnClick(object Source, EventArgs e)
{
Span1.InnerHtml=Voc clicou no boto 1";
}
271
CAPTULO 7: HTML SERVER CONTROLS
www.juliobattisti.com.br
void Button2_OnClick(object Source, EventArgs e)
{
Span1.InnerHtml=Voc clicou no boto 2";
}
</script>
</head>
<body>
<h3><font face=Verdana>Exemplo do controle HtmlButton!</font></h3>
<form runat=server>
<font face=Verdana size=-1">
<p>
<button id=Button1"
OnServerClick=Button1_OnClick
style=font: 8pt verdana;
background-color:lightgreen;
border-color:black;
height=30;
width:110"
runat=server>
<img src=seta.gif> Clique em mim!
</button>
Alm do texto temos uma figura no boto.
<p>
<p>
<button id=Button2
OnServerClick=Button2_OnClick
style=font: 8pt verdana;
background-color:lightgreen;
border-color:black;
height=30;
width:110"
onmouseover=this.style.backgroundColor=yellow
onmouseout=this.style.backgroundColor=lightgreen
runat=server>
272 www.juliobattisti.com.br
ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB
Clique em mim!
</button>
Com efeito onmouseover.
<p>
<p>
<b><span id=Span1 runat=server /></b>
</font>
</form>
</body>
</html>
Digite o cdigo da Listagem 7.9 e salve o mesmo em um arquivo chamado chap7ex10aspx, na pasta chap7, dentro da
pasta wwwroot, conforme descrito anteriormente. Para acessar esta pgina utilize o seguinte endereo: http://localhost/
chap7/chap7ex10.aspx
Clique no primeiro boto. Observe que o texto Voc clicou no boto 1 exibido. Agora passe o mouse sobre o
segundo boto. Observe que a cor de fundo trocou para amarelo. Afaste o mouse do segundo boto. Observe que a cor
de fundo voltou ao normal. Agora clique no segundo boto. O texto Voc clicou no boto 2 exibido, conforme
indicado na Figura 7.14.
Figura 7.14: O controle HtmlButton chap7ex10.aspx.
273
CAPTULO 7: HTML SERVER CONTROLS
www.juliobattisti.com.br
Alguns comentrios sobre o exemplo.
Mais uma vez utilizamos o evento Click de cada boto para enviar uma mensagem informando qual boto foi
clicado.
A aparncia dos botes foi definida atravs da sua propriedade style. Por exemplo, para o primeiro boto
fizemos as seguintes definies:
style=font: 8pt verdana;
background-color:lightgreen;
border-color:black;
height=30;
width:110"
Observe que atravs da propriedade style podemos definir uma srie de elementos visuais para o boto. Neste exemplo
estamos definindo as seguintes propriedades:
font: tamanho e tipo da fonte.
background-color: cor de segundo plano.
border-color: cor das bordas do boto.
height: altura do boto, em pixels.
width: largura do boto, em pixels.
Para o segundo boto, utilizamos os eventos onmouseover para definir uma cor
diferente quando o mouse estiver sobre o boto e onmouseout para retornar a cor
original, quando o mouse fosse afastado do boto, conforme indicado no trecho
de cdigo a seguir:
onmouseover=this.style.backgroundColor=yellow
onmouseout=this.style.backgroundColor=lightgreen
HtmlImage Control
utilizado para Inserir figuras em uma pgina ASP.NET. A sua funcionalidade idntica
tag <img> da linguagem HTML, com a diferena de que, em sendo um controle de
servidor, temos acesso a uma srie de mtodos e eventos do controle.
Sintaxe para o controle HtmlImage:
<img
id=identificao_no_cdigo
runat=server
alt=texto exibido quando o usurio aponta o mouse para a imagem
align= top | middle | bottom | left | right
border=largura da borda
NOTA: Para uma
referncia completa a
todas as definies de
estilo existentes, consulte
www.w3.org ou
www.wdvl.com.
IMPORTANTE: Algumas
destas definies fazem
parte do HTML 4.0 e
somente funcionaro
corretamente com o
Internet Explorer 4.0 ou
superior.
274 www.juliobattisti.com.br
ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB
height=altura da imagem
src=localizao da imagem
width=largura da imagem
>
Vamos a um exemplo adaptado da documentao do Framework .NET.
Exemplo: Vamos criar um formulrio onde exibida uma imagem. Tambm exibimos uma lista de seleo com nomes
de outras imagens. Esta lista criada utilizando o controle HtmlSelect explicado anteriormente. O usurio seleciona
um nome de imagem na lista e clica no boto Aplicar. O evento Click do boto faz com que a imagem associada
opo selecionada na lista seja exibida.
Na Listagem 7.10 temos a pgina do exemplo proposto.
Listagem 7.10 O controle HtmlImage chap7ex11.aspx.
<html>
<head>
<script language=C# runat=server>
void SubmitBtn_Click(Object Sender, EventArgs e)
{
Image1.Src=Select1.Value;
}
</script>
</head>
<body>
<h3><font face=Verdana>Exemplo do controle HtmlImage!!!</font></h3>
<form runat=server>
<img ID=Image1" src=cereal1.gif runat=server/>
<p>
<p>
Selecione a Imagem a ser exibida e clique em Aplicar:
<select id=Select1" runat=server>
<option Value=Cereal1.gif>Healthy Grains</option>
<option Value=Cereal2.gif>Corn Flake Cereal</option>
<option Value=Cereal3.gif>U.F.O.S</option>
<option Value=Cereal4.gif>Oatey Os</option>
275
CAPTULO 7: HTML SERVER CONTROLS
www.juliobattisti.com.br
<option Value=Cereal5.gif>Strike</option>
<option Value=Cereal7.gif>Fruity Pops</option>
</select>
<p>
<p>
<input type=submit runat=server Value=Aplicar OnServerClick=SubmitBtn_Click>
</form>
</body>
</html>
Digite o cdigo da Listagem 7.10 e salve o mesmo em um arquivo chamado chap7ex11aspx, na pasta chap7, dentro da
pasta wwwroot, conforme descrito anteriormente. Para acessar esta pgina utilize o seguinte endereo: http://localhost/
chap7/chap7ex11.aspx
Ser exibida a figura para o cereal Healthy Grains, conforme indicado na Figura 7.15.
Figura 7.15: O controle HtmlImage chap7ex11.aspx.
Selecione uma outra opo na lista; por exemplo, selecione U.F.O.S e d um clique no boto Aplicar. A figura
correspondente ser exibida.
276 www.juliobattisti.com.br
ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB
Alguns comentrios sobre o exemplo.
Na seo de apresentao temos um formulrio com trs controles. Um controle
para exibio da imagem, um para a criao da lista com as opes disponveis
e um boto de comando.
Utilizamos o evento Click do boto de comando para redefinir a propriedade
Src do controle que exibe a imagem. A propriedade Src define o caminho para a
imagem a ser exibida. Aqui temos mais um exemplo do poder dos controles de
servidor, ou seja, conseguimos alterar suas propriedades atravs de cdigo de
programao. O evento Click para o boto de comando est indicado no trecho
de cdigo a seguir:
void SubmitBtn_Click(Object Sender, EventArgs e)
{
Image1.Src=Select1.Value;
}
Tambm interessante observarmos o cdigo que retornado, como resultado do processamento da pgina.
Por exemplo, quando voc seleciona U.F.O.S e clica em aplicar, a figura associada a opo U.F.O.S exibida.
Agora vamos dar uma olhada no cdigo HTML que foi enviado pelo servidor, como resultado do processamento
da pgina.
Para visualizar o cdigo HTML correspondente, utilize o seguinte comando no Internet Explorer: Exibir -> Cdigo-
fonte. Selecionando este comando ser exibido o cdigo a seguir:
<html>
<head>
</head>
<body>
<h3><font face=Verdana>Exemplo do controle HtmlImage!!!</font></h3>
<form name=ctrl0" method=post action=chap7ex11.aspx id=ctrl0">
<input type=hidden name=__VIEWSTATE value=dDwtMTkzMzU5NzEzMDt0PDtsPGk8Mj47
PjtsPHQ8O2w8aTwxPjs+O2w8dDxwPGw8c3JjOz47bDxDZXJlYWwzLmdpZjs+Pjs7Pjs+Pjs+Pjs+ />
<img src=/chap7/Cereal3.gif id=Image1" />
<p>
<p>
Selecione a Imagem a ser exibida e clique em Aplicar:
NOTA: Para que este
exemplo funcione, as
figuras devem estar na
pasta Chapt7. Se as
figuras estiverem em
outra pasta, voc precisa
fornecer o caminho ao
definir o valor da
propriedade Src, do
controle HtmlImage.
277
CAPTULO 7: HTML SERVER CONTROLS
www.juliobattisti.com.br
<select name=Select1" id=Select1">
<option value=Cereal1.gif>Healthy Grains</option>
<option value=Cereal2.gif>Corn Flake Cereal</option>
<option selected=selected value=Cereal3.gif>U.F.O.S</option>
<option value=Cereal4.gif>Oatey Os</option>
<option value=Cereal5.gif>Strike</option>
<option value=Cereal7.gif>Fruity Pops</option>
</select>
<p>
<p>
<input name=ctrl1" type=submit value=Aplicar />
</form>
</body>
</html>
Nada de diferente, com exceo do seguinte elemento:
<input type=hidden name=__VIEWSTATE value=dDwtMTkzMzU5NzEzMDt0PDtsPGk8Mj47Pjts
PHQ8O2w8aTwxPjs+O2w8dDxwPGw8c3JjOz47bDxDZXJlYWwzLmdpZjs+Pjs7Pjs+Pjs+Pjs+ />
Este um campo oculto (type=hidden), o qual utilizado para manter o estado dos controles do formulrio entre
uma chamada e outra da pgina. Para maiores informaes sobre a manuteno de estado consulte os tpicos iniciais
deste captulo.
Concluso
Quando uma pgina .aspx acessada, o servidor compila a pgina em um objeto derivado da classe Page. Cada
elemento da pgina compilado como um objeto. Desta forma temos acesso a mtodos e propriedades dos diversos
elementos.
Iniciamos o captulo estudando a classe page. Apresentamos as principais propriedades, eventos e mtodos desta
classe. Tambm falamos sobre o processamento de uma pgina .aspx. Falamos sobre os conceitos de PostBack e
round-trip.
Em seguida passamos definio do que so Html Server controls e quais as vantagens em utiliz-los em substituio
s tags HTML tradicionais.
Uma vez entendidos os conceitos tericos necessrios, passamos ao estudo dos principais HTML Server Controls.
Estudamos e apresentamos exemplos dos seguintes controles:
278 www.juliobattisti.com.br
ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB
HTMLForm control.
HTMLInputText control.
HTMLInputCheckBox control.
HtmlTextArea control.
HTMLInputRadioButton control.
HtmlTable control.
HtmlTableRow control.
HtmlTableCell control.
HTMLSelect control.
HTMLAnchor control.
HtmlInputButton control.
HtmlButton control.
HtmlImage control.
No prximo captulo trataremos de controles que j vm com uma certa inteligncia embutida. Veremos os Valida-
tion Server Controls.
279
CAPTULO 8: VALIDATION SERVER CONTROLS
www.juliobattisti.com.br
Introduo
Para explicarmos mais esta novidade do ASP.NET: Validation Server Controls,
vamos novamente fazer uma analogia com as verses anteriores do ASP. O assunto
em pauta validao da entrada de dados em formulrio.
Vamos imaginar que voc cria um formulrio onde o internauta deva preencher
os seguintes dados:
Nome
Endereo
e-mail
Fone
Profisso
Data de Nascimento
Valor do crdito pretendido
Renda mensal
Empresa onde trabalha
Endereo do site da empresa
Os campos Nome, Endereo e e-mail e Fone so obrigatrios. Alm disso, o valor
do crdito pretendido no pode ser superior a 20% da Renda mensal. Para criarmos
um formulrio que funcione de acordo com estes critrios, vamos precisar de uma
boa quantidade de cdigo. Quando o usurio preenche os dados e clica no boto
enviar, os dados so enviados, para processamento, para a pgina especificada na
propriedade action do formulrio. Esta pgina deve, em primeiro lugar, verificar se
os campos obrigatrios foram preenchidos e, em segundo lugar, verificar se o valor
do crdito no est acima de 20% da renda mensal. Se as informaes digitadas
pelo usurio atenderem estes critrios, o processamento continua e os dados so
gravados em um banco de dados, como o SQL Server ou o ORACLE. Mas basta
que um nico campo obrigatrio no tenha sido preenchido, para que o formulrio
tenha que ser enviado de volta para o navegador do cliente, mantendo as informaes
j digitadas e solicitando que sejam feitas as correes necessrias.
Explicar a lgica que est por trs deste processo de validao j no uma tarefa
simples. Implementar toda esta validao bastante trabalhoso e exige muita
codificao. Para facilitar a vida do desenvolvedor, o ASP.NET apresenta uma srie
de controles que j vm com funcionalidades, no prprio controle, as quais facilitam
a validao dos dados digitados pelo usurio. Estes controles so conhecidos como:
Validation Controls ou Server Validation Controls, uma vez que so controles de
servidor, a exemplo dos HTML Server Controls que vimos no Captulo 7.
C A P T U L O
8
Validation Server Controls
280 www.juliobattisti.com.br
ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB
Neste captulo vamos entender exatamente o que so os Server Validation Controls. Tambm aprenderemos a utilizar
os diversos controles disponveis. Iremos estudar os seguintes controles:
RequiredFieldValidator Control
CompareValidator Control
RangeValidator Control
CustomValidator Control
RegularExpressionValidator Control
Veremos diversos exemplos de utilizao destes controles.
Validation Controls: Definio e Propriedades Gerais
Para facilitar a tarefa de fazer a validao dos dados digitados em um formulrio que foram criados os controles de
validao Validation Controls.
Por que estes controles no so chamados de HTMLServer Validation Controls?
No Captulo 7 ns vimos que, para cada tag HTML utilizada para a criao de formulrios, existe um HTML Server
Control correspondente. A vantagem dos HTML Server Controls que os mesmos so compilados como objetos em
uma pgina ASP.NET. Sendo objeto temos acesso aos mtodos e propriedades do controle. J os controles de validao
no possuem correspondentes no HTML. So na verdade controles completamente novos e no uma melhoria em
relao a controles j existentes.
Os controles de validao possuem as mesmas caractersticas que os chamados Web Server Controls (que sero
estudados no Captulo 9). Estes controles iniciam com a palavra asp, conforme exemplo a seguir, onde temos uma
pequena amostra da sintaxe do controle RequiredFieldValidator:
<asp:RequiredFieldValidator
Atributo1
Atributo2
...
Atributon>
</asp:RequiredFieldValidator>
Outra diferena quanto localizao das classes bases, ou seja, das classes das quais
so derivados os controles. Os HTMLServer controls so derivados de classes do
namespace System.Web.UI.HtmlControls; j os Web Server Controls, dos quais fazem
parte os controles de validao, so derivados de classes contidas no namespace
System.Web.UI.WebControls.
NOTA: Estudaremos o
controle
RequiredFieldValidator
em detalhes ainda neste
captulo.
281
CAPTULO 8: VALIDATION SERVER CONTROLS
www.juliobattisti.com.br
Como que Utilizamos os Controles de Validao?
Na criao do formulrio, devemos associar um controle de validao com cada campo onde os dados devam ser
validados. Por exemplo, se existe um campo Nome, o qual de preenchimento obrigatrio, devemos associar um
campo RequiredFieldValidator com o campo nome que obrigatrio. Quando o usurio envia a pgina para
processamento, cada controle de validao ir checar o valor digitado no controle associado para verificar se est tudo
OK, ou seja, para verificar se o formulrio passou no teste de validao. Basta que um nico campo no atenda as
regras de validao definidas, para que o formulrio no passe no teste de validao.
Neste caso podemos exibir uma mensagem de erro descrevendo o(s) controle(s) que
no passou(aram) na validao, em um controle do tipo ValidationSummary.
Por serem controles de servidor, mais especificamente, Web Server Controls, os controles
de validao possuem uma srie de funcionalidades embutidas que os tornam
extremamente interessantes para a criao de aplicaes Web. Dizemos que foi embutida
inteligncia nestes controles. Estas funcionalidades, nas verses anteriores do ASP,
tinham que ser codificadas manualmente pelo programador. Ao embutir funcionalidades
nos prprios controles estamos reduzindo a quantidade de cdigo que precisa ser escrita.
Esta frase j foi repetida n vezes neste livro e no me canso de repetir: Com o Framework
.NET o programador precisa se preocupar menos com funes bsicas, as quais passaram
para o controle do Framework .NET, precisando apenas cuidar da lgica da aplicao.
Uma das funcionalidades dos controles de validao que eles so capazes de,
automaticamente, detectar qual o navegador ou dispositivo que o cliente est utilizando,
e se for o Internet Explorer 5 ou superior, ser gerado cdigo de validao no prprio
cliente, no momento da criao da pgina. Em outras palavras, ao carregar uma pgina,
no IE 5 ou superior, pgina esta que contm controles de validao, ser gerado,
automaticamente, cdigo para fazer a validao no prprio cliente, evitando que a pgina
seja enviada para o servidor se algum controle no tiver passado no teste de validao.
Nesta situao a pgina somente ser enviada para processamento quando todos os
controles tiverem passado no teste de validao. Para criar esta mesma funcionalidade
nas verses anteriores do ASP, tnhamos que escrever uma boa quantia de cdigo. O
cdigo de validao gerado automaticamente, no cliente, criado utilizando-se da
linguagem DHTML Dynamic HTML. Para maiores informaes sobre DHTML
consulte o seguinte endereo: www.wdvl.com.
Se quisermos possvel desabilitar a validao no cliente. Para isso temos uma
propriedade chamada EnableClientScript, da classe BaseValidator, da qual todos os
controles de validao so derivados. A propriedade EnableClientScript do tipo Boleana
True ou False. Estudaremos a classe BaseValidator logo em seguida. Ao desabilitarmos
a validao no cliente (definindo EnableClientScript = False), podemos criar mensagens
personalizadas de erro, ao invs de utilizar as mensagens pr-definidas e o controle
ValidationSummary.
IMPORTANTE: Mesmo
que o cdigo para
validao no cliente tenha
sido gerado, quando a
pgina enviada para o
servidor, a validao
feita pelos Validation
Controls, para garantir que
resultados incorretos
sejam inseridos no banco
de dados. Pode acontecer
de a pgina ter sido
modificada no caminho
entre o navegador do
cliente e o servidor IIS.
Neste caso os dados que
foram digitados e
passaram na validao
foram modificados por um
hacker e no so os
mesmos que chegaram no
servidor. Por isso, a
validao no servidor
funciona como uma
proteo extra. Claro que
isso no dispensa o uso de
outras tcnicas de
segurana como por
exemplo a criptografia e
Certificados Digitais.
Falaremos um pouco mais
sobre Segurana, no
ltimo captulo deste livro.
282 www.juliobattisti.com.br
ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB
A Me de Todos? Ou Seria o Pai de Todos?
Todos os controles de validao so derivados de uma classe base chamada BaseValidator. Esta classe faz parte do
namespace System.Web.UI.WebControls. Por serem baseados na classe BaseValidator, os controles de validao herdam
as propriedades e mtodos desta classe.
Principais Propriedades da Classe BaseValidator
Neste tpico vamos apresentar as principais propriedades da classe BaseValidator. Para uma descrio completa de
todos os mtodos e propriedades da classe BaseValidator, abra a documentao do Framework .NET (Iniciar ->
Programas -> Microsoft .NET Framework SDK -> Documentation) e, uma vez dentro da documentao, siga o
seguinte caminho:
.NET Framework SDK -> .NET Framework Reference -> .NET Framework Class Library ->
System.Web.UI.WebControls -> BaseValidator Class.
Vamos ao estudo das principais propriedades.
ControlToValidate: Define ou retorna o nome do controle que ser associado ao controle de validao.
EnableClientScript: Habilita/desabilita a gerao automtica de cdigo de validao no cliente, quando o
navegador suporta tal funcionalidade. Esta propriedade do tipo Boleana, podendo assumir os valores True ou
False. Pode ser utilizada para retornar ou definir o valor desta propriedade.
Enabled: Propriedade do tipo Boleana (True ou False) que pode ser utilizada para definir ou retornar um valor
que indica se a validao est habilitada (True) ou desabilitada (False), para o controle.
ErrorMessage: utilizada para definir o texto da mensagem de erro associada ao controle de validao.
Tambm pode ser utilizada para obter o texto da mensagem de erro associada.
ForeColor: Utilizada para definir ou retornar a cor da mensagem de erro que ser exibida quando a
validao falhar.
ID: Define um identificador associado ao controle, identificador este que utilizado no cdigo para acessar as
propriedades e mtodos do controle.
IsValid: Propriedade do tipo Boleana (True ou False), que indica se a validao ocorreu com sucesso ou no.
Por exemplo, se o controle de validao do tipo que exige uma entrada obrigatria (RequiredFieldValidator)
e o usurio no digita nada no campo associado ao controle de validao, o teste de validao ir falhar e esta
propriedade conter o valor False, indicando que o controle no passou no teste de validao.
Principais Mtodos da Classe BaseValidator
Vamos descrever alguns mtodos da classe BaseValidator e apresentar um exemplo prtico. O objetivo deste primeiro
exemplo ver os controles de validao em funcionamento. No iremos explicar o cdigo do exemplo neste momento.
medida que formos avanando no captulo e explicando os diversos controles de validao disponveis, voc poder
voltar a este exemplo e facilmente entender o cdigo do mesmo.
Principais mtodos da classe BaseValidator:
283
CAPTULO 8: VALIDATION SERVER CONTROLS
www.juliobattisti.com.br
Validate: responsvel por fazer a validao do controle associado com o controle de validao e atualizar a
propriedade IsValid para True se a validao ocorrer com sucesso ou para False, caso contrrio.
RegisterValidatorCommonScript: Pode ser utilizado para registrar cdigo na pgina, para que ocorra a
validao no cliente.
Um Exemplo, s Para Comear
Vamos apresentar um pequeno exemplo, para que possamos ver os controles de validao em funcionamento. Conforme
explicado anteriormente, no nos deteremos na explicao do cdigo do exemplo, neste momento.
No exemplo proposto, temos um formulrio com um campo para digitao, onde o
usurio deve digitar um valor entre 1 e 10. Se o usurio no digitar nada, ao clicar no
boto Enviar ser exibida a seguinte mensagem: Voc no digitou nenhum nmero!!.
Quando o usurio digita um nmero entre 1 e 10, a propriedade IsValid torna-se verdadeira
e o evento Click do boto Enviar ser executado. Neste evento gerado um nmero
aleatrio entre 1 e 10. Se o nmero digitado pelo usurio for igual ao nmero gerado
aleatoriamente, exibida a seguinte mensagem: Parabns, voc acertou!!!; caso
contrrio ser exibida a seguinte mensagem: Sinto muito, voc errou!!!.
Na Listagem 8.1 temos o cdigo para o exemplo proposto.
Listagem 8.1 O primeiro exemplo com controles de validao chap8ex1.aspx.
<html>
<head>
<script language=C# runat=server>
void Button_Click(Object sender, EventArgs e)
{
Random rand_number = new Random();
Compare1.ValueToCompare = rand_number.Next(1, 10).ToString();
Compare1.Validate();
if (Page.IsValid)
{
lblOutput.Text = Parabns, voc acertou!!!;
}
else
{
NOTA: O exemplo
apresentado baseado
em um exemplo da
documentao do
Framework .NET.
284 www.juliobattisti.com.br
ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB
lblOutput.Text = Sinto muito, voc errou!!!;
}
lblOutput.Text += <br><br> + O nmero correto era: +
Compare1.ValueToCompare;
}
</script>
</head>
<body>
<form runat=server>
<h3>Exemplo de validao.</h3>
<h5>Digite um nmero entre 1 e 10:</h5>
<asp:RequiredFieldValidator id=Require1"
ControlToValidate=TextBox1"
Type=Integer
ErrorMessage=Voc no digitou nenhum nmero!!
Text=*
runat=server/>
<asp:TextBox id=TextBox1"
runat=server/>
<asp:CompareValidator id=Compare1"
ControlToValidate=TextBox1"
ValueToCompare=0"
EnableClientScript=False
Type=Integer
ErrorMessage=Nmero Incorreto!!
Text=*
runat=server/>
<br>
285
CAPTULO 8: VALIDATION SERVER CONTROLS
www.juliobattisti.com.br
<br>
<asp:Button id=Button1"
Text=Enviar
OnClick=Button_Click
runat=server/>
<br>
<br>
<asp:Label id=lblOutput
Font-Name=verdana
Font-Size=10pt
runat=server/>
<br>
<br>
<asp:ValidationSummary
id=Summary1"
runat=server/>
</form>
</body>
</html>
Digite o cdigo da Listagem 8.1 e salve o mesmo em um arquivo chamado chap8ex1.aspx, na pasta chap8, dentro da
pasta wwwroot, conforme descrito no item: Check List para acompanhar os exemplos deste livro, no Captulo 6.
Para acessar esta pgina utilize o seguinte endereo: http://localhost/chap8/chap8ex1.aspx
D um clique no boto Enviar, sem digitar nenhum valor no campo para digitao. Voc obter o resultado indicado
na Figura 8.1.
Agora digite um nmero entre 1 e 10 e clique no boto Enviar. Se voc acertar o nmero gerado pelo cdigo do
evento Button_Click, ser exibida a mensagem: Parabns, voc acertou!!!; caso contrrio ser exibida a mensagem
indicada na Figura 8.2.
286 www.juliobattisti.com.br
ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB
Figura 8.1: Controles de validao chap8ex1.aspx.
Figura 8.2: O usurio no adivinhou o nmero gerado aleatoriamente.
Prometi que no iria comentar o cdigo deste primeiro exemplo, mas apenas um comentrio rpido, em relao
gerao de nmeros aleatrios. Para gerar um nmero aleatoriamente, entre 1 e 10, declaramos e inicializamos uma
varivel (talvez seria melhor dizer um objeto) do tipo Random:
287
CAPTULO 8: VALIDATION SERVER CONTROLS
www.juliobattisti.com.br
Random rand_number = new Random();
A varivel rand_number baseada na classe Random, do namespace System. Em seguida utilizamos o mtodo Next
da classe Random, para gerar um nmero aleatrio entre 1 e 10.
Agora vamos estudar, em detalhes, os diversos controles de validao do ASP.NET.
O Controle RequiredFieldValidator
Este controle utilizado para garantir que um determinado campo seja preenchido, ou seja, no podemos deixar o
campo em branco. Conforme descrito anteriormente, os controles de validao so utilizados em conjunto com outros
controles do formulrio. Por exemplo, se tivermos um campo Nome, em um formulrio, podemos associar um controle
RequiredFieldValidator com o campo Nome, para garantir que o usurio seja obrigado a preencher o campo Nome.
A sintaxe para este controle a seguinte:
<asp:RequiredFieldValidator
id=identificao no cdigo
runat=server
ControlToValidate=nome do controle associado
ErrorMessage=Mensagem de erro.
ForeColor=Red
BackColor=Grey
>
</asp:RequiredFieldValidator>
Uma sintaxe alternativa a seguinte:
<asp:RequiredFieldValidator
id=identificao no cdigo
runat=server
ControlToValidate=nome do controle associado
ErrorMessage= Mensagem de erro.
ForeColor=Red
BackColor=Grey
/>
Observe que, ao invs de fechar a tag desta maneira: </asp:RequiredFieldValidator>, simplesmente utilizamos um />.
As duas sintaxes so vlidas.
Onde podemos utilizar os seguintes atributos:
288 www.juliobattisti.com.br
ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB
id: um nome que identifica o controle. Este nome utilizado no cdigo para acessar as propriedades e
mtodos do controle.
runat=server: identifica como sendo um controle de servidor. Todos os controles asp: so controles de servidor.
ControlToValidate: Neste atributo definimos o nome do controle que ser validado pelo controle de validao.
Por exemplo, se o controle de validao est associado com um campo Nome do formulrio, nesta propriedade
devemos informar a identificao do controle Nome. A identificao o valor definido na propriedade id do
controle Nome. Esta frase foi repetitiva e enfadonha, de propsito, para que voc no esquea esta associao.
ErrorMessage: Podemos definir uma mensagem de erro que ser exibida, caso a validao do campo falhe.
Por exemplo, o usurio no preencheu um campo de preenchimento obrigatrio.
ForeColor: Utilizado para definir a cor do texto da mensagem de erro.
BackColor: Utilizado para definir a cor de segundo plano do texto da mensagem de erro.
Vamos a um exemplo simples. Vamos criar um formulrio onde temos dois campos:
e-mail
nome
O campo e-mail de preenchimento obrigatrio, j o campo nome de preenchimento opcional. Para garantir que o
campo e-mail seja preenchido vamos associar um controle de validao do tipo RequiredFieldValidator com o campo
e-mail. Se o campo email no for preenchido vamos emitir a seguinte mensagem:
O email de preenchimento obrigatrio, por favor fornea o seu email e clique no
boto Enviar.
Na Listagem 8.2 temos o cdigo para o exemplo proposto.
Listagem 8.2 O controle de validao RequiredFieldValidator.
<html>
<head>
<script language=C# runat=server>
void Enviar_Click(Object sender, EventArgs e)
{
// Cdigo para gravar os dados recebidos no
// banco de dados.
}
</script>
</head>
<body>
289
CAPTULO 8: VALIDATION SERVER CONTROLS
www.juliobattisti.com.br
<form runat=server>
<h3>Exemplo do controle RequiredFieldValidator!!!</h3>
<asp:RequiredFieldValidator id=Requer_email
ControlToValidate=email
Type=String
ErrorMessage=O email de preenchimento obrigatrio,
por favor fornea o seu email e clique
no boto Enviar
Text=O e-mail obrigatrio!!
ForeColor=Red
runat=server/>
<table>
<tr>
<td><h3>Digite o e-mail:</h3> </td>
<td><input id=email type=text size=40 runat=server></td>
</tr>
<tr>
<td><h3>Digite o nome:</h3> </td>
<td><input id=nome type=text size=40 runat=server></td>
</tr>
<tr>
<td><h3>Cadastrar -></h3></td>
<td><input type=submit value=Enviar
OnServerClick=Enviar_Click runat=server>
</td>
</tr>
</table>
<asp:ValidationSummary
290 www.juliobattisti.com.br
ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB
id=Summary1"
runat=server/>
</form>
</body>
</html>
Digite o cdigo da Listagem 8.2 e salve o mesmo em um arquivo chamado chap8ex2.aspx, na pasta chap8, dentro da
pasta wwwroot, conforme descrito no item: Check List para acompanhar os exemplos deste livro, no Captulo 6.
Para acessar esta pgina utilize o seguinte endereo: http://localhost/chap8/chap8ex2.aspx
No campo e-mail digite: jose@abc.com.br. No campo Nome digite: Jos da Silva. D um clique no boto Enviar. Voc
obter o resultado indicado na Figura 8.3.
Figura 8.3: Todos os dados obrigatrios foram digitados. chap8ex2.aspx.
Deixe o campo e-mail em branco. No campo Nome digite: Jos da Silva. D um clique no boto Enviar. Voc obter
o resultado indicado na Figura 8.4.
Observe que neste caso o campo de validao detectou que o campo e-mail no foi preenchido e avisou.
291
CAPTULO 8: VALIDATION SERVER CONTROLS
www.juliobattisti.com.br
Figura 8.4: O controle de validao RequiredFieldValidator entrando em ao.
Vamos entender melhor o cdigo da Listagem 8.2.
Na seo de cdigo no fizemos absolutamente nada. Somente colocamos o evento Enviar_Click e no corpo
do procedimento alguns comentrios. Por exemplo, no corpo deste procedimento poderamos detectar se a
validao ocorreu com sucesso para todos os controles e, em caso afirmativo, enviar as informaes digitadas
pelo usurio para um banco de dados. Por enquanto ainda no sabemos fazer a conexo com banco de dados.
Aprenderemos a conectar com banco de dados a partir do Captulo 10.
Na seo de apresentao criamos um formulrio com dois controles (HtmlServerControls) do tipo texto
(type=text). Um para o usurio digitar o e-mail e outro para digitar o nome. Queremos que o campo e-mail seja
de preenchimento obrigatrio. Para isso utilizamos um controle de validao do tipo RequiredFieldValidator.
A insero do controle de validao feita com o trecho de cdigo a seguir:
<asp:RequiredFieldValidator id=Requer_email
ControlToValidate=email
Type=String
ErrorMessage=O email de preenchimento obrigatrio,
por favor fornea o seu email e clique
no boto Enviar
Text=O e-mail obrigatrio!!
ForeColor=Red
runat=server/>
292 www.juliobattisti.com.br
ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB
O atributo mais importante o seguinte:
ControlToValidate=email
Com a definio deste atributo estamos informando que o campo a ser validado, ou seja, o campo que de preenchimento
obrigatrio o campo e-mail do formulrio. Neste atributo (ControlToValidate) informamos o ID do campo a ser validado.
O texto do atributo ErrorMessage vai ser exibido em um controle do tipo ValidationSumary. Por isso que inclumos
um controle deste tipo, no final do formulrio; caso contrrio o texto definido no atributo ErrorMessage no seria
exibido. No trecho de cdigo a seguir temos a definio do controle ValidationSumary:
<asp:ValidationSummary
id=Summary1"
runat=server/>
O atributo Text define o texto que ser exibido no local onde o controle de validao est definido, caso a validao
falhe. Aqui podemos fazer um teste interessante, para comprovar que realmente gerado cdigo para validao no
Cliente, quando o navegador o Internet Explorer, conforme descrito no incio do captulo. Para provar isto vamos
fazer o seguinte teste:
Clique no campo e-mail e apague o que estiver neste campo. Pressione a tecla <TAB> para ir para o campo Nome.
Observe que o texto O e-mail obrigatrio!! (conforme definido no atributo Text do controle de validao) aparece
acima do campo e-mail, sem que tenhamos clicado no boto Enviar, conforme indicado na Figura 8.5.
Figura 8.5: A validao no cliente, gerada automaticamente para o IE, em ao.
293
CAPTULO 8: VALIDATION SERVER CONTROLS
www.juliobattisti.com.br
Se voc clicar no boto Enviar, estando o campo e-mail em branco tambm ser exibida a mensagem de erro O email
de preenchimento obrigatrio, por favor fornea o seu e-mail e clique no boto Enviar. Este texto est definido no
atributo ErrorMessge do controle de validao Requer_email e exibido no controle Summary1, que um controle do
tipo ValidationSummary, especificamente projetado para exibir mensagens de erro quando algum campo no validado.
Com este exemplo j podemos ter uma boa idia do funcionamento dos controles de validao. Se voc voltar para o
exemplo da Listagem 8.1, j ter condies de entender grande parte do exemplo. Agora vamos continuar estudando
os demais tipos de controle de validao disponveis com o ASP.NET.
O Controle CompareValidator
Este controle utilizado para comparar o valor digitado em um campo associado com o controle CompareValidator,
com um valor constante, com um valor de outro campo (atravs da utilizao da propriedade value deste outro campo)
ou com o valor de um campo de uma tabela em um banco de dados. Se o valor digitado ou selecionado para o campo
no for igual ao valor de comparao, o controle no passar no teste de validao.
A sintaxe para este controle a seguinte:
<asp:CompareValidator
id=identificao no cdigo
runat=server
ControlToValidate=nome do controle associado
ValueToCompare=um valor constante
Type=Tipo do valor a ser comparado: string, Int32, Double, etc.
Operator=Operador de comparao: maior do que, menor do que, etc.
ErrorMessage=Mensagem de erro.
ForeColor=Cor da fonte.
BackColor=Cor de segundo plano
>
</asp:CompareValidator>
Uma sintaxe alternativa a seguinte:
<asp:CompareValidator
id=identificao no cdigo
runat=server
ControlToValidate=nome do controle associado
ValueToCompare=um valor constante
Type=Tipo do valor a ser comparado: string, Int32, Double, etc.
Operator=Operador de comparao: maior do que, menor do que, etc.
294 www.juliobattisti.com.br
ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB
ErrorMessage=Mensagem de erro.
ForeColor=Cor da fonte.
BackColor=Cor de segundo plano
/>
Observe que, ao invs de fechar a tag desta maneira: </asp:CompareValidator>, simplesmente utilizamos um />. As
duas sintaxes so vlidas.
Onde podemos utilizar os seguintes atributos:
id: um nome que identifica o controle. Este nome utilizado no cdigo para acessar as propriedades e
mtodos do controle.
runat=server: identifica como sendo um controle de servidor. Todos os controles asp: so controles de
servidor.
ControlToValidate: Neste atributo definimos o nome do controle que ser validado pelo controle de validao.
Por exemplo, se o controle de validao est associado com um campo Nome do formulrio, nesta propriedade
devemos informar a identificao do controle Nome. A identificao o valor definido na propriedade id do
controle Nome. Esta frase foi repetitiva e enfadonha, novamente, de propsito, para que voc no esquea esta
associao.
ValueToCompare: Define o valor de comparao. Pode ser uma constante, o valor contido em um outro campo
ou em um banco de dados.
Type: Define o tipo de dados do valor de comparao.
Operator: Define o operador de comparao.
ErrorMessage: Podemos definir uma mensagem de erro que ser exibida, caso a validao do campo falhe.
Por exemplo, o usurio no preencheu um campo de preenchimento obrigatrio.
ForeColor: Utilizado para definir a cor do texto da mensagem de erro.
BackColor: Utilizado para definir a cor de segundo plano do texto da mensagem de erro.
Vamos a um exemplo simples. Vamos criar um formulrio onde temos um campo para digitao, onde deve ser
digitado um valor menor do que 100. Vamos utilizar um controle CompareValidator para verificar se o nmero digitado
atende o critrio de ser menor do que 100.
Na Listagem 8.3 temos o cdigo para o exemplo proposto.
Listagem 8.3 O controle de validao CompareValidator.
<html>
<head>
<script language=C# runat=server>
void Enviar_Click(Object sender, EventArgs e)
{
295
CAPTULO 8: VALIDATION SERVER CONTROLS
www.juliobattisti.com.br
// Cdigo para gravar os dados recebidos no
// banco de dados.
}
</script>
</head>
<body>
<form runat=server>
<h3>Exemplo do controle CompareValidator!!!</h3>
<input id=valor type=text size=40 runat=server>
<BR>
<B>
<asp:CompareValidator
id=valida_valor
runat=server
ControlToValidate=valor
ValueToCompare=100"
Type=Double
Operator=LessThan
ErrorMessage=Digite um valor menor do que 100.
ForeColor=Blue
BackColor=Cyan
>
</asp:CompareValidator>
</B>
<BR>
<BR>
<input type=submit value=Enviar OnServerClick=Enviar_Click runat=server>
</form>
</body>
</html>
296 www.juliobattisti.com.br
ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB
Digite o cdigo da Listagem 8.3 e salve o mesmo em um arquivo chamado chap8ex3.aspx, na pasta chap8, dentro da
pasta wwwroot, conforme descrito no item: Check List para acompanhar os exemplos deste livro, no Captulo 6.
Para acessar esta pgina utilize o seguinte endereo: http://localhost/chap8/chap8ex3.aspx
No campo valor digite 50. D um clique no boto Enviar. Observe que nenhuma mensagem de erro emitida.
Agora digite 120 no campo valor. D um clique no boto Enviar. Voc obter uma mensagem de erro, conforme
indicado na Figura 8.6.
Figura 8.6: O controle de validao CompareValidator entrando em ao.
Observe que neste caso o campo de validao detectou que o campo valor possui um valor maior do que 100 e a
mensagem de erro foi exibida.
Vamos comentar a definio de duas propriedades do controle CompareValidator:
ValueToCompare=100" : Esta propriedade define um valor constante para comparao com o valor digitado.
Operator=LessThan: Nesta propriedade definimos o operador de comparao. No exemplo definimos menor
do que (LessThan). Na Tabela 8.1 temos a definio dos operadores permitidos para esta propriedade.
Tabela 8.1 Valores para a propriedade Operator
Valor Descrio
Equal Igual a.
GreaterThan Maior do que.
GreaterThanEqual Maior ou igual a.
297
CAPTULO 8: VALIDATION SERVER CONTROLS
www.juliobattisti.com.br
Ao invs de especificar um valor constante de comparao, utilizando a propriedade ValueToCompare, podemos
utilizar a propriedade ControlToCompare, para utilizar, para comparao, o valor contido em outro controle do
formulrio. Por exemplo, se tivssemos um campo chamado ValorDeReferncia, no formulrio do exemplo da Listagem
8.3, poderamos definir o controle CompareValidator da seguinte maneira:
<asp:CompareValidator
id=valida_valor
runat=server
ControlToValidate=valor
ControlToCompare=ValorDeReferncia
Type=Double
Operator=LessThan
ErrorMessage=Digite um valor menor do que 100.
ForeColor=Blue
BackColor=Cyan
>
</asp:CompareValidator>
Com esta modificao, o valor digitado no campo valor ser comparado com o valor do controle ValorDeReferncia,
devendo ser menor do que este valor, conforme definio da propriedade Operator=LessThan.
O Controle RangeValidator
No item anterior estudamos o controle CompareValidator, o qual permite fazer validaes com base em um determinado
valor e um operador de comparao. Para comparaes que envolvem uma faixa de valores (com limites inferior e
superior), precisamos utilizar o controle RangeValidator. Por exemplo, com o controle RangeValidator podemos verificar
se os valores digitados no campo Salrio esto entre 1000 e 5000.
A sintaxe para este controle a seguinte:
<asp:RangeValidator
id=identificao no cdigo
runat=server
Valor Descrio
LessThan Menor do que.
LessThanEqual Menor ou igual a.
NotEqual Diferente.
NOTA: Estes valores
esto definidos em uma
estrutura do tipo
Enumeration, chamada
ValidationCompareOperator.
Esta estrutura faz parte
do namespace
System.Web.UI.WebControls.
298 www.juliobattisti.com.br
ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB
ControlToValidate=nome do controle associado
MinimumValue=limite inferior da faixa
MaximumValue=limite superior da faixa
Type=Tipo do valor a ser comparado: string, Int32, Double, etc.
ErrorMessage=Mensagem de erro.
ForeColor=Cor da fonte.
BackColor=Cor de segundo plano
>
</asp:RangeValidator>
Uma sintaxe alternativa a seguinte:
<asp:RangeValidator
id=identificao no cdigo
runat=server
ControlToValidate=nome do controle associado
MinimumValue=limite inferior da faixa
MaximumValue=limite superior da faixa
Type=Tipo do valor a ser comparado: string, Int32, Double, etc.
ErrorMessage=Mensagem de erro.
ForeColor=Cor da fonte.
BackColor=Cor de segundo plano
/>
Observe que, ao invs de fechar a tag desta maneira: </asp:RangeValidator>, simplesmente utilizamos um />. As duas
sintaxes so vlidas.
Vamos destacar os seguintes atributos:
MinimumValue: Define o limite inferior da faixa.
MaximumValue: Define o limite superior da faixa.
Vamos a um exemplo simples. Vamos criar um formulrio onde temos um campo para
digitao, onde deve ser digitado um valor maior ou igual a 50 e menor ou igual a 100.
Vamos utilizar um controle RangeValidator para verificar se o nmero digitado atende o
critrio de estar na faixa entre 50 e 100.
Na Listagem 8.4 temos o cdigo para o exemplo proposto.
Listagem 8.4 O controle de validao RangeValidator.
<html>
<head>
NOTA: Os valores
definidos em
MinimumValue e
MaximumValue tambm
fazem parte da faixa de
valores permitidos. Por
exemplo, se
MinimumValue for
definido em 20 e
MaximumValue for
definido em 50; os
valores permitidos so:
Maior ou igual a 20 e
Menor ou igual a 50.
299
CAPTULO 8: VALIDATION SERVER CONTROLS
www.juliobattisti.com.br
<script language=C# runat=server>
void Enviar_Click(Object sender, EventArgs e)
{
// Cdigo para gravar os dados recebidos no
// banco de dados.
}
</script>
</head>
<body>
<form runat=server>
<h3>Exemplo do controle RangeValidator!!!</h3>
<input id=valor type=text size=40 runat=server>
<BR>
<B>
<asp:RangeValidator
id=valida_valor
runat=server
ControlToValidate=valor
MinimumValue=20"
MaximumValue=50"
Type=Double
ErrorMessage=Digite um valor entre 20 e 50!!
ForeColor=Blue
BackColor=Cyan
>
</asp:RangeValidator>
</B>
<BR>
<BR>
<input type=submit value=Enviar OnServerClick=Enviar_Click runat=server>
300 www.juliobattisti.com.br
ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB
</form>
</body>
</html>
Digite o cdigo da Listagem 8.4 e salve o mesmo em um arquivo chamado chap8ex4.aspx, na pasta chap8, dentro da
pasta wwwroot, conforme descrito no item: Check List para acompanhar os exemplos deste livro, no Captulo 6.
Para acessar esta pgina utilize o seguinte endereo: http://localhost/chap8/chap8ex4.aspx
No campo valor digite 35, que um valor dentro da faixa definida no controle RangeValidator: entre 20 e 50. D um
clique no boto Enviar. Observe que nenhuma mensagem de erro emitida.
Agora digite 15 no campo valor. D um clique no boto Enviar. Voc obter uma mensagem de erro, conforme
indicado na Figura 8.7.
Figura 8.7: O controle de validao RangeValidator entrando em ao.
Observe que neste caso o campo de validao detectou que o campo valor possui um valor fora da faixa (entre 20 e 50)
e a mensagem de erro foi exibida.
O Controle CustomValidator
Este controle permite que criemos nossas prprias regras de validao. Por exemplo, podemos precisar de um controle
de validao para verificar se o nmero digitado em um controle divisvel por 5. Outro exemplo poderia ser a criao
de um controle para fazer a validao do dgito verificador de um campo CPF ou CNPJ. Para validaes complexas,
301
CAPTULO 8: VALIDATION SERVER CONTROLS
www.juliobattisti.com.br
deste tipo, no temos controles prontos, precisamos criar um controle personalizado, utilizando como base o controle
CustomValidator e definindo as funes de validao correspondentes.
A sintaxe para este controle a seguinte:
<asp:CustomValidator
id=identificao no cdigo
runat=server
ControlToValidate=controle a ser validado
ClientValidationFunction=Nome da funo que far a validao para validao no
Cliente.
OnServerValidate=Nome do procedimento na seo de cdigo da pgina para
validao no servidor
ErrorMessage=Mensagem de erro
ForeColor=Cor do texto da mensagem de erro.
BackColor=Cor de segundo plano da mensagem de erro.
>
</asp:CustomValidator>
A validao pode ser definida para acontecer no cliente, sem que a pgina tenha sido enviada para processamento ou
no servidor, quando a pgina enviada para processamento.
Para a validao no cliente, especificamos o nome da funo de validao, no atributo ClientValidationFunction.
A funo deve ser escrita em uma linguagem suportada pelo navegador do cliente, como por exemplo VBScript
ou JScript.
Para a validao no servidor, especificamos o nome de um procedimento de validao, no atributo OnServerValidate.
A funo no servidor pode ser escrita em qualquer linguagem suportada pelo Framework .NET, como por exemplo:
VB.NET, C#, JScript.NET, C++, etc.
Outro detalhe importante que podemos utilizar mais do que um controle de validao associado com o mesmo
campo. Vamos imaginar um campo quantidade em um formulrio de compra. Podemos utilizar um controle
RequiredFieldValidator para fazer com que o usurio seja obrigado a digitar um valor neste campo e um controle
CustomValidator para garantir que o valor digitado no seja maior do que o valor em estoque. A funo de validao
do controle CustomValidator pode buscar no banco de dados de estoque a quantidade de itens disponveis e no
aceitar que o usurio digite um valor maior do que o disponvel em estoque.
A seguir apresentamos um exemplo da documentao do Framework .NET, onde foi utilizado um controle
CustomValidator para fazer com que seja digitado um nmero par em um campo do formulrio. Observe que, embora
seja uma funo simples de validao, no temos um controle especfico para esta funo. Por isso precisamos criar
uma funo de validao. No exemplo apresentado, temos a validao no servidor. O nome do procedimento que far
302 www.juliobattisti.com.br
ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB
a validao no servidor definido no atributo OnServerValidate, do controle de validao, conforme indicado no
comando a seguir:
OnServerValidate=ServerValidation
onde ServerValidation o nome do procedimento, na seo de cdigo da pgina, que far a validao para determinar
se o nmero par ou mpar.
O procedimento ServerValidation recebe, como primeiro parmetro, uma referncia para o controle de validao e
como segundo parmetro um objeto que contm o valor do campo a ser validado, valor este que acessvel atravs da
propriedade Value deste segundo argumento. Na listagem do exemplo, antes da funo de validao, coloquei vrios
comentrios que explicam detalhadamente a utilizao dos parmetros da funo de validao.
Na Listagem 8.5 temos o cdigo para o exemplo proposto.
Listagem 8.5 O controle de validao CustomValidator.
<%@ Page Language=C# %>
<html>
<head>
<script runat=server>
void ValidateBtn_OnClick(object sender, EventArgs e)
{
if (Page.IsValid)
{
lblOutput.Text = A pgina foi validada com sucesso.;
}
else
{
lblOutput.Text = Pgina no validada!;
}
}
// Procedimento que faz a validao do controle.
// Este procedimento recebe dois argumentos.
// O argumento source, do tipo object, uma referncia ao prprio controle de
// validao.
// O segundo argumento do tipo ServerValidateEventArgs.
// a sua propriedade Value contm o valor digitado no campo associado
// ao controle de validao do tipo CustomValidator.
303
CAPTULO 8: VALIDATION SERVER CONTROLS
www.juliobattisti.com.br
// Por isso, dentro da funo ServerValidation, para acessar o valor digitado
// no campo a ser validado, utilizamos a seguinte referncia:
// args.Value.
// Alm disso, utilizamos o mtodo Parse, da estrutura int, para converter
// a referncia args.Value, no valor Int32 correspondente.
void ServerValidation (object source, ServerValidateEventArgs args)
{
try
{
int i = int.Parse(args.Value);
args.IsValid = ((i%2) == 0);
}
catch
{
args.IsValid = false;
}
}
</script>
</head>
<body>
<form runat=server>
<h3><font face=Verdana>Exemplo do controle CustomValidator!!</font></h3>
<asp:Label id=lblOutput runat=server
Text=Digite um nmero par:
Font-Name=Verdana
Font-Size=10pt /><br>
<p>
<asp:TextBox id=Text1"
runat=server />
&nbsp;&nbsp;
304 www.juliobattisti.com.br
ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB
<asp:CustomValidator id=CustomValidator1"
ControlToValidate=Text1"
OnServerValidate=ServerValidation
Display=Static
ErrorMessage=No um nmero par!
ForeColor=green
Font-Name=verdana
Font-Size=10pt
runat=server/>
<p>
<asp:Button id=Button1"
Text=Validar
OnClick=ValidateBtn_OnClick
runat=server/>
</form>
</body>
</html>
Digite o cdigo da Listagem 8.5 e salve o mesmo em um arquivo chamado chap8ex5.aspx, na pasta chap8, dentro da
pasta wwwroot, conforme descrito no item: Check List para acompanhar os exemplos deste livro, no Captulo 6.
Para acessar esta pgina utilize o seguinte endereo: http://localhost/chap8/chap8ex5.aspx
No campo de digitao digite 2. D um clique no boto Enviar. Observe que nenhuma mensagem de erro emitida,
uma vez que dois um nmero par.
Agora digite 5 no campo de digitao. D um clique no boto Enviar. Voc obter uma mensagem de erro, conforme
indicado na Figura 8.8.
Algumas observaes sobre o exemplo.
Na funo de validao ServerValidation, utilizamos a estrutura Try Catch para fazer o tratamento de excees.
Dentro da funo ServerValidation, utilizamos o seguinte comando para determinar se o nmero par:
args.IsValid = ((i%2) == 0);
Neste caso, se o resto da diviso por 2 for zero, significa que o nmero par e a propriedade IsValid definida como
True, significando que o valor digitado par. Se o resto da diviso por dois no for igual a zero, a propriedade IsValid
definida como False, significando que o nmero digitado mpar. Lembre que o operador % retorna o resto da
diviso entre dois nmeros inteiros.
305
CAPTULO 8: VALIDATION SERVER CONTROLS
www.juliobattisti.com.br
Figura 8.8: O controle de validao CustomValidator entrando em ao.
Tambm utilizamos dois controles do tipo Web Server Controls, para o campo de digitao
e para o boto Validar. No Captulo 8 aprenderemos a utilizar os Web Server Controls.
Utilizamos o evento Click do boto Validar, para determinar se a pgina foi validada ou
no. Apenas para lembrar, a propriedade IsValid do objeto Page somente True quando
todos os controles da pgina passarem no teste de validao; basta que um nico controle
no seja validado, para que a propriedade Page.IsValid se torne False.
O Controle RegularExpressionValidator
Este controle utilizado para garantirmos que a entrada digitada est em um determinado formato. Por exemplo,
podemos utilizar este controle para fazer com que o usurio digite o CPF no seguinte formato: 111.111.111-11. Ou
que digite o CEP no seguinte formato: 11111-111.
A sintaxe para este controle a seguinte:
<asp:RegularExpressionValidator
id=identificao_no_cdigo
runat=server
ControlToValidate=Controle a ser validado
ValidationExpression=Uma expresso do tipo Regular Expression.
ErrorMessage=Mensagem de erro.
ForeColor=Cor da fonte da mensagem de erro.
NOTA: Para maiores
informaes sobre o
tratamento de excees e
sobre os operadores do
C#, consulte os Captulos
3, 4 e 5.
306 www.juliobattisti.com.br
ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB
BackColor=Cor de segundo plano da fonte da mensagem de erro.
>
</asp: RegularExpressionValidator>
A maior dificuldade de utilizarmos este controle a definio correta do atributo ValidationExpression. Para voc ter
uma idia da complexidade da criao de expresses regulares existe um livro somente sobre este assunto: Mastering
Regular Expressions: Powerful Techniques for Perl and Other Tools. Editora: (OReilly Nutshell). Pginas: 368
Para uma lista de artigos sobre expresses regulares, consulte o seguinte endereo: http://www.4guysfromrolla.com/
webtech/RegularExpressions.shtml
Vamos apresentar um exemplo, onde vamos utilizar o controle RegularExpressionValidator para verificar o formato
do CPF digitado pelo usurio. O CPF tem o seguinte formato padro:
nnn.nnn.nnn-nn
Onde n significa nmero.
Na Listagem 8.6 temos o cdigo para o exemplo proposto.
Listagem 8.6 O controle de validao CustomValidator.
<html>
<head>
<script language=C# runat=server>
void Enviar_Click(Object sender, EventArgs e)
{
// Cdigo para gravar os dados recebidos no
// banco de dados.
}
</script>
</head>
<body>
<form runat=server>
<h3>Exemplo do controle RegularExpressionValidator!!!</h3>
307
CAPTULO 8: VALIDATION SERVER CONTROLS
www.juliobattisti.com.br
<input id=cpf type=text size=40 runat=server>
<BR>
<BR>
<B>
<asp:RegularExpressionValidator
id=valida_valor
runat=server
ControlToValidate=cpf
ValidationExpression=[0-9]{3}\.[0-9]{3}\.[0-9]{3}\-[0-9]{2}
ErrorMessage=Digite um CPF no formato 111.111.111-11"
ForeColor=Blue
BackColor=Cyan
/>
</B>
<BR>
<BR>
<input type=submit value=Enviar OnServerClick=Enviar_Click runat=server>
</form>
</body>
</html>
Digite o cdigo da Listagem 8.6 e salve o mesmo em um arquivo chamado chap8ex6.aspx, na pasta chap8, dentro da
pasta wwwroot, conforme descrito no item: Check List para acompanhar os exemplos deste livro, no Captulo 6.
Para acessar esta pgina utilize o seguinte endereo: http://localhost/chap8/chap8ex6.aspx
No campo de digitao digite 111.111.111-11, ou seja, um CPF no formato correto. D um clique no boto Enviar.
Observe que nenhuma mensagem de erro emitida, uma vez que o CPF est no formato definido pelo controle
RegularExpressionValidator.
Agora digite 11111111111 no campo de digitao, ou seja, sem os pontos e o trao. D um clique no boto Enviar.
Voc obter uma mensagem de erro, conforme indicado na Figura 8.9.
A def inio do formato aceito para o campo CPF feita atravs de uma expresso regular, no atributo
ValidationExpression, conforme indicado a seguir:
ValidationExpression=[0-9]{3}\.[0-9]{3}\.[0-9]{3}\-[0-9]{2}
308 www.juliobattisti.com.br
ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB
O [0-9] indica que o caractere digitado deve ser um valor entre 0 e 9. O {3} entre chaves indica que os trs primeiros
caracteres devem estar entre 0 e 9. Todo caractere que deve ser digitado diretamente deve ser precedido de uma barra
invertida. o caso do ponto que deve ser digitado aps os trs primeiros nmeros. Utilizando este mesmo raciocnio,
definimos o restante da expresso.
Figura 8.9: O controle de validao RegularExpressionValidator entrando em ao.
Apenas para exemplificar, coloco como ficaria uma expresso para o CEP:
ValidationExpression=[0-9]{5}\-[0-9]{3}
Concluso
Neste captulo aprendemos a utilizar os controles de validao do ASP.NET. Aprendemos a utilizar os seguintes controles:
RequiredFieldValidator Control
CompareValidator Control
RangeValidator Control
CustomValidator Control
RegularExpressionValidator Control
Tambm apresentamos diversos exemplos para ilustrar o funcionamento destes controles.
No prximo captulo vamos aprender a utilizar uma srie de Web Server Controls.
309
CAPTULO 9: WEB FORM CONTROLS
www.juliobattisti.com.br
Introduo
No Captulo 7 estudamos os HTML Server Controls, os quais so, basicamente,
os controles HTML para a criao de formulrios, porm processados no servidor.
Ao ser processado no servidor, cada controle compilado como um objeto
incorporado pgina ASP.NET. Por ser um objeto temos acesso, via cdigo de
programao, a uma srie de propriedades e mtodos de cada controle. Com este
novo modelo, o Framework .NET traz para o desenvolvimento Web um modelo
baseado em eventos, muito parecido com o modelo de desenvolvimento baseado
em eventos de aplicaes Windows tradicionais.
Em seguida, no Captulo 8 tratamos dos controles de validao Validation Server
Controls. Estes controles tambm so processados no servidor, porm no existem
controles HTML correspondentes. Os controles de validao fazem parte de um
conjunto de controles maior, conhecido como Web Server Controls. Salientamos
que os Web Server Controls so definidos pela tag <asp: ...
No presente captulo vamos continuar o nosso estudo sobre os controles de servidor.
Vamos aprender a utilizar um conjunto de controles que nos permitem criar uma
interface visual mais aprimorada, com maior riqueza de detalhes, dando um aspecto
mais profissional a nossas pginas ASP.NET. Estes controles so chamados de
Web Form Controls.
Os controles que estudaremos neste captulo so, a exemplo dos controles de
validao, Web Server Controls. Vamos aprender a utilizar controles para a criao
de interface, onde o usurio pode digitar informaes, e interagir com a pgina.
Na prtica estudaremos controles que podem ser utilizados no lugar dos HTML
Server Controls, para a criao de pginas com uma interface mais profissional.
Todos os Web Form Controls so derivados de uma classe bsica: WebControl.
Esta classe pertence ao namespace System.Web.UI.WebControls. Iniciaremos o
captulo estudando as propriedades e mtodos desta classe. Por serem derivados
desta classe bsica, os Web Form Controls herdam as propriedades e mtodos da
classe bsica.
Em seguida passaremos ao estudo dos seguintes Web Form Controls:
TextBox
Label
CheckBox
RadioButton
Button
C A P T U L O
9
Web Form Controls
310 www.juliobattisti.com.br
ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB
ListBox
Table, TableCell e TableRow
Panel
Image
HyperLink
LinkButton
ImageButton
Estes controles nos do acesso a um grande nmero de propriedades e eventos, o que
permite um controle bastante preciso sobre o layout e a funcionalidade de uma pgina
ASP.NET, o que justifica a existncia de mais um conjunto de controles, alm do conjunto
dos HTML Server Controls. medida que formos estudando os diversos controles,
iremos apresentar exemplos de utilizao dos mesmos.
A Classe Bsica WebControl
A classe WebControl, do namespace System.Web.UI.WebControls, a classe da qual so derivados os controles que
iremos estudar neste captulo. Esta classe define os mtodos, eventos e propriedades comuns a todos os controles
pertencentes ao namespace System.Web.UI.WebControls. Por serem derivados da classe WebControl, estes controles
iro herdar suas propriedades e mtodos pblicos. Estudaremos as principais propriedades e mtodos da classe
WebControl.
Principais Propriedades da Classe WebControl
Na Tabela 9.1 temos a descrio das principais propriedades da classe WebControl.
Tabela 9.1 Propriedades da classe WebControl.
NOTA: Para acompanhar
os exemplos deste
captulo importante que
voc tenhas estudado os
Captulos 3, 4 e 5, os
quais tratam dos aspectos
bsicos da Linguagem C#.
Propriedade Descrio
AccessKey utilizada para definir ou retornar uma combinao de teclas (tecla de atalho) utilizada
para colocar o foco no controle.
BackColor utilizada para definir ou retornar a cor de segundo plano, do controle.
BorderColor utilizada para definir ou retornar a cor das bordas do controle.
BorderStyle utilizada para definir ou retornar o estilo das bordas do controle.
BorderWidth utilizada para definir ou retornar a largura das bordas do controle.
ControlStyle utilizada para definir ou retornar o estilo (aspectos visuais) do controle, como por
exemplo: com ou sem preenchimento, com sombra, etc.
311
CAPTULO 9: WEB FORM CONTROLS
www.juliobattisti.com.br
Propriedade Descrio
Enabled Propriedade do tipo Boleana (True ou False), utilizada para definir
ou retornar um valor que indica se o controle est habilitado:
True = habilitado e False=desabilitado.
EnableViewState Propriedade do tipo Boleana (True ou False), utilizada para definir
ou retornar um valor que indica se o controle de estado est
habilitado (True) ou desabilitado (False).
Font Retorna informaes sobre a fonte utilizada para o controle.
ForeColor utilizada para definir ou retornar informaes sobre a cor do texto
do controle.
Height utilizada para definir ou retornar a altura do controle.
Style Faz referncia a uma coleo de propriedades do tipo CSS
Cascading Style Sheets, associadas com o controle.
TabIndex utilizada para definir ou retornar informaes sobre o ndice de
tabulao do controle. O ndice de tabulao define a ordem de
deslocamento do cursor, dentro de um formulrio, quando
pressionamos a tecla TAB. Por exemplo, se estamos em um campo
com ndice de tabulao 2 e pressionamos a tecla TAB, o cursor ir
para o controle com ndice de tabulao 3.
ToolTip utilizada para definir ou retornar um pequeno texto que ser
exibido quando o usurio apontar o mouse para o controle.
Visible Propriedade boleana, utilizada para retornar ou definir um valor
que indica se o controle deve ser exibido (True) ou no (False).
Width utilizada para definir ou retornar a largura do controle.
Estas propriedades esto disponveis para todos os controles derivados da classe WebControl; em outras palavras, os
controles que tm a classe WebControl como base iro herdar estas propriedades.
Principais Mtodos da Classe WebControl
Na Tabela 9.2 temos a descrio dos principais mtodos da classe WebControl.
Tabela 9.2 Mtodos da classe WebControl.
Propriedade Descrio
CopyBaseAttributes Copia o valor das propriedades AccessKey, Enabled, TabIndex e Attributes para o controle
atual, a partir de um controle especificado como parmetro para o mtodo. semelhante
ao que faz a ferramenta pincel nos aplicativos do Microsoft Office, quando copia uma
srie de caractersticas de formatao de um pargrafo para outro.
312 www.juliobattisti.com.br
ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB
Principais Eventos da Classe WebControl
Na Tabela 9.3 temos a descrio dos principais eventos da classe WebControl.
Tabela 9.3 Eventos da classe WebControl.
Propriedade Descrio
DataBind Faz a associao de uma fonte de dados com o controle e com todos os seus controles
filhos.
Equals Determina se duas instncias de um controle so iguais.
FindControl Procura um determinado controle no Conteiner atual. Normalmente o Conteiner atual a
pgina ASP.NET onde est o controle.
HasControls Retorna um valor Boleano indicando se o controle possui controles filhos (True) ou no
(False).
ToString Retorna uma representao do controle, no formato String.
Agora vamos passar ao estudo de cada controle, individualmente.
TextBox Web Server Control
Este controle utilizado para criar uma caixa de texto para digitao de texto. Podemos criar uma caixa de texto de
uma nica linha ou de mltiplas linhas (o que crivamos utilizando um HTMLTextArea Server Control).
Por padro, a propriedade TextMode definida como SingleLine, o que significa que o controle tem uma nica linha.
Para definir este controle com mltiplas linhas, devemos definir a propriedade TextMode para MultiLine. Tambm
podemos definir esta propriedade com o valor Password, para criar um texto para digitao de senhas, onde so
exibidos apenas asteriscos enquanto o usurio digita a senha.
Evento Descrio
DataBinding Ocorre quando o controle ligado (associado) a uma fonte de dados.
Disposed Ocorre quando o controle descarregado da memria, o qual o ltimo estgio no ciclo
de vida do controle quando a pgina ASP.NET carregada.
Init Ocorre quando o controle inicializado, o que o primeiro estgio no seu ciclo de vida.
Load Ocorre quando o objeto, que representa uma instncia do controle, carregado no objeto
Page, que representa a pgina sendo carregada. Lembre que toda pgina ASP.NET ao ser
carregada compilada em um objeto que uma instncia da classe Page.
313
CAPTULO 9: WEB FORM CONTROLS
www.juliobattisti.com.br
A largura da caixa de texto definida pela propriedade Columns. Se a caixa de texto for de mltiplas linhas, a sua
altura def inida pela propriedade Rows. Este controle derivado da classe TextBox, do namespace
System.Web.UI.WebControls.
A sintaxe para este controle a seguinte:
<asp:TextBox id=value
AutoPostBack=True|False
Columns=Nmero de colunas
MaxLength=Tamanho mximo do texto a ser digitado
Rows=Nmero de linhas.
Text=Texto para a caixa de digitao.
TextMode=Single | Multiline | Password
Wrap=True|False
OnTextChanged=OnTextChangedMethod
runat=server
/>
A propriedade AutoPostBack do tipo Boleana, podendo assumir os valores True ou False. Se o valor desta propriedade
estiver definido em True, um PostBack ser gerado para o servidor, toda vez que o valor do controle for alterado. Por
padro, o valor desta propriedade definido como False. Se for definida para True, toda vez que o valor do controle
for alterado, o controle reenvia para o servidor (postback) o seu valor e o valor de todos os controles do formulrio.
Algo parecido com disparar um evento Aps alterar, para um campo de um formulrio criado com o Microsoft
Access ou com o VB.
A propriedade Wrap define se deve ser feita uma quebra automtica de linha, cada vez que o texto atinge o limite da
caixa de texto.
OnTextChanged um mtodo que dispara o evento TextChanged, para o qual podemos definir um procedimento que
ser executado em resposta ao evento.
Vamos a um exemplo simples. Vamos criar um formulrio onde temos trs campos:
Nome
Senha
Comentrios
O usurio preenche os dados e clica no boto Enviar. Vamos criar um procedimento para o evento Click do boto
Enviar. Este procedimento ir exibir, em um controle HtmlTextArea, os valores digitados pelo usurio, com exceo
da senha.
Na Listagem 9.1 temos o cdigo para o exemplo proposto.
314 www.juliobattisti.com.br
ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB
Listagem 9.1 O controle TextBox chap9ex1.aspx.
<html>
<script language=C# runat=server>
public void Enviar_Click(Object sender,EventArgs e)
{
Exibe.Value = Nome.Text + \n + Seus comentrios:
+ \n + Comentrios.Text;
}
</script>
<body>
<form method=post runat=server>
<H2> Exemplo do controle TextBox!!</H2>
<table>
<tr>
<td><h3>Nome:</h3> </td>
<td>
<asp:TextBox runat=server
id=Nome
Text=
Font_Face=Arial
Font_Size=3"
BackColor=Cyan
ForeColor=Blue
BorderColor=Red
TextMode=SingleLine
Columns=40"
/>
</td>
</tr>
<tr>
315
CAPTULO 9: WEB FORM CONTROLS
www.juliobattisti.com.br
<td><h3>Senha:</h3> </td>
<td>
<asp:TextBox runat=server
id=Senha
Text=
Font_Face=Arial
Font_Size=3"
BackColor=Cyan
ForeColor=Blue
BorderColor=Green
TextMode=Password
Columns=40"
/>
</td>
</tr>
<tr>
<td><h3>Comentrios:</h3> </td>
<td>
<asp:TextBox runat=server
id=Comentrios
Text=
Font_Face=Arial
Font_Size=2"
BackColor=Silver
ForeColor=Blue
BorderColor=Green
TextMode=MultiLine
Rows=10"
Columns=30"
/>
</td>
</tr>
<tr>
<td><h3>Voc digitou:</h3></td>
316 www.juliobattisti.com.br
ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB
<td><textarea id=Exibe cols=40" rows=5" runat=server /></td>
</tr>
<tr>
<td><B>Clique no boto></B></td>
<td>
<input type=submit value=Enviar OnServerClick=Enviar_Click
runat=server>
</td>
</tr>
</table>
</form>
</body>
</html>
Digite o cdigo da Listagem 9.1 e salve o mesmo em um arquivo chamado chap9ex1.aspx, na pasta chap9, dentro da
pasta wwwroot, conforme descrito no item: Check List para acompanhar os exemplos deste livro, no Captulo 6.
Para acessar esta pgina utilize o seguinte endereo: http://localhost/chap9/chap9ex1.aspx
No campo Nome digite: Jos abc da silva.
No campo Senha digite: 123456.
No campo de comentrios digite o seguinte texto:
Estudo dos Web Form Controls do ASP.NET.
Controles avanados e com melhor interface visual, com acesso a uma variedade de mtodos, propriedades e eventos.
D um clique no boto Enviar. Voc obter o resultado indicado na Figura 9.1.
Observe que o controle que exibe os valores digitados pelo usurio no consegue exibir todo o contedo digitado; por
isso uma barra de rolagem vertical disponibilizada.
No evento Click do boto Enviar, definimos a propriedade Value do controle Exibe como sendo a concatenao dos
valores digitados nos campos Nome e Comentrios. Para concatenar strings, apenas para lembrar, utilizamos o operador
+. O \n define uma quebra de linha. Tambm importante salientar que, para obter o valor digitado nos controles,
utilizamos a propriedade Text. Nos controles do tipo HtmlServer, utilizvamos a propriedade Value, ao invs da
317
CAPTULO 9: WEB FORM CONTROLS
www.juliobattisti.com.br
propriedade Text. Alis estamos fazendo isto neste exemplo, pois o controle que exibe os valores digitados pelo
usurio um controle do tipo HtmlServer. Para definir o que o controle ir exibir, estamos definindo a sua propriedade
Value, conforme indicado no trecho de cdigo a seguir:
public void Enviar_Click(Object sender,EventArgs e)
{
Exibe.Value = Nome.Text + \n + Seus comentrios:
+ \n + Comentrios.Text;
}
Figura 9.1: Utilizando o controle TextBox com as opes SingleLine, Password e MultiLine.
318 www.juliobattisti.com.br
ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB
Label Web Server Control
Este controle utilizado para exibir texto em um formulrio. Podemos acessar suas
propriedades e mtodos, inclusive alterar o texto do controle, atravs de programao.
A sintaxe para este controle a seguinte:
<asp:Label
id=identificao_no_cdigo
Text=Texto a ser exibido
runat=server/>
ou
<asp:Label
id=Identificao_no_cdigo
runat=server>
Text a ser exibido
</asp:Label>
Para definir o texto a ser exibido em um controle Label, utilizamos a propriedade Text do controle.
A seguir um exemplo que adiciona um controle do tipo Label, com o texto inicial Este o texto original do controle.
Ao clicarmos no boto Enviar, o evento Click deste boto altera o texto do Label para Este o texto modificado.
Na Listagem 9.2 temos o cdigo para o exemplo proposto.
Listagem 9.2 O controle Label chap9ex2.aspx.
<html>
<script language=C# runat=server>
public void Enviar_Click(Object sender,EventArgs e)
{
Rotulo1.Text=Este o texto modificado;
}
</script>
<body>
<form method=post runat=server>
IMPORTANTE: Voc deve
estar lembrado de que,
nas verses anteriores do
ASP, no podamos
quebrar um comando
em vrias linhas, sem
colocar um caractere
especial, no final de cada
linha. Com ASP.NET, no
temos mais esta
limitao; observe que
podemos dividir o
comando em diversas
linhas, sem maiores
problemas.
319
CAPTULO 9: WEB FORM CONTROLS
www.juliobattisti.com.br
<H2> Exemplo do controle Label!!</H2>
<b>
<asp:Label
id=Rotulo1"
Text=Este o texto original do controle
BackColor=Black
ForeColor=White
runat=server
/>
</b>
<BR>
<BR>
<table>
<tr>
<td><B>Clique no boto></B></td>
<td>
<input type=submit value=Enviar OnServerClick=Enviar_Click
runat=server>
</td>
</tr>
</table>
</form>
</body>
</html>
Digite o cdigo da Listagem 9.2 e salve o mesmo em um arquivo chamado chap9ex2.aspx, na pasta chap9, dentro da
pasta wwwroot, conforme descrito no item: Check List para acompanhar os exemplos deste livro, no Captulo 6.
Para acessar esta pgina utilize o seguinte endereo: http://localhost/chap9/chap9ex2.aspx
Ao carregar a pgina ser exibido o texto Este o texto original do controle. Observe que o texto est com cor
de fundo preta e cor de fonte branco, conforme definimos nas propriedades do controle Label. D um clique no
boto Enviar. O texto do controle do tipo Label alterado para Este o texto modificado, conforme indicado
na Figura 9.2.
320 www.juliobattisti.com.br
ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB
Figura 9.2: Utilizando o controle Label chap9ex2.aspx.
CheckBox Web Server Control
Este controle utilizado para a criao de um controle do tipo caixa de seleo. Este tipo de controle pode assumir
dois estados: marcado ou no marcado. Ao clicar no controle, o seu estado alterado, isto , se estiver marcado, ele
ser desmarcado; se estiver desmarcado, ele ser marcado.
O evento CheckedChanged disparado quando o formulrio enviado para o servidor
e o status (marcado/desmarcado) do controle foi alterado em relao ao ltimo envio do
formulrio.
A sintaxe para este controle a seguinte:
<asp:CheckBox
id=identificao_no_cdigo
AutoPostBack=True|False
Text=Rtulo de texto associado ao controle.
TextAlign=Right|Left
Checked=True|False
OnCheckedChanged=Mtodo que ser executado em resposta ao evento
OnCheckedChanged
runat=server
/>
NOTA: Para criar mltiplos
controles do tipo CheckBox,
de uma s vez, ligados a
uma fonte de dados,
devemos utilizar o controle
CheckBoxList. Aprenderemos
a utilizar este controle nos
Captulos 10 e 11.
321
CAPTULO 9: WEB FORM CONTROLS
www.juliobattisti.com.br
Vamos apresentar um exemplo de utilizao do controle CheckBox. O nosso exemplo constitudo de um formulrio
no qual temos trs controles do tipo CheckBox, onde o usurio pode selecionar um ou mais controles. Ao clicar no
boto Enviar, o evento Click deste boto informa, em um controle do tipo Label, quais as opes selecionadas.
Na Listagem 9.3 temos o cdigo para o exemplo proposto.
Listagem 9.3 O controle CheckBox chap9ex3.aspx.
<html>
<script language=C# runat=server>
public void Enviar_Click(Object sender,EventArgs e)
{
//Declarao das variveis auxiliares
String Aux=Opes selecionadas: ;
// Comeo a montar uma string que ser atribuda
// propriedade Value do controle Dados.
if (Negcios.Checked==true)
{
Aux= Aux +Negcios ;
}
if (Direito.Checked==true)
{
Aux= Aux +Direito ;
}
if (Economia.Checked==true)
{
Aux= Aux +Economia ;
}
Exibe.Text = Aux;
322 www.juliobattisti.com.br
ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB
}
</script>
<body>
<form method=post runat=server>
<table>
<tr>
<td colspan=2"><H2>Selecione as reas de interesse:</H2></td>
</tr>
<tr>
<td><B>Opo 1:</B> </td>
<td>
<asp:CheckBox
id=Negcios runat=server
Text=Negcios
AutoPostBack=True
/>
</td>
</tr>
<tr>
<td><B>Opo 2:</B> </td>
<td>
<asp:CheckBox
id=Direito
runat=server
Text=Direito
AutoPostBack=True
/>
</td>
</tr>
323
CAPTULO 9: WEB FORM CONTROLS
www.juliobattisti.com.br
<tr>
<td><B>Opo 3:</B> </td>
<td>
<asp:CheckBox
id=Economia
runat=server
Text=Economia
AutoPostBack=True
/>
</td>
</tr>
<tr>
<td><B>Clique no boto ></B></td>
<td>
<input type=submit value=Enviar
OnServerClick=Enviar_Click
runat=server>
</td>
</tr>
<tr>
<td><B>Dados do cliente:</B> </td>
<td>
<b>
<asp:Label
id=Exibe
Text=
BackColor=Black
ForeColor=White
runat=server
/>
</b>
</td>
</tr>
</table>
</form>
</body>
</html>
324 www.juliobattisti.com.br
ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB
Figura 9.3: Utilizando o controle CheckBox chap9ex3.aspx.
Neste exemplo estamos utilizando a propriedade Checked para verificar se o controle foi ou no selecionado. No final
do procedimento Enviar_Click, definimos o texto do controle do tipo Label, como sendo igual ao contedo da varivel
Aux. Observe que para fazer esta definio utilizamos a propriedade Text, conforme
indicado no comando a seguir:
Exibe.Text = Aux;
RadioButton Web Server Control
Este controle utilizado para a criao de controles do tipo Boto de rdio. Estes
controles so criados em grupos, sendo que somente um dos controles do grupo pode
ser selecionado. Para criar um grupo de controles do tipo RadioButton, devemos definir
o mesmo valor para a propriedade GroupName, de todos os controles que fazem parte
do grupo.
NOTA: Para criar
mltiplos controles do tipo
RadioButton, de uma s
vez, ligados a uma fonte
de dados, devemos
utilizar o controle
RadioButtonList.
Aprenderemos a utilizar
este controle nos
Captulos 10 e 11.
Digite o cdigo da Listagem 9.3 e salve o mesmo em um arquivo chamado chap9ex3.aspx, na pasta chap9, dentro da
pasta wwwroot, conforme descrito no item: Check List para acompanhar os exemplos deste livro, no Captulo 6.
Para acessar esta pgina utilize o seguinte endereo: http://localhost/chap9/chap9ex3.aspx
Ao carregar a pgina ser exibido um formulrio com trs controles do tipo CheckBox, o boto Enviar e um controle
do tipo Label. Selecione as opes Negcios e Economia. D um clique no boto Enviar. As opes selecionadas sero
informadas em um controle do tipo Label, conforme indicado na Figura 9.3.
325
CAPTULO 9: WEB FORM CONTROLS
www.juliobattisti.com.br
O Controle RadioButton Web Server Control derivado da classe base RadioButton, do namespace
System.Web.UI.WebControls.
A sintaxe para este controle a seguinte:
<asp:RadioButton
id=Identificao_no_cdigo
AutoPostBack=True|False
Checked=True|False
GroupName=Nome do Grupo.
Text=Rtulo de texto que identifica o controle
TextAlign=Right|Left
OnCheckedChanged=Mtodo que ser executado em resposta ao evento
OnCheckedChanged
runat=server
/>
Considere o trecho de cdigo a seguir:
<asp:RadioButton
id=Carto
Text=Carto de Crdito:
Checked=True
GroupName=GrupoPagamento
runat=server />
<asp:RadioButton
id=Transferncia
Text=Transferncia Eletrnica:
GroupName=GrupoPagamento
runat=server/>
<asp:RadioButton id=Boleto
Text=Boleto Bancrio
GroupName=GrupoPagamento
runat=server/>
Neste trecho criamos um grupo chamado GrupoPagamento, o qual possui trs controles do tipo RadioButton:
Carto
Transferncia
Boleto
Ao carregarmos a pgina, o controle Carto j vem selecionado, pois definimos a sua propriedade Checked=True.
Este trecho de cdigo gera a sada indicada na Figura 9.4.
326 www.juliobattisti.com.br
ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB
Figura 9.4: Grupo de Controles do tipo RadioButton GrupoPagamento.
Para verificar qual opo foi selecionada, podemos utilizar a propriedade Checked de cada controle, conforme indicado
no seguinte trecho de cdigo:
if (Carto.Checked)
{
Label1.Text = Voc selecionou: + Carto.Text;
}
else if (Transferncia.Checked)
{
Label1.Text = Voc selecionou: + Transferncia.Text;
}
else if (Boleto.Checked)
{
Label1.Text = Voc selecionou: + Boleto.Text;
}
Neste exemplo estamos definindo o texto a ser exibido em um controle do tipo Label (Label1), com base na opo
selecionada. A propriedade Text do controle RadioButton (Carto.Text, Transferncia.Text e Boleto.Text) retorna o
valor definido na propriedade Text do controle. Por exemplo, para o controle Carto, Carto.Text=Carto de Crdito:.
Button Web Server Control
Este controle utilizado para criar um boto de comando em um formulrio. Podemos
criar dois tipos diferentes de botes, com este controle:
Boto Enviar (Submit)
Boto de Comando (Command)
Um boto do tipo Enviar no tem um nome de comando (definido pela propriedade
CommandName) associado com o boto. Este boto simplesmente envia a pgina para
processamento no servidor. Por padro, um controle Button do tipo Enviar. Podemos
definir um procedimento que executa em resposta ao evento Click do boto, como j
fizemos em diversos exemplos deste livro.
NOTA: Para uma
referncia completa sobre
todas as propriedades do
controle RadioButton,
consulte a documentao
do Framework .NET. Mais
especificamente, consulte
a classe RadioButton do
namespace
System.Web.UI.WebControls.
327
CAPTULO 9: WEB FORM CONTROLS
www.juliobattisti.com.br
Um boto do tipo Command possui um nome de comando associado com o boto, nome este que definido na
propriedade CommandName do controle. Isso permite que sejam criados mltiplos controles do tipo Button, em um
formulrio (Web Form) de uma pgina ASP.NET. Atravs de cdigo podemos determinar qual o boto que foi clicado
e, para cada boto, podemos definir o cdigo que ser executado em resposta ao evento Click do boto.
A sintaxe para este controle a seguinte:
<asp:Button
id=Identificao_no_cdigo
Text=Texto exibido no boto
CommandName=Nome de comando. Define o controle como sendo
do tipo Command
CommandArgument=Define ou retorna os argumentos passados
para o mtodo Command.
OnClick=Mtodo que executado em resposta ao evento
Click do boto.
runat=server
/>
No trecho de cdigo a seguir, temos o exemplo da criao de um controle Button, do tipo Submit, em uma
pgina .aspx:
<asp:Button
id=Enviar
Text=Enviar
OnClick=Enviar_Click
runat=server
/>
No trecho de cdigo a seguir, temos o exemplo da criao de um controle Button, do tipo Command, em uma
pgina .aspx:
<asp:Button
id=SortAscendingButton
Text=Sort Ascending
CommandName=Sort
CommandArgument=Ascending
OnClick=CommandBtn_Click
runat=server
/>
NOTA: O Controle Button
Web Server Control
derivado da classe base
Button, do namespace
System.Web.UI.WebControls.
Para uma referncia
completa a todas as
propriedades e mtodos
deste controle, consulte a
documentao do Frame-
work .NET.
328 www.juliobattisti.com.br
ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB
Podemos alterar as aparncias de qualquer controle, utilizando a sua propriedade Style. Atravs desta propriedade,
podemos controlar os diversos aspectos visuais de um controle. A seguir temos um exemplo de utilizao desta
propriedade:
<asp:Button
id=Enviar
Text=Enviar
style=color:White;
background-color:Black;
border-color:Red;
border-width:6px;
border-styke:Double;
OnClick=Enviar_Click
runat=server
/>
Observe que os aspectos visuais so definidos aos pares: aspecto:valor;. Por exemplo, a definio da cor das bordas do
boto feita da seguinte maneira:
border-color:Red;
Este controle produz o resultado indicado na Figura 9.5.
Figura 9.5: Usando a propriedade Style.
329
CAPTULO 9: WEB FORM CONTROLS
www.juliobattisti.com.br
ListBox Web Server Control
Este controle utilizado para criar uma lista de seleo, onde podemos selecionar um ou
mais elementos. Para definir o nmero de elementos que so exibidos, simultaneamente,
devemos definir a propriedade Rows. Por padro, exibida uma lista de uma nica
linha. Para habilitar a seleo de mltiplos elementos da lista, devemos definir a
propriedade SelectionMode=Multiple.
Para adicionar elementos lista de elementos do controle ListBox, utilizamos o controle
ListItem, conforme veremos no exemplo mais adiante.
A sintaxe para este controle a seguinte:
<asp:ListBox
id=Identificao_no_cdigo
DataSource=<% Expresso para conexo com uma fonte de dados %>
DataTextField=Nome do campo
DataValueField=Valor do campo
AutoPostBack=True|False
Rows=Nmero de linhas do controle
SelectionMode=Single|Multiple
OnSelectedIndexChanged=Mtodo que ser executado em
resposta ao evento.
runat=server>
<asp:ListItem value=value selected=True|False>
Texto do item.
</asp:ListItem>
</asp:ListBox>
Vamos apresentar um exemplo de utilizao do controle ListBox. O nosso exemplo constitudo de um formulrio no
qual colocamos um controle ListBox, com seis elementos. O controle permite selees mltiplas e seu tamanho
definido em 4 linhas. Ao clicar no boto Enviar, o evento Click deste boto informa qual foi o primeiro elemento a ser
selecionado.
Na Listagem 9.4 temos o cdigo para o exemplo proposto.
Listagem 9.4 O controle ListBox chap9ex4.aspx.
<html>
<head>
<script language=C# runat=server>
NOTA: As definies dos
elementos visuais fazem
parte de uma especificao
conhecida como CSS
Cascading Style Sheets. O
estudo da definio CSS est
fora do escopo deste livro.
Para maiores informaes
sobre CSS, consulte os
seguintes endereos:
www.w3.org
www.wdvl.com
www.internet.com e
www.developer.com
NOTA:O Controle ListBox
Web Server Control
derivado da classe base
ListBox, do namespace
System.Web.UI.WebControls.
Para uma referncia
completa a todas as
propriedades e mtodos
deste controle, consulte a
documentao do Frame-
work .NET.
330 www.juliobattisti.com.br
ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB
void Enviar_Click(Object sender, EventArgs e)
{
if (ListBox1.SelectedIndex > -1)
Label1.Text= O primeiro item que voc selecionou foi: +
ListBox1.SelectedItem.Text;
}
</script>
</head>
<body>
<form runat=server>
<h3><font face=Verdana>Exemplo do controle ListBox!!</font></h3>
<asp:ListBox id=ListBox1"
Rows=4"
SelectionMode=Multiple
Width=100px
runat=server
style=color:White;
background-color:Black;
>
<asp:ListItem>Item 1</asp:ListItem>
<asp:ListItem>Item 2</asp:ListItem>
<asp:ListItem>Item 3</asp:ListItem>
<asp:ListItem>Item 4</asp:ListItem>
<asp:ListItem>Item 5</asp:ListItem>
<asp:ListItem>Item 6</asp:ListItem>
</asp:ListBox>
<asp:button id=Enviar
Text=Enviar
OnClick=Enviar_Click
runat=server />
<p>
<asp:Label id=Label1"
Font-Name=Verdana
Font-Size=10pt
331
CAPTULO 9: WEB FORM CONTROLS
www.juliobattisti.com.br
runat=server/>
</form>
</body>
</html>
Digite o cdigo da Listagem 9.4 e salve o mesmo em um arquivo chamado chap9ex4.aspx, na pasta chap9, dentro da
pasta wwwroot, conforme descrito no item: Check List para acompanhar os exemplos deste livro, no Captulo 6.
Para acessar esta pgina utilize o seguinte endereo:
http://localhost/chap9/chap9ex4.aspx
Para selecionar mltiplas opes na lista de opes, mantenha a tecla Ctrl pressionada e v clicando nas opes a
serem selecionadas. Selecione as opes 1, 2 e 3 e d um clique no boto Enviar, conforme indicado na Figura 9.6.
Figura 9.6: Utilizando o controle ListBox chap9ex4.aspx.
No evento Click, do boto Enviar, utilizamos o seguinte cdigo, para informar o primeiro item selecionado:
void Enviar_Click(Object sender, EventArgs e)
{
if (ListBox1.SelectedIndex > -1)
Label1.Text= O primeiro item que voc selecionou foi: +
ListBox1.SelectedItem.Text;
}
O comando ListBox1.SelectedItem.Text que retorna o texto do primeiro item
selecionado.
Table, TableCell e TableRow Web Server Controls
Este controles so utilizados para a criao de tabelas em uma pgina .aspx. So
semelhantes aos Html Server Controls: HtmlTable, HtmlTableRow e HtmlTableCell,
porm oferecem mais opes de propriedades, mtodos e eventos.
Podemos construir uma tabela de tamanho fixo (nmero de linhas e colunas), ou podemos
construir a tabela dinamicamente, atravs de cdigo de programao. Porm as
modificaes nas linhas e colunas da tabela sero perdidas quando a pgina for
recarregada. Se o nmero de modificaes for grande, devemos utilizar os controles DataList e DataGrid, ao invs do
controle Table. Aprenderemos a utilizar os controles DataList e DataGrid nos Captulos 10 e 11.
NOTA: Nos Captulos 10
e 11 veremos exemplos
de utilizao das
propriedades DataSource,
DataTextField e
DataValueField, onde os
items do controle ListBox
sero obtidos a partir de
uma fonte de dados.
332 www.juliobattisti.com.br
ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB
A sintaxe para este controle a seguinte:
<asp:Table
id=Identificao_no_cdigo
BackImageUrl=Endereo da imagem de segundo plano.
CellSpacing=Distncia, em pixels, entre as bordas
das clulas e o contedo.
CellPadding= Distncia, em pixels, entre as
clulas da tabela.
GridLines=None|Horizontal|Vertical|Both
HorizontalAlign=Center|Justify|Left|NotSet|Right
runat=server
>
<asp:TableRow>
<asp:TableCell>
Texto da Clula.
</asp:TableCell>
</asp:TableRow>
</asp:Table>
Para criar uma nova linha da tabela, utilizamos o controle TableRow. Uma tabela formada por uma coleo de linhas,
onde cada linha definida por uma coleo de clulas Cells Colection. Podemos definir o conjunto de linhas da
tabela estaticamente, atravs da utilizao de uma srie de controles TableRow, ou dinamicamente, atravs de cdigo
de programao.
Sintaxe para o controle TableRow:
<asp:TableRow
id=Identificao_co_cdigo
HorizontalAlign=Center|Justify|Left|NotSet|Right
VerticalAlign=Bottom|Middle|NotSet|Top
runat=server
>
<asp:TableCell>
Texto da clula.
</asp:TableCell>
</asp:TableRow>.
NOTA: O Controle Table
Web Server Control
derivado da classe base
Table, do namespace
System.Web.UI.WebControls.
Para uma referncia
completa a todas as
propriedades desta classe,
consulte a documentao
do Framework .NET.
333
CAPTULO 9: WEB FORM CONTROLS
www.juliobattisti.com.br
A propriedade HorizontalAlign define o alinhamento horizontal do contedo da clula,
em relao clula; a propriedade VerticalAlign define o alinhamento vertical do
contedo da clula, em relao clula.
Para adicionarmos clulas (colunas) a uma linha da tabela, utilizamos o controle TableCell.
Uma linha formada por uma coleo de clulas (Cells).
Sintaxe para o controle TableCell:
<asp:TableCell
id=Identificao_no_cdigo
ColumnSpan=Nmero de colunas a ser mescladas.
RowSpan=Nmero de linhas a ser mescladas.
HorizontalAlign=Center|Justify|Left|NotSet|Right
VerticalAlign=Bottom|Middle|NotSet|Top
Wrap=True|False
runat=server>
Texto da Clula.
</asp:TableCell>
A propriedade Wrap define se deve haver o retorno automtico de texto dentro da clula (Wrap=True) ou no
(Wrap=False).
Vamos apresentar um exemplo, no qual uma tabela criada dinamicamente, atravs de
cdigo executado no evento Load da pgina (Page_Load). O cdigo do evento Load
adiciona trs linhas, com trs clulas em cada linha. A tabela criada na seo de
apresentao da pgina, porm sem nenhuma linha ou coluna, elementos estes que so
adicionados pelo cdigo do evento Load.
Na Listagem 9.5 temos o cdigo para o exemplo proposto.
Listagem 9.5 Os controles Table, TableRow e TableCell chap9ex5.aspx.
<%@ Page Language=C# %>
<html>
<head>
<script runat=server>
void Page_Load(Object sender, EventArgs e)
{
// Declaro duas variveis.
NOTA: O Controle
TableRow Web Server
Control derivado da
classe base TableRow, do
namespace
System.Web.UI.WebControls.
Para uma referncia
completa a todas as
propriedades desta classe,
consulte a documentao
do Framework .NET.
NOTA: O Controle
TableCell Web Server
Control derivado da
classe base TableCell, do
namespace
System.Web.UI.WebControls.
Para uma referncia
completa a todas as
propriedades desta classe,
consulte a documentao
do Framework .NET.
334 www.juliobattisti.com.br
ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB
// numrows contm o nmero de linhas.
// numcells contm o nmero de colunas.
int numrows = 3;
int numcells = 2;
// O lao externo cria uma nova linha a cada passagem do lao.
// O lao interno vai adicionando clulas a linha criada pela
// passada do lao externo.
for (int j=0; j<numrows; j++)
{
// Para cada passagem do lao externo, adiciono uma nova linha.
TableRow r = new TableRow();
for (int i=0; i<numcells; i++)
{
// Para cada passagem do lao interno, adiciono uma nova clula.
TableCell c = new TableCell();
c.Controls.Add(new LiteralControl(linha + j.ToString() + , coluna
+ i.ToString()));
r.Cells.Add(c);
}
Table1.Rows.Add(r);
}
}
</script>
</head>
<body>
<form runat=server>
<h3><font face=Verdana>Exemplo de tabela dinmica!!</font></h3>
335
CAPTULO 9: WEB FORM CONTROLS
www.juliobattisti.com.br
<asp:Table
id=Table1"
GridLines=Both
HorizontalAlign=Center
style=color:White;
background-color:Black;
border-color:Red;
border-width:6px;
border-style:Double;
Font-Name=Verdana
Font-Size=8pt
CellPadding=15"
CellSpacing=0"
runat=server
/>
</form>
</body>
</html>
Digite o cdigo da Listagem 9.5 e salve o mesmo em um arquivo chamado chap9ex5.aspx, na pasta chap9, dentro da
pasta wwwroot, conforme descrito no item: Check List para acompanhar os exemplos deste livro, no Captulo 6.
Para acessar esta pgina utilize o seguinte endereo: http://localhost/chap9/chap9ex5.aspx
Voc vai obter o resultado indicado na Figura 9.7.
Alguns comentrios sobre o exemplo:
No evento load utilizamos dois laos for. O lao externo adiciona uma nova linha tabela, a cada passada do lao; j
o lao interno adiciona uma nova clula a cada passada do lao. Para definir o contedo da clula, utilizamos o
seguinte comando:
c.Controls.Add(new LiteralControl(linha + j.ToString() + , coluna +
i.ToString()));
Esta tcnica diferente da utilizada com os HtmlServer Controls para a criao de tabelas, quando utilizamos a
propriedade InnerHtml do controle HtmlTableCell. No podemos utilizar esta tcnica com o controle TableCell, pois
ele no possui uma propriedade InnerHtml.
Para resolver este problema, utilizamos um controle do tipo LiteralControl. Quando esta pgina compilada, o controle
LiteralControl retorna exatamente o que foi passado como parmetro. No nosso exemplo, ao carregar a pgina, tudo o
336 www.juliobattisti.com.br
ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB
que foi passado como parmetro para o controle executado e o resultado da execuo inserido no local do controle.
Vamos acompanhar o que acontece para a primeira passada do lao externo e a primeira passada do lao interno, em
outras palavras:
j=0
i=0
quando a pgina processada, o parmetro passado para o controle LiteralControl fica da seguinte maneira:
linha 0, coluna 0
j.ToString substitudo pela string correspondente ao valor de j 0.
i.ToString substitudo pela string correspondente ao valor de i 0.
Com isso, o nosso comando fica:
c.Controls.Add(new LiteralControl(linha 0, coluna 0));
Ao processar todo este comando, retornado apenas o argumento entre aspas:
linha 0, coluna 0
que exatamente o contedo que ser exibido na clula.
Embora parea um pouco complicado, primeira vista, este exemplo demonstra o poder e a flexibilidade que temos
disposio com o uso dos Web Server Controls e da biblioteca de classes do Framework .NET. Qualquer elemento da
pgina tratado como um objeto. Atravs de programao temos um controle total sobre os mtodos, propriedades e
eventos destes objetos.
Figura 9.7: Utilizando os controles Table, TableRow e TableCell chap9ex5.aspx.
337
CAPTULO 9: WEB FORM CONTROLS
www.juliobattisti.com.br
Para finalizar, gostaria de lembrar que mais uma vez utilizamos a propriedade style, para definir alguns aspectos
visuais do controle Table, conforme indicado no fragmento a seguir:
<asp:Table id=Table1"
GridLines=Both
HorizontalAlign=Center
style=color:White;
background-color:Black;
border-color:Red;
border-width:6px;
border-style:Double;
Font-Name=Verdana
Font-Size=8pt
CellPadding=15"
CellSpacing=0"
runat=server
/>
Panel Web Server Control
Este controle funciona como um Conteiner para outros controles; ao ser processado gerada uma clusula HTML -
<DIV>. Utilizamos este controle quando precisamos adicionar controles pagina, dinamicamente atravs de programao,
ou quando precisamos ocultar e exibir um grupo de controles atravs do cdigo de programao. Por exemplo, vamos
supor que voc queira que um conjunto de controles somente seja visvel quando o valor de um determinado valor de
uma caixa de combinao seja selecionado. Neste caso voc pode colocar os diversos controles em um controle Panel e
tornar o controle Panel no visvel. Quando um valor selecionado na caixa de combinao, utilizamos um evento
associado a esta seleo para detectar qual foi o valor selecionado. Dependendo do valor
selecionado, podemos tornar True a propriedade Visible do controle Panel; com isso todos
os controles que foram colocados no controle Panel tambm sero exibidos.
A sintaxe para este controle a seguinte:
<asp:Panel
id=Identificao_no_cdigo
BackImageUrl=endereo da imagem de segundo plano.
HorizontalAlign=Center|Justify|Left|NotSet|Right
Wrap=True|False
runat=server>
Outros controles que tero o controle Panel como Container.
</asp:Panel>
IMPORTANTE: O
controle Panel Web
Server Control derivado
da classe base Panel, do
namespace
System.Web.UI.WebControls.
Para uma referncia
completa a todas as
propriedades e mtodos
deste controle, consulte a
documentao do Frame-
work .NET.
338 www.juliobattisti.com.br
ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB
Vamos analisar um exemplo retirado da documentao do Framework .NET. Neste exemplo apresentado um formulrio
com os seguintes controles:
Um controle Panel, com uma linha de texto de contedo esttico. Durante o processamento da pgina, mais
especificamente, durante o evento Load da pgina, vamos adicionar controles a este Panel, utilizando
programao.
Dois controles do tipo DrowpDownList (Caixa de Combinao). Em um controle, o usurio seleciona o nmero
de rtulos a serem inseridos no Panel (de 0 a 4 rtulos). Em outro controle o usurio seleciona o nmero de
Caixas de texto a serem inseridas no Panel.
Um controle do tipo CheckBox que estiver marcado faz com que o Panel seja ocultado, o que tambm oculta
todos os controles adicionados ao Panel.
Na Listagem 9.6 temos o cdigo para o exemplo proposto.
Listagem 9.6 O controle Panel chap9ex6.aspx.
<%@ Page Language=C# %>
<html>
<head>
<script runat=server>
void Page_Load(Object sender, EventArgs e) {
// Exibe/Oculta o controle Panel.
if (Check1.Checked)
{
Panel1.Visible=false;
}
else
{
Panel1.Visible=true;
}
// Adiciona controles do tipo Label ao controle Panel.
int numlabels = Int32.Parse(DropDown1.SelectedItem.Value);
for (int i=1; i<=numlabels; i++)
{
339
CAPTULO 9: WEB FORM CONTROLS
www.juliobattisti.com.br
// O nome da varivel do tipo Label um ele (l) e no o nmero um (1).
Label l = new Label();
l.Text = Rtulo + (i).ToString();
l.ID = Rtulo + (i).ToString();
Panel1.Controls.Add(l);
Panel1.Controls.Add(new LiteralControl(<br>));
}
// Adiciona controles do tipo Caixa de Texto ao controle Panel.
int numtexts = Int32.Parse(DropDown2.SelectedItem.Value);
for (int i=1; i<=numtexts; i++)
{
TextBox t = new TextBox();
t.Text = Caixa de Texto + (i).ToString();
t.ID = Caixa de Texto + (i).ToString();
Panel1.Controls.Add(t);
Panel1.Controls.Add(new LiteralControl(<br>));
}
}
</script>
</head>
<body>
<h3><font face=Verdana>Exemplo do controle Panel!!</font></h3>
<form runat=server>
<asp:Panel id=Panel1" runat=server
BackColor=gainsboro
Height=200px
Width=400px
style=color:White;
background-color:Black;
border-color:Red;
border-width:6px;
border-style:Double;
340 www.juliobattisti.com.br
ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB
>
Panel1: Contedo esttico, definido no prprio controle
<p>
</asp:Panel>
<p>Adicionar quantos rtulos?:
<asp:DropDownList id=DropDown1 runat=server>
<asp:ListItem Value=0">0</asp:ListItem>
<asp:ListItem Value=1">1</asp:ListItem>
<asp:ListItem Value=2">2</asp:ListItem>
<asp:ListItem Value=3">3</asp:ListItem>
<asp:ListItem Value=4">4</asp:ListItem>
</asp:DropDownList>
<br>
Adicionar quantas caixas de texto?:
<asp:DropDownList id=DropDown2 runat=server>
<asp:ListItem Value=0">0</asp:ListItem>
<asp:ListItem Value=1">1</asp:ListItem>
<asp:ListItem Value=2">2</asp:ListItem>
<asp:ListItem Value=3">3</asp:ListItem>
<asp:ListItem Value=4">4</asp:ListItem>
</asp:DropDownList>
<p>
<asp:CheckBox id=Check1" Text=Ocultar o Painel runat=server/>
<p>
<asp:Button Text=Atualiar o Painel runat=server/>
</font>
</form>
</body>
</html>
Digite o cdigo da Listagem 9.6 e salve o mesmo em um arquivo chamado chap9ex6.aspx, na pasta chap9, dentro da
pasta wwwroot, conforme descrito no item: Check List para acompanhar os exemplos deste livro, no Captulo 6.
341
CAPTULO 9: WEB FORM CONTROLS
www.juliobattisti.com.br
Para acessar esta pgina utilize o seguinte endereo: http://localhost/chap9/chap9ex6.aspx
carregado o formulrio com o controle Panel, dois controles Caixa de Combinao e um controle do tipo CheckBox,
alm do boto enviar, evidentemente. Voc vai obter o resultado indicado na Figura 9.8.
Figura 9.8: Utilizando o controle Panel chap9ex6.aspx.
Na lista Adicionar quantos rtulos?, selecione 3.
Na lista Adicionar quantas caixas de texto?, selecione 2.
Certifique-se de que a opo Ocultar Painel esteja desmarcada.
D um clique no boto Enviar; voc obter os resultados indicados na Figura 9.9.
Agora marque a opo Ocultar Painel e d um clique no boto Enviar. Observe que o controle Panel foi ocultado e
tambm todos os controles a ele adicionados.
342 www.juliobattisti.com.br
ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB
Alguns comentrios sobre o cdigo:
No incio do procedimento Load, testamos se o controle Check1 foi selecionado. Em caso afirmativo, tornamos
a propriedade Visible do controle Panel1 igual a False. Isso faz com que o controle Panel e todos os seus
controles sejam ocultados.
Figura 9.9: Controles adicionados dinamicamente, atravs do evento Load da pgina.
Para adicionar o nmero de rtulos e o nmero de caixas de texto selecionados pelo usurio, utilizamos o
evento Load da pgina.
O cdigo para adicionar rtulos o seguinte:
int numlabels = Int32.Parse(DropDown1.SelectedItem.Value);
for (int i=1; i<=numlabels; i++)
{
Label l = new Label();
l.Text = Rtulo + (i).ToString();
343
CAPTULO 9: WEB FORM CONTROLS
www.juliobattisti.com.br
l.ID = Rtulo + (i).ToString();
Panel1.Controls.Add(l);
Panel1.Controls.Add(new LiteralControl(<br>));
}
Em primeiro lugar declaramos e inicializamos uma varivel numlabels, do tipo int. Atribumos o valor selecionado na
lista DropDown1 para a varivel numlabels. Observe a utilizao do mtodo Parse, da estrutura Int32. Este mtodo
utilizado para converter a String retornada pelo controle DropDown1, em um nmero Int32, equivalente.
Em seguida iniciamos um lao for. A cada passada do lao um controle l, do tipo Label, criado. Depois definimos as
suas propriedades Rtulo e ID. Em seguida utilizamos o mtodo Add, da coleo Controls, do controle Panel, para
adicionar o rtulo recm-criado Panel1.Controls.Add(l). Para finalizar, utilizamos LiteralControl para enviar uma
tag <br>, para fazer uma quebra de linha. Sem esta tag <br>, os rtulos seriam colocados um ao lado do outro e no
um em cada linha.
As mesmas observaes so vlidas para a adio dos controles do tipo Caixa de texto.
Este exemplo salienta os recursos que temos disposio, quando utilizamos os Web Server Controls. Ob-
serve que temos acesso a uma infinidade de mtodos e propriedades, todas bem definidas e documentadas na
documentao do Framework .NET, no item .NET Framework Class Library.
Image Web Server Control
Este controle utilizado para adicionar imagens em uma pgina ASP.NET. Podemos definir um texto que ser exibido
no lugar da imagem, se por algum motivo o arquivo da imagem no estiver disponvel.
Para definir este texto utilizamos a propriedade AlternateText.
A sintaxe para este controle a seguinte:
<asp:Image
id=Identificao_no_cdigo
runat=server
ImageUrl=Endereo onde est a figura a ser incorporada na
pgina.
AlternateText=Texto
ImageAlign=NotSet|AbsBottom|AbsMiddle|BaseLine|Bottom|Left|Middle|Right|TextTop|Top
/>
Na Listagem 9.7 temos um pequeno exemplo de utilizao do controle Image.
IMPORTANTE: O
Controle Image Web
Server Control derivado
da classe base Image, do
namespace
System.Web.UI.WebControls.
Para uma referncia
completa a todas as
propriedades e mtodos
deste controle, consulte a
documentao do Frame-
work .NET.
344 www.juliobattisti.com.br
ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB
Listagem 9.7 O controle Image chap9ex7.aspx.
<html>
<head>
</head>
<body>
<form runat=server>
<h2><font face=Verdana>SQL Server 2000 - Curso Completo!!</font></h2>
<h3><font face=Verdana>Por: Jlio Battisti</font></h3>
<h3><font face=Verdana><a hrehttp://www.axcel.com.br>
Editora Axcel Books</a></font></h3>
<asp:Image
id=image1"
runat=server
AlternateText=SQL Server 2000 Curso Completo
ImageAlign=left
ImageUrl=livrosql2000.jpg
/>
</form>
</body>
</html>
Digite o cdigo da Listagem 9.7 e salve o mesmo em um arquivo chamado chap9ex7.aspx, na pasta chap9, dentro da
pasta wwwroot, conforme descrito no item: Check List para acompanhar os exemplos deste livro, no Captulo 6.
Para acessar esta pgina utilize o seguinte endereo: http://localhost/chap9/chap9ex7.aspx
Voc vai obter o resultado indicado na Figura 9.10.
Observe que, embora no tenhamos nenhum cdigo na seo de cdigo (na verdade nem temos seo de cdigo neste
exemplo), mesmo assim utilizamos a extenso .aspx e a pgina foi processada normalmente.
345
CAPTULO 9: WEB FORM CONTROLS
www.juliobattisti.com.br
Figura 9.10: Utilizando o controle Image chap9ex7.aspx.
HyperLink Web Server Control
Este controle utilizado para a criao de links em uma pgina ASP.NET. Por ser um controle do tipo Web Server
Control, temos acesso a uma srie de mtodos e eventos do controle HyperLink.
A sintaxe para este controle a seguinte:
<asp:HyperLink
id=Identificao_no_cdigo.
NavigateUrl=Endereo de destino do link.
Text=Texto do link
ImageUrl=Imagem de destino do link, se for o caso.
Target=Onde o destino ser aberto, especialmente til,
quando utilizamos frames.
runat=server
/>
ou
NOTA: O Controle
HyperLink Web Server
Control derivado da
classe base HyperLink, do
namespace
System.Web.UI.WebControls.
Para uma referncia
completa a todas as
propriedades e mtodos
deste controle, consulte a
documentao do Frame-
work .NET.
346 www.juliobattisti.com.br
ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB
<asp:HyperLink
id=Identificao_no_cdigo.
NavigateUrl=Endereo de destino do link.
ImageUrl=Imagem de destino do link, se for o caso.
Target=Onde o destino ser aberto, especialmente til, quando utilizamos
frames.
runat=server
Texto do Link.
</asp:HyperLink>
Na Listagem 9.8 temos um pequeno exemplo de utilizao do controle HyperLink.
Listagem 9.8 O controle HyperLink chap9ex8.aspx.
<html>
<head>
</head>
<body>
<h3><font face=Verdana>Exemplo do controle HyperLink. </font></h3>
<B>Clique no link abaixo:</B>
<br>
<br>
<asp:HyperLink
id=hyperLink1"
ImageUrl=livrosql2000.jpg
NavigateUrl=http://http://www.axcel.com.br/descricao.cfm?id_livro=202"
Text=SQL Server 2000 - Curso Completo!!
Target=_new
runat=server
style=color:White;
background-color:Black;
border-color:Red;
border-width:6px;
border-style:Double;
/>
</body>
</html>
347
CAPTULO 9: WEB FORM CONTROLS
www.juliobattisti.com.br
Digite o cdigo da Listagem 9.8 e salve o mesmo em um arquivo chamado chap9ex8.aspx, na pasta chap9, dentro da
pasta wwwroot, conforme descrito no item: Check List para acompanhar os exemplos deste livro, no Captulo 6.
Para acessar esta pgina utilize o seguinte endereo: http://localhost/chap9/chap9ex8.aspx
Voc vai obter o resultado indicado na Figura 9.11.
Figura 9.11: Utilizando o controle HyperLink chap9ex8.aspx.
Neste caso, a figura o link. Ao clicar na figura ser aberta uma nova janela (conforme definido na propriedade
target=_new), onde ser carregada a pgina definida na propriedade NavigateUrl=http://http://www.axcel.com.br/
descricao.cfm?id_livro=202.
LinkButton Web Server Control
Este controle utilizado para a criao de um controle com aparncia de link e com funcionalidade de boto. Este
controle pode ser do tipo Submit ou do tipo Command.
348 www.juliobattisti.com.br
ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB
Um LinkButton do tipo Enviar no tem um nome de comando (definido pela propriedade CommandName) associado
com o boto. Este boto simplesmente envia a pgina para processamento no servidor. Por padro um controle Button
do tipo Enviar. Podemos definir um procedimento que executa em resposta ao evento Click do boto, como j
fizemos em diversos exemplos deste livro.
Um LinkButton do tipo Command possui um nome de comando associado com o boto, nome este que definido na
propriedade CommandName do controle. Isso permite que sejam criados mltiplos controles do tipo LinkButton, em um
formulrio (Web Form) de uma pgina ASP.NET. Atravs de cdigo podemos determinar qual o boto que foi clicado
e, para cada boto, podemos definir o cdigo que ser executado em resposta ao evento Click do respectivo boto.
A sintaxe para este controle a seguinte:
<asp:LinkButton
id=Identificao_no_cdigo
Text=Texto do LinkButton
Command= Nome de comando. Define o controle como sendo do
tipo Command
CommandArgument=CommandArgument
OnClick=Mtodo que executa em resposta ao evento Click do
controle.
runat=server/>
ou
<asp:LinkButton
id=Identificao_no_cdigo
Command= Nome de comando. Define o controle como sendo do
tipo Command
CommandArgument=CommandArgument
OnClick=Mtodo que executa em resposta ao evento Click do controle.
runat=server
>
Texto do LinkButton
</asp:LinkButton>
Na Listagem 9.9 temos um pequeno exemplo de utilizao do controle LinkButton.
Listagem 9.9 O controle LinkButton chap9ex9.aspx.
<html>
<head>
<script language=C# runat=server>
NOTA:O Controle
LinkButton Web Server
Control derivado da
classe base LinkButton,
do namespace
System.Web.UI.WebControls.
Para uma referncia
completa a todas as
propriedades e mtodos
deste controle, consulte a
documentao do Frame-
work .NET.
349
CAPTULO 9: WEB FORM CONTROLS
www.juliobattisti.com.br
void LinkButton1_Click(Object sender, EventArgs e)
{
Label1.Text=Voc clicou em um controle LinkButton;
}
</script>
</head>
<body>
<form runat=server>
<h3><font face=Verdana>Exemplo do controle LinkButton!!</font></h3>
<asp:LinkButton
id=LinkButton1"
Text=Clique, por favor!
Font-Name=Verdana
Font-Size=14pt
OnClick=LinkButton1_Click
runat=server
/>
<BR>
<BR>
<asp:Label
id=Label1"
runat=server
/>
</form>
</body>
</html>
Digite o cdigo da Listagem 9.9 e salve o mesmo em um arquivo chamado chap9ex9.aspx, na pasta chap9, dentro da
pasta wwwroot, conforme descrito no item: Check List para acompanhar os exemplos deste livro, no Captulo 6.
Para acessar esta pgina utilize o seguinte endereo: http://localhost/chap9/chap9ex9.aspx
Na pgina que carregada, d um clique no link Clique, por favor!. Voc obter o resultado indicado na Figura 9.12.
350 www.juliobattisti.com.br
ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB
Figura 9.12: Utilizando o controle LinkButton chap9ex9.aspx.
Observe que podemos definir um mtodo em resposta ao evento Click do controle LinkButton, conforme descrevemos
antes: Aparncia de Link e funcionalidade de boto.
ImageButton Web Server Control
Este controle utilizado para detectar a regio de uma determinada imagem, onde o usurio clicou com o mouse. Com
isso podemos criar a mesma funcionalidade de uma imagem mapeada, no HTML.
Utilizamos o evento OnClick para determinar as coordenadas onde o usurio clicou na imagem. Com isso, dependendo
do valor das coordenadas onde o usurio clicou, podemos tomar diferentes aes, como, por exemplo, carregar diferentes
endereos. Com isso estamos criando, na prtica, uma imagem mapeada, onde diferentes regies da imagem esto
vinculadas a diferentes endereos.
Podemos utilizar o evento OnCommand para fazer com que a imagem tenho o mesmo
comportamento de um boto de comando. Podemos associar um nome de comando com
o boto, nome este que definido na propriedade CommandName do controle. Isso
permite que sejam criados mltiplos controles do tipo LinkButton, em um formulrio
(Web Form) de uma pgina ASP.NET. Atravs de cdigo podemos determinar qual o
boto que foi clicado e, para cada boto, podemos definir o cdigo que ser executado
em resposta ao evento Click do respectivo boto.
A sintaxe para este controle a seguinte:
<asp:ImageButton
id=Identificao_no_cdigo
ImageUrl=Endereo do arquivo de imagem.
NOTA: O Controle
ImageButton Web Server
Control derivado da
classe base ImageButton,
do namespace
System.Web.UI.WebControls.
Para uma referncia
completa a todas as
propriedades e mtodos
deste controle, consulte a
documentao do Frame-
work .NET.
351
CAPTULO 9: WEB FORM CONTROLS
www.juliobattisti.com.br
Command=Command
CommandArgument=CommandArgument
OnClick=Mtodo que ser executado em resposta ao evento Click do controle.
runat=server
/>
Na Listagem 9.10 temos um exemplo de utilizao do controle ImageButton.
Listagem 9.10 O controle ImageButton chap9ex10.aspx.
<%@ Page Language=C# %>
<html>
<head>
<script runat=server>
void ImageButton_Click(object Source, ImageClickEventArgs e)
{
Label1.Text=Voc clicou nas seguintes coordenadas: +
( + e.X.ToString() + , +
e.Y.ToString() + );
}
</script>
</head>
<body>
<form runat=server>
<h3><font face=Verdana>Exemplo do controle ImageButton!! </font></h3>
<B>Clique em qualquer ponto da imagem.</B>
<br>
<br>
<asp:ImageButton
id=imagebutton1"
AlternateText=Axcel Books.
352 www.juliobattisti.com.br
ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB
ImageAlign=left
ImageUrl=livrosql2000.jpg
OnClick=ImageButton_Click
runat=server
/>
<br>
<br>
<asp:Label
id=Label1"
runat=server
/>
</form>
</body>
</html>
Digite o cdigo da Listagem 9.10 e salve o mesmo em um arquivo chamado chap9ex10.aspx, na pasta chap9, dentro
da pasta wwwroot, conforme descrito no item: Check List para acompanhar os exemplos deste livro, no Captulo 6.
Para acessar esta pgina utilize o seguinte endereo: http://localhost/chap9/chap9ex10.aspx
Na pgina que carregada, d um clique em qualquer ponto da imagem; sero informadas as coordenadas do ponto
onde voc clicou, conforme indicado na Figura 9.13.
O mtodo ImageButton_Click executado em resposta ao evento Click do controle
ImageButton. Um dos argumentos (argumento e) deste mtodo do tipo
ImageClickEventArgs. Este argumento um objeto baseado na classe
ImageClickEventArgs. Esta classe possui dois campos:
X: Retorna a coordenada horizontal, em relao origem.
Y: Retorna a coordenada vertical, em relao origem.
Com estes dois campos podemos acessar as coordenadas do ponto onde o usurio clicou.
Para acessar a coordenada X, utilizamos o seguinte comando:
e.X.ToString( )
Para acessar a coordenada Y, utilizamos o seguinte comando:
e.Y.ToString( )
NOTA: A origem das
coordenadas (0,0) no
canto superior esquerdo.
353
CAPTULO 9: WEB FORM CONTROLS
www.juliobattisti.com.br
Figura 9.13: Utilizando o controle ImageButton chap9ex10.aspx.
Concluso
Iniciamos o captulo estudando a classe base para todos os Web Server Controls:
WebControl.
Em seguida, aprendemos a utilizar controles pertencentes aos chamados Web Server
Controls. Estudamos e apresentamos exemplos sobre os seguintes controles:
TextBox
Label
CheckBox
RadioButton
Button
ListBox
Table, TableCell e TableRow
Panel
Image
HyperLink
NOTA: Utilizamos o
mtodo ToString, para
converter o valor inteiro,
retornado pelos campos X
e Y, na string
correspondente.
354 www.juliobattisti.com.br
ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB
LinkButton
ImageButton
A principal questo que pode surgir a seguinte: Por que precisamos de mais um conjunto de controles, se j temos
os HtmlServer Controls e os Validation Server Controls (que na verdade fazem parte dos Web Server Controls)?
O principal motivo, conforme foi ressaltado durante o captulo, que os Web Form Controls fornecem um conjunto
mais rico e variado de propriedades, mtodos e eventos do que os HtmlServer Controls. Esta variedade de mtodos,
propriedades e eventos permite a criao de pginas ASP.NET mais sofisticadas e nas quais temos um controle apurado
sobre os elementos da pgina, controle esse exercido atravs de cdigo de programao.
Agora j conhecemos os elementos bsicos do Framework .NET (Captulos 1 e 2), os elementos bsicos da
linguagem C# (Captulos 3, 4 e 5) e os elementos bsicos para a criao de pginas ASP.NET (Captulos 7, 8 e 9).
A partir do prximo captulo vamos estudar a conexo de pginas ASP.NET com diversas fontes de dados,
atravs da utilizao de ADO.NET.
355
CAPTULO 10: ACESSANDO BANCOS DE DADOS COM ASP.NET PARTE 1
www.juliobattisti.com.br
Introduo
Voc lembra do tempo em que para construir um site era s criar um monte
de pginas HTML? Eu lembro. Se eu tenho saudades? Sinceramente, no.
Embora fosse muito mais simples e fcil, o que se pode fazer apenas com HTML
muito pouco.
Hoje, a realidade bem diferente. Vivemos em um mundo com milhes de pessoas
conectadas Internet. O comrcio eletrnico entre empresas (B2B Business To
Business) e o comrcio eletrnico entre empresas e consumidores finais (B2C
Business To Consumer) j uma realidade.
Mas a Internet no utilizada apenas para comrcio eletrnico. Sistemas de
gerenciamento das relaes com o cliente CRM Customer Relationship Man-
agement, software para ser utilizado pela Internet, mediante o pagamento de uma
taxa mensal ASP Application Services Providers, so apenas alguns exemplos
dos servios que se tornaram realidade graas utilizao da Internet.
Novas ofertas e servios surgem diariamente. Mas o que tm em comum todos
estes sites?
A tecnologia? De maneira alguma. Existem tecnologias para os mais variados
gostos, desde solues 100% Java, passando pelo software livre, com a utilizao
do servidor Apache, Linux e da linguagem PHP, at o mundo Microsoft, antes
com a tecnologia ASP e o padro COM/COM+ e agora com o Framework .NET.
O que todos estes sites e aplicaes Web tm em comum a necessidade, cada
vez maior, do acesso a dados das mais variadas fontes. Existem exemplos de
aplicaes Web que apresentam, na mesma pgina, dados oriundos do Main-
frame, de um servidor SQL Server ou ORACLE e de uma planilha do Excel. O
fato que o acesso aos dados uma necessidade. Com o uso da Informtica um
volume cada vez maior de dados gerado, diariamente, nas empresas. Para
transformar todos estes dados, em informaes teis, geradoras de negcios e
lucros, precisamos de tecnologias que facilitem o acesso s mais diversas e
variadas fontes de dados.
Com o ASP 3.0 temos a tecnologia ADO/OLE-DB (Activex Data Objects/ OLE
Database) para acesso a fontes de dados. Com ASP.NET temos um novo conjunto
de classes para acesso a dados, conjunto este conhecido como ADO.NET.
importante salientar que ADO.NET no uma nova verso de ADO. As duas
tecnologias podem ser utilizadas em conjunto. ADO dando suporte a pginas e
aplicaes Web criadas com ASP 3.0; e para pginas ASP.NET utilizamos
C A P T U L O
10
Acessando Bancos de Dados
com ASP.NET Parte 1
356 www.juliobattisti.com.br
ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB
ADO.NET. Esta convivncia entre as tecnologias, facilita a migrao das pginas criadas com ASP 3.0 para ASP.NET,
uma vez que as pginas ASP 3.0 continuaro funcionando, mesmo aps a instalao do Framework .NET.
Como acessar bancos de dados a partir de pginas ASP.NET o assunto deste captulo. Vamos apresentar os namespaces
onde esto as classes para acesso a dados. Iremos estudar as principais classes destes namespaces. Tambm aprenderemos
a acessar bancos de dados do Microsoft SQL Server e do Microsoft Access. Veremos como apresentar os dados
obtidos, utilizando os novos controles do ASP.NET.
Veremos diversos exemplos de utilizao das classes estudadas. Sempre que for pertinente, faremos a comparao
entre a maneira como uma determinada operao realizada com ASP 3.0 e a maneira como passamos a realizar a
mesma operao com ASP.NET. O contedo visto neste captulo a base para os assuntos apresentados nos Captulos
11 e 12.
Uma Viso Geral do Acesso a Dados
Existe uma frase que resume bem a necessidade de acesso a dados: A informao certa, para a pessoa certa, na
quantidade certa e no momento certo.
Esta frase apresenta alguns aspectos importantes:
A informao certa: A informao deve estar correta, isto , deve ser confivel. A informao utilizada para
a tomada de decises, nos mais variados nveis de uma empresa. Se a informao estiver incorreta, as decises
sero equivocadas e no iro gerar os resultados esperados. Pior do que no ter a informao ter informao
incorreta, no confivel.
Para a pessoa certa: Independente do nvel hierrquico, quer seja o operrio da fbrica ou o presidente da
empresa, todos precisam de informao para trabalhar e alcanar os resultados desejados. A informao correta
precisa estar disposio para as pessoas que dela necessitam.
Na quantidade certa: Informao demais tambm um problema e pode atrapalhar ao invs de ajudar. E hoje
as informaes vm das mais diversas fontes. Internet, e-mail, relatrios, banco de dados da empresa, arquivos
do Office, jornais, revistas, livros, manuais tcnicos. Precisamos garimpar as informaes que realmente so
necessrias ao nosso trabalho.
No momento certo: Este um aspecto fundamental. Lembro-me da poca em que somente tnhamos o Mainframe
e um bando de terminais espalhados pela empresa. Voc solicitava um novo relatrio para a turma do CPD.
Duas semanas depois vinha o relatrio. Hoje, evidentemente, esta situao inaceitvel. Precisamos da
informao instantnea, sempre disposio.
Quando as empresas comearam a descentralizar seus ambientes computacionais, passando do modelo Mainframe/
Terminal para um modelo Cliente/Servidor com redes locais, novas possibilidades, e tambm problemas, comearam
a surgir. Bancos de dados departamentais no integrados, diferentes formatos de dados, aplicaes Cliente/Servidor
rodando em cada estao de trabalho, etc., isso fez com que a informao ficasse distribuda por toda a empresa e no
mais centralizada no Mainframe.
357
CAPTULO 10: ACESSANDO BANCOS DE DADOS COM ASP.NET PARTE 1
www.juliobattisti.com.br
Um ambiente descentralizado mais flexvel, mas em contrapartida mais difcil de se gerenciar e de manter o
controle. medida que o volume de informaes comeou a crescer, ficou difcil ter acesso aos dados de diferentes
departamentos de uma maneira consistente e rpida. Na Figura 10.1 temos uma pequena ilustrao deste ambiente:
Alm de mltiplas fontes de dados, temos diferentes formatos de dados. Evidentemente que a estrutura de um arquivo
de mensagens de correio muito diferente da estrutura de uma planilha do Excel, por exemplo.
Para que possamos criar aplicaes que acessam dados de diversas fontes, precisamos de tecnologias capazes de
acessar dados de fontes to diversas como o Mainframe e um documento do Microsoft Word ou uma planilha do
Microsoft Excel. O Framework .NET fornece, principalmente atravs do namespace System.Data, uma srie de classes
para conexo e manipulao de dados dos mais variados formatos. Este conjunto de classes tambm conhecido
como ADO.NET.
Neste captulo vamos estudar as classes que do acesso a fontes de dados estruturadas, que seguem o modelo de dados
relacionais. Podemos citar como exemplos de bancos de dados relacionais o Microsoft Access, o SQL Server 2000, o
ORACLE, o DB2 da IBM, etc.
Figura 10.1: Dados de mltiplas e heterogneas fontes.
NOTA: Para maiores detalhes sobre o modelo de dados relacionais, consulte o Anexo II.
358 www.juliobattisti.com.br
ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB
Quais as Principais Diferenas do ADO.NET em Relao ao ADO?
Com ADO estabelecamos uma conexo com uma fonte de dados e utilizvamos, ou o mtodo Open do Objeto
Connection, ou um objeto do tipo Command, para executar um comando SQL e retornar dados, no formato de uma
tabela, para um objeto do tipo Recordset. A caracterstica principal que, para trabalhar com os dados e fazer alteraes
nos mesmos, precisamos estabelecer uma conexo com o banco de dados.
Com ADO.NET temos um modelo de dados desconectado. O protocolo HTTP conhecido como Connection Less.
Ao solicitar uma pgina, estabelecida uma conexo com o servidor Web; os arquivos e imagens necessrios so
solicitados e enviados para o navegador do cliente e a conexo fechada. Por isso o termo Connection Less, pois no
mantida uma conexo permanente entre o servidor Web e o navegador do cliente. Esta natureza desconectada da
Web causa alguns inconvenientes quando desenvolvemos aplicaes de banco de dados.
ADO.NET resolve este problema, fornecendo uma srie de objetos que permitem que os dados, uma vez carregados
para o navegador do cliente, sejam manipulados, mesmo sem existir uma conexo permanente com o banco de dados.
Uma vez feitas as alteraes, incluses ou excluses necessrias, podemos, facilmente, sincronizar os dados que esto
no cliente com o banco de dados no servidor. Veremos nos Captulos 10 e 11 exemplos de mtodos para sincronizao
dos dados.
O principal objeto do modelo ADO, para trabalhar com dados, o objeto RecordSet. Para exibir os dados de um objeto
RecordSet, precisamos escrever uma boa quantia de cdigo. Com ADO.NET, o principal objeto, que funciona como
um Conteiner para dados, o DataSet, o qual pode conter uma ou mais tabelas (o objeto RecordSet somente pode
conter uma tabela) e tambm os relacionamentos entre as tabelas e informaes sobre chaves primrias e chaves
estrangeiras.
Com o modelo desconectado do ADO.NET, no utilizamos cursores, nem no lado cliente, nem no lado servidor. As
classes de acesso a dados fornecem os mecanismos necessrios para a manipulao dos dados. O formato adotado
para armazenar os dados no cliente o XML, um padro amplamente aceito pela indstria. Com ADO, ao utilizar
tecnologias como RDS para trabalhar com dados desconectados, temos um formato proprietrio para os dados, formato
este que somente aceito pelo Internet Explorer.
Neste captulo vamos aprender a utilizar alguns objetos bsicos para o acesso a dados
relacionais, mais especificamente, a dados do SQL Server e do Microsoft Access. Veremos
como estabelecer uma conexo com o banco de dados, acessar dados de uma ou mais
tabelas e exibir estes dados em uma pgina ASP.NET.
Para exibio dos resultados obtidos, estaremos utilizando o Web Server Control
DataGrid. Estudaremos este controle em detalhes. Veremos que o controle DataGrid
facilita, enormemente, a tarefa de exibir dados em uma pgina ASP.NET. No nosso
exemplo mais simples, veremos que, o que no ASP 3.0 exige vrias linhas de cdigo, no
ASP.NET, com o controle DataGrid, pode ser feito em uma nica linha de cdigo.
NOTA: Para maiores
informaes sobre Tabelas,
Atributos, Chaves Primrias,
Chaves Estrangeiras e
Relacionamentos entre
tabelas, consulte o Anexo II.
359
CAPTULO 10: ACESSANDO BANCOS DE DADOS COM ASP.NET PARTE 1
www.juliobattisti.com.br
Figura 10.2: O Banco de
dados NorthWind.mdb
do Microsoft Access.
Bancos de Dados Utilizados nos Exemplos
Para os exemplos deste e dos prximos captulos utilizaremos um banco de dados do
Microsoft Access e outro do SQL Server 2000.
O Banco de Dados do Microsoft Access NorthWind.mdb
O banco de dados NorthWind.mdb fornecido pela Microsoft e instalado juntamente
com o Microsoft Access 2000. um banco de dados de exemplo, para controle de vendas
de uma pequena empresa. Nele so armazenadas informaes sobre pedidos, clientes,
funcionrios, produtos e fornecedores.
A arquivo NorthWind.mdb, por padro, instalado na subpasta Samples, da pasta de
instalao do Office 2000. Para os exemplos deste livro, faremos uma cpia deste arquivo,
na pasta C:\Meus documentos e utilizaremos esta cpia nos exemplos.
Neste banco de dados encontramos as seguintes tabelas:
Categorias
Clientes
Detalhes do pedido
Fornecedores
Funcionrios
Pedidos
Produtos
Transportadoras
Na Figura 10.2 temos o diagrama Entidades x Relacionamentos para este banco de
dados:
NOTA: Os exemplos deste
captulo sero criados na
pasta D:\Inetpub\wwwrooot\
Chap10. Para acessar uma
pgina, dentro desta pasta,
por exemplo:
Chap10Ex1.aspx, utilize o
seguinte endereo:
http://localhost/Chap10/
Chap10Ex1.aspx. A seguir
descrevo os bancos de dados
que sero utilizados nos
exemplos deste e dos
prximos captulos.
IMPORTANTE: Os nomes
de empresas, produtos,
pessoas, personagens e/
ou dados apresentados
neste banco de dados so
fictcios e no
representam de forma
alguma qualquer
indivduo, produto,
empresa ou evento, salvo
meno contrria.
360 www.juliobattisti.com.br
ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB
O Banco de Dados do SQL Server Pubs
Ao instalarmos o Framework .NET instalada, digamos assim, uma miniverso do SQL Server. Nesta miniverso
disponibilizado o banco de dados pubs, conforme indicado na Figura 10.3.
Figura 10.3: O Banco de dados pubs do SQL Server.
Ao instalar o Framework .NET podemos ter duas situaes distintas:
1. O SQL Server ainda no est instalado: Neste caso criada uma instncia chamada NETSDK. Para estabelecermos
uma conexo, conforme veremos nos exemplos deste captulo, fornecemos o nome da instncia NETSDK,
como valor para o parmetro server.
2. O SQL Server j est instalado: Neste caso criada uma nova instncia chamada SERVIDOR\NETSDK, onde
SERVIDOR o nome do computador que voc est utilizando. Para estabelecermos uma conexo, conforme
veremos nos exemplos deste captulo, fornecemos o nome completo da instncia SERVIDOR\NETSDK, como
valor para o parmetro server. O computador que estou utilizando para os exemplos encaixa-se neste segundo
caso. Nos exemplos deste captulo vou utilizar SERVIDOR\NETSDK, como valor para o parmetro Servidor,
nos objetos onde este parmetro for necessrio. Se voc estiver utilizando um computador com um nome diferente,
substitua SERVIDOR pelo nome do computador que voc est utilizando.
IMPORTANTE: Os nomes de empresas, produtos, pessoas, personagens e/ou dados apresentados neste banco de dados so
fictcios e no representam de forma alguma qualquer indivduo, produto, empresa ou evento, salvo meno contrria.
361
CAPTULO 10: ACESSANDO BANCOS DE DADOS COM ASP.NET PARTE 1
www.juliobattisti.com.br
As principais tabelas deste banco de dados so as seguintes:
authors (autores)
discounts (descontos)
employee (funcionrios, empregados)
jobs (funes, cargos)
publishers (editoras)
sales (vendas)
stores (lojas, livrarias)
titles (livros, ttulos)
titleauthor (relaciona os livros de cada autor)
O Banco de dados pubs utilizado por uma rede de livrarias, para o controle de vendas e pesquisa dos ttulos existentes
no catlogo da livraria.
Na Figura 10.4 temos o diagrama Entidades x Relacionamentos para este Banco de dados.
NOTA: Os nomes de
tabelas e campos do Banco
de dados pubs esto em
ingls, conforme fornecido
na instalao do Frame-
work .NET.
Figura 10.4: O diagrama Entidades x Relacionamentos do Banco de dados pubs.
362 www.juliobattisti.com.br
ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB
Uma Introduo ao ADO.NET
Agora vamos iniciar o estudo das principais classes para acesso a dados. O conjunto
destas classes conhecido como ADO.NET. As classes que iremos estudar fazem parte
dos seguintes namespaces da biblioteca de classes do Framework .NET:
System.Data: Contm as principais classes utilizadas para acessar bases de dados
relacionais. A classe DataSet faz parte deste namespace.
System.Data.SqlClient: Classes utilizadas para acessar bancos de dados do SQL
Server 2000. As classes deste namespace fornecem melhor desempenho para
acesso ao SQL Server, pois utilizam a interface TDS Tabular Data Stream,
nativa do SQL Server 2000.
System.Data.Common: Contm as classes onde so definidas as propriedades e
mtodos bsicos, herdados por classes de outros namespaces.
System.Data.OleDb: Neste namespace encontramos as classes para acesso a
fontes de dados, via OLE-DB Providers.
Neste captulo vamos estudar diversas classes dos namespaces da lista anterior. Veremos como estabelecer uma conexo
com um banco de dados, como retornar dados a partir desta conexo e como exibir estes dados em uma pgina
ASP.NET.
No ASP 3.0, utilizando ADO, o objeto que utilizamos para retornar dados o RecordSet. No ADO.NET no temos o
objeto RecordSet. De incio voc que j estava acostumado com o objeto RecordSet pode estranhar um pouco, mas
conforme veremos nos exemplos deste captulo, os objetos do ADO.NET alm de mais poderosos so tambm mais
fceis de utilizar. A principal facilidade notada no momento de exibir os resultados obtidos, quando podemos utilizar
alguns Web Server Controls bastante poderosos, mais especificamente o controle DataGrid.
Informando que Voc Deseja Utilizar
Classes de um Determinado Namespace
Voc deve ter notado, nos exemplos dos captulos anteriores, que utilizamos uma srie de classes e estruturas do
namespace System; todavia no fizemos nenhuma referncia a este namespace, no cdigo das pginas ASP.NET de
exemplo. Como ento uma pgina capaz de acessar os mtodos de um namespace, sem ter feito referncia ao
mesmo? Isso somente acontece com os namespaces bsicos, como o caso do namespace System. J com os namespaces
que contm as classes para acesso a dados, a histria diferente. Para que possamos utilizar classes de um destes
namespaces precisamos, explicitamente, fazer referncia aos mesmos, no incio da pgina ASP.NET. O que eu chamei
de fazer referncia chamado pelo Framework .NET de importar um namespace.
Temos duas maneiras diferentes para importar (ou fazer referncia, como preferirem) um namespace, em uma
pgina ASP.NET.
NOTA: Os campos indicados
por uma pequena chave
amarela so campos do tipo
Chave Primria. Os campos
indicados pelo sinal de infinito
(um 8 deitado) so campos
do tipo Chave Estrangeira.
Para detalhes sobre os
conceitos de Chave Primria e
Chave Estrangeira, consulte o
Anexo II.
363
CAPTULO 10: ACESSANDO BANCOS DE DADOS COM ASP.NET PARTE 1
www.juliobattisti.com.br
1. Utilizando a diretiva @Import, no incio da pgina. No fragmento de cdigo a seguir, estamos importando os
namespaces System.Data, System.Data.SqlClient e System.OleDb:
<%@Import Namespace=System.Data %>
<%@Import Namespace=System.Data.SqlClient %>
<%@Import Namespace=System.Data..OleDb%>
2. Utilizando o comando using do C#. No fragmento de cdigo a seguir, estamos importando os namespaces
System.Data e System.Data.SqlClient:
using System.Data;
using System.Data.SqlClient;
Uma vez feitas as devidas importaes (ou referncias), estamos aptos a utilizar as classes dos namespaces referenciados.
Classe ou Objeto; Objeto ou Classe?
Muitas vezes, os termos classe e objeto so utilizados, indiscriminadamente, com o mesmo sentido. Vamos fazer uma
definio formal para estes termos, atravs de um exemplo:
No namespace System.Data existe uma classe chamada DataSet. Quando declaramos e inicializamos uma varivel,
como sendo do tipo DataSet, estamos criando um objeto baseado na classe DataSet. No trecho de cdigo a seguir,
temos um exemplo onde criamos um objeto chamado MeusDados, o qual baseado na classe DataSet:
DataSet MeusDados = new DataSet( );
Estabelecendo Conexes
Uma coisa no mudou no ADO.NET, em relao ao ADO: o primeiro passo estabelecer uma conexo com o banco
de dados. Embora com ADO.NET tenhamos um modelo desconectado, conforme descrito anteriormente, o primeiro
passo fazer uma conexo com o banco de dados. Uma vez estabelecida a conexo, obtemos os dados desejados e
podemos trabalhar com estes dados diretamente no navegador, desconectados do banco de dados. Uma vez feitas as
alteraes necessrias, sincronizamos os dados com o banco de dados.
Para estabelecer uma conexo com um banco de dados do SQL Server, devemos utilizar, preferencialmente, a classe
SqlConnection, do namespace System.Data.SqlClient.
Para acessar um banco de dados utilizando o OLE-DB Provider correspondente, utilizamos a classe OleDbConnection
do namespace System.Data.OleDb. Como existe um OLE-DB Provider para o SQL Server, tambm poderamos
utilizar a classe OleDbConnection para fazer uma conexo com o SQL Server, porm a classe SqlConnection bem
mais eficiente, em termos de desempenho, pois foi especificamente projetada para trabalhar com o SQL Server 2000,
assim como foram todas as classes do namespace System.Data.SqlClient.
Vamos estudar estas duas classes.
364 www.juliobattisti.com.br
ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB
Estabelecendo uma Conexo com o SQL Server 2000 SqlConnection
A classe SqlConnection faz parte do namespace System.Data.SqlClient. Esta classe utilizada para estabelecer uma
conexo com um servidor SQL Server. Diferente do que acontecia com ADO, no podemos executar um comando
SQL, utilizando a classe SqlConnection. Ainda neste captulo estudaremos as classes utilizadas para executar comandos
em um banco de dados.
A seguir temos um exemplo de criao de um objeto do tipo SqlConnection:
SqlConnection MinhaConeco = new SqlConnection(server=SERVIDOR\\NETSDK; +
uid=sa;pwd=;database=pubs);
O parmetro passado uma string que contm as informaes necessrias para estabelecer a conexo com o banco de
dados. Mais adiante veremos um exemplo de utilizao e criao de uma conexo.
Na Tabela 10.1 temos uma descrio das principais propriedades da classe SqlConnection:
Tabela 10.1 Principais propriedades da classe SqlConnection.
Propriedade Descrio
ConnectionString utilizada para definir ou retornar uma string de texto onde so informados os diversos
parmetros para estabelecer a conexo, como por exemplo o nome do servidor, a
instncia, o nome do banco de dados, o nome de login e senha.
ConnectionTimeOut Define por quanto tempo feita a tentativa de estabelecer a conexo. Aps o tempo
definido nesta propriedade, a tentativa cancelada e um erro gerado.
Database utilizada para definir ou retornar o nome do banco de dados que ser utilizado quando
a conexo for estabelecida.
DataSource Retorna o nome da instncia do SQL Server com a qual foi estabelecida uma conexo.
ServerVersion Retorna uma string informando a verso do servidor SQL Server com o qual a conexo foi
estabelecida.
State Retorna o estado atual da conexo.
Vamos apresentar um pequeno exemplo, onde criamos uma conexo com o Banco de dados pubs da instncia
SERVIDOR\NETSDK (conforme descrito anteriormente). Uma vez estabelecida a conexo, vamos exibir as
propriedades desta conexo em um Web Server Control do tipo TextArea. Vamos utilizar o evento Page_Load, da
pgina ASP.NET, para estabelecer a conexo com o Banco de dados pubs.
Na Listagem 10.1 temos o cdigo para o exemplo proposto.
Listagem 10.1 A classe SqlConnection chap10ex1.aspx.
<%@ Import Namespace=System.Data %>
<%@ Import Namespace=System.Data.SqlClient %>
365
CAPTULO 10: ACESSANDO BANCOS DE DADOS COM ASP.NET PARTE 1
www.juliobattisti.com.br
<html>
<script language=C# runat=server>
protected void Page_Load(Object Src, EventArgs E )
{
// Crio uma conexo com o banco de dados pubs localizado no servidor local.
// Vamos acessar a instncia SERVIDOR\NETSDK.
SqlConnection MinhaConexo = new
SqlConnection(server=SERVIDOR\\NETSDK;uid=sa;pwd=;database=pubs);
// Declaro uma varivel do tipo String: auxPropriedades.
// A varivel auxPropriedades ir conter o valor das propriedades
// da conexo minhaConexo.
String auxPropriedades;
auxPropriedades = Propriedades da conexo:;
auxPropriedades = auxPropriedades + \n\n + ConnectionString: +
MinhaConexo.ConnectionString.ToString();
auxPropriedades = auxPropriedades + \n\n + Database: +
MinhaConexo.Database.ToString();
auxPropriedades = auxPropriedades + \n\n + DataSource: +
MinhaConexo.DataSource.ToString();
auxPropriedades = auxPropriedades + \n\n + State: +
MinhaConexo.State.ToString();
ExibePropriedades.Font.Bold=true;
ExibePropriedades.Text=auxPropriedades;
}
</script>
<body>
<h3><font face=Verdana>Classe SqlConnection!!!</font></h3>
366 www.juliobattisti.com.br
ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB
<asp:TextBox
runat=server
id=ExibePropriedades
Text=
Rows=10"
Cols=70"
Font_Face=Arial Font_Size=3"
BackColor=lightblue
TextMode=MultiLine
/>
</body>
</html>
Digite o cdigo da Listagem 10.1 e salve o mesmo em um arquivo chamado chap10ex1.aspx, na pasta chap10, dentro
da pasta wwwroot, conforme descrito no item: Check List para acompanhar os exemplos deste livro, no Captulo 6.
Para acessar esta pgina utilize o seguinte endereo: http://localhost/chap10/chap10ex1.aspx
Ao carregar a pgina voc ir obter uma pgina semelhante pgina indicada na Figura 10.5.
Figura 10.5: A classe SqlConnection.
367
CAPTULO 10: ACESSANDO BANCOS DE DADOS COM ASP.NET PARTE 1
www.juliobattisti.com.br
Comentrios sobre o cdigo do exemplo Chap10Ex1.aspx.
Observe que a primeira coisa que fizemos foi referenciar os namespaces System.Data e System.Data.SqlClient:
<%@ Import Namespace=System.Data %>
<%@ Import Namespace=System.Data.SqlClient %>
Se no fizssemos essa referncia, obteramos um erro de compilao, ao carregar a pgina, conforme indicado na
Figura 10.6.
Figura 10.6: Erro por no referenciar os namespaces necessrios.
Observe o texto em destaque, onde dito que no foi possvel encontrar SqlConnection. Isto acontece porque esta
classe faz parte do namespace System.Data.SqlClient, o qual no foi referenciado na pgina ASP.NET.
Em seguida criamos um varivel MinhaConexo, baseada na classe SqlConnection:
SqlConnection MinhaConexo = new
SqlConnection(server=SERVIDOR\\NETSDK;uid=sa;pwd=;database=pubs);
Observe que este um comando nico, que foi dividido em duas linhas por falta de espao. Declaramos a varivel
MinhaConexo como sendo do tipo SqlConnection, ao mesmo tempo que inicializamos esta varivel, passando como
parmetro uma string de conexo. Na string passada como parmetro so definidas as seguintes informaes:
368 www.juliobattisti.com.br
ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB
Nome da instncia do SQL Server: SERVIDOR\NETSDK.
Nome do usurio: uid=sa.
Senha: pwd= , neste caso significa senha em branco.
Banco de dados para fazer a conexo: database=pubs.
importante salientar que o objeto do tipo SqlConnection foi criado, porm ainda no foi estabelecida a conexo,
conforme pode ser confirmado pelo valor da propriedade State=Closed, na Figura 10.5.
No restante do evento Load, montamos uma string (auxPropriedades), onde vamos concatenando o nome e o
valor das propriedades do objeto MinhaConexo. Observe que anexamos dois caracteres de nova linha \n\n.
Isso feito para ir para uma nova linha a cada propriedade (um \n) e para deixar uma linha em branco entre a
exibio de cada propriedade (mais um \n).
Aps termos montado a string auxPropriedades, definimos a fonte do controle ExibePropriedades para negrito e
atribumos o valor da varivel auxPropriedades, propriedade Text do controle ExibePropriedades, conforme indicado
no fragmento a seguir:
ExibePropriedades.Font.Bold=true;
ExibePropriedades.Text=auxPropriedades;
O controle ExibePropriedades um Web Server Control do tipo TextBox com mltiplas linhas. Para maiores
informaes sobre este controle, consulte o Captulo 9.
Na Tabela 10.2 temos uma descrio dos principais mtodos da classe SqlConnection:
Tabela 10.2 Principais mtodos da classe SqlConnection.
Mtodo Descrio
Open Abre a conexo de acordo com as definies da propriedade ConnectionString.
Close Fecha a conexo com o banco de dados.
ChangeDatabase Altera o banco de dados associado com a conexo.
O principal evento do objeto SqlConnection o evento StateChange. Este evento ocorre quando o estado da conexo
alterado de Open para Closed ou vice-versa.
No exemplo da Listagem 10.1, podemos adicionar o seguinte comando, logo aps a criao da conexo MinhaConexo:
MinhaConexo.Open();
Este comando abre a conexo MinhaConexo. Aps inserirmos este comando na Listagem 10.1 e recarregarmos a
pgina, obteremos o resultado indicado na Figura 10.7.
369
CAPTULO 10: ACESSANDO BANCOS DE DADOS COM ASP.NET PARTE 1
www.juliobattisti.com.br
Figura 10.7: Utilizando o mtodo Open da classe SqlConnection.
Estabelecendo uma Conexo com o Microsoft Access OleDbConnection
A classe OleDbConnection faz parte do namespace System.Data.OleDb. Esta classe utilizada para estabelecer uma
conexo com uma fonte de dados, para a qual exista um OLE-DB Provider. Diferente do que acontecia com ADO, no
podemos executar um comando SQL, utilizando a classe OleDbConnection; ao invs disso devemos utilizar um objeto
Command. Ainda neste captulo estudaremos as classes utilizadas para executar comandos em um banco de dados.
A seguir temos um exemplo de criao de um objeto do tipo OleDbConnection:
String DefineConexo= PROVIDER=MICROSOFT.JET.OLEDB.4.0; +
DATA SOURCE=c:\\meus documentos\\NorthWind.mdb;
OleDbConnection MinhaConexo = new OleDbConnection(DefineConexo);
Primeiro definimos uma string chamada DefineConexo. Esta string contm as informaes necessrias para estabelecer
a conexo com um banco de dados do Microsoft Access. importante salientar a utilizao das duas barras invertidas
(\\), ao invs de uma nica barra. Como a barra invertida utilizada para caracteres de escape, no C#, como por
exemplo: \n para quebra de linha, quando queremos representar uma barra e no um caractere de escape, precisamos
colocar duas barras. Se voc colocar somente uma barra, ir obter o erro indicado na Figura 10.8, quando tentar
carregar a pgina:
370 www.juliobattisti.com.br
ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB
Figura 10.8: Erro por usarmos um nica barra (\) ao invs de duas barras (\\).
Observe a mensagem em destaque, na Figura 10.8, informando que temos um caractere de escape, invlido. Em
seguida criamos um objeto do tipo OleDbConnection, chamado MinhaConexo e passamos a string DefineConexo
como parmetro para o mtodo construtor do objeto MinhaConexo.
Na Tabela 10.3 temos os componentes que podem fazer parte da string de conexo (ConnectionString), para o OLE-
DB Provider do Microsoft Access.
Tabela 10.3 Definindo a propriedade ConnectionString para uma fonte do Microsoft Access.
Propriedade Descrio
Provider Deve ser especificado o OLE DB Provider para o Microsoft Access. Para esta propriedade
utilizamos o seguinte valor: Microsoft.Jet.OLEDB.4.0.
Data Source Informamos o caminho para o arquivo .mdb. Por exemplo, C:\\Arquivos de
programas\\NorthWind.mdb.
User ID Especifica o nome do usurio com a qual a conexo ser estabelecida. Caso esta
propriedade no seja informada, a mesma ser definida como admin, o qual o
usurio padro para o Microsoft Access.
371
CAPTULO 10: ACESSANDO BANCOS DE DADOS COM ASP.NET PARTE 1
www.juliobattisti.com.br
Na Tabela 10.4 temos uma descrio das principais propriedades da classe OleDbConnection:
Tabela 10.4 Principais propriedades da classe OleDbConnection.
Propriedade Descrio
Password Informa a senha para o usurio que far a conexo. Caso esta propriedade no seja
informada, a mesma ser definida como , ou seja, senha em branco.
Propriedade Descrio
ConnectionString utilizada para definir ou retornar uma string de texto onde so informados os diversos
parmetros para estabelecer a conexo, como por exemplo o nome do servidor, a
instncia, o nome do banco de dados, o nome de login e senha.
ConnectionTimeOut Define por quanto tempo feita a tentativa de estabelecer a conexo. Aps o tempo
definido nesta propriedade, a tentativa cancelada e um erro gerado.
Database utilizada para definir ou retornar o nome do banco de dados que ser utilizado quando
a conexo for estabelecida. Utilizada, normalmente, para conexo com o SQL Server ou
ORACLE.
State Retorna o estado atual da conexo.
Vamos apresentar um pequeno exemplo, onde criamos uma conexo com o banco de dados C:\Meus
documentos\NorthWind.mdb. Uma vez estabelecida a conexo, vamos exibir as propriedades desta conexo em um
Web Server Control do tipo TextArea. Vamos utilizar o evento Page_Load, da pgina ASP.NET, para estabelecer a
conexo com o Banco de dados pubs.
Na Listagem 10.2 temos o cdigo para o exemplo proposto.
Listagem 10.2 A classe OleDbConnection chap10ex2.aspx.
<%@ Import Namespace=System.Data %>
<%@ Import Namespace=System.Data.OleDb %>
<html>
<script language=C# runat=server>
protected void Page_Load(Object Src, EventArgs E )
{
// Crio uma conexo com o banco de dados pubs localizado no servidor local.
// Vamos acessar a instncia SERVIDOR\NETSDK.
372 www.juliobattisti.com.br
ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB
String DefineConexo= PROVIDER=MICROSOFT.JET.OLEDB.4.0; +
DATA SOURCE=c:\\meus documentos\\NorthWind.mdb;
OleDbConnection MinhaConexo = new OleDbConnection(DefineConexo);
MinhaConexo.Open();
// Declaro uma varivel do tipo String: auxPropriedades.
// A varivel auxPropriedades ir conter o valor das propriedades
// da conexo minhaConexo.
String auxPropriedades;
auxPropriedades = Propriedades da conexo:;
auxPropriedades = auxPropriedades + \n\n + ConnectionString: +
MinhaConexo.ConnectionString.ToString();
auxPropriedades = auxPropriedades + \n\n + Database: +
MinhaConexo.Database.ToString();
auxPropriedades = auxPropriedades + \n\n + DataSource: +
MinhaConexo.DataSource.ToString();
auxPropriedades = auxPropriedades + \n\n + State: +
MinhaConexo.State.ToString();
ExibePropriedades.Font.Bold=true;
ExibePropriedades.Text=auxPropriedades;
}
</script>
<body>
<h3><font face=Verdana>Classe OleDbConnection!!!</font></h3>
373
CAPTULO 10: ACESSANDO BANCOS DE DADOS COM ASP.NET PARTE 1
www.juliobattisti.com.br
<asp:TextBox
runat=server
id=ExibePropriedades
Text=
Rows=10"
Cols=70"
Font_Face=Arial
Font_Size=3"
BackColor=lightblue
TextMode=MultiLine
/>
</body>
</html>
Digite o cdigo da Listagem 10.2 e salve o mesmo em um arquivo chamado chap10ex2.aspx, na pasta chap10, dentro
da pasta wwwroot, conforme descrito no item: Check List para acompanhar os exemplos deste livro, no Captulo 6.
Para acessar esta pgina utilize o seguinte endereo: http://localhost/chap10/chap10ex2.aspx
Voc ir obter uma pgina semelhante pgina indicada na Figura 10.9.
Figura 10.9: Propriedades da classe OleDbConnection.
374 www.juliobattisti.com.br
ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB
Comentrios sobre o cdigo do exemplo Chap10Ex2.aspx.
Os mesmos comentrios feitos para o exemplo da Listagem 10.1.
Na Tabela 10.5 temos uma descrio dos principais mtodos da classe OleDbConnection:
Tabela 10.5 Principais mtodos da classe OleDbConnection.
Mtodo Descrio
Open Abre a conexo de acordo com as definies da propriedade ConnectionString.
Close Fecha a conexo com o banco de dados.
ChangeDatabase Altera o banco de dados associado com a conexo. Utilizado para conexes com o SQL
Server ou ORACLE.
O principal evento do objeto OleDbConnection o evento StateChange. Este evento ocorre quando o estado da
conexo alterado de Open para Closed ou vice-versa.
Muito bem, j sabemos estabelecer uma conexo com um banco de dados. E agora? Ainda precisamos aprender como
fazer as seguintes operaes:
Definir um comando para ser executado no banco de dados.
Retornar dados de uma ou mais tabelas.
Retornar informaes sobre os relacionamentos entre as tabelas.
Exibir os resultados obtidos.
Nos prximos tpicos aprenderemos a realizar estas operaes.
Uma Viso Geral do Processo de Acesso a Dados
Existem muitas maneiras de estabelecer uma conexo com uma fonte de dados, retornar um conjunto de dados e exibir
estes dados em uma pgina ASP.NET.
Neste captulo estaremos utilizando a seguinte abordagem:
Criar uma conexo com uma fonte de dados utilizando SqlConnection ou OleDbConnection.
Definir um comando SQL a ser executado no banco de dados. O comando definido utilizando um objeto do
tipo SqlDataAdapter ou OleDbDataAdapter. O comando SQL define os dados que sero retornados a partir do
banco de dados. Tambm podemos utilizar um objeto SqlCommand ou OleDbCommand. Uma opo criar
um objeto Command e depois a propriedade SelectCommand do objeto DataAdapter como sendo igual ao
objeto Command. Outra opo passar o comando SQL como parmetro do objeto DataAdapter, o que faz
375
CAPTULO 10: ACESSANDO BANCOS DE DADOS COM ASP.NET PARTE 1
www.juliobattisti.com.br
com que no seja necessria a criao explcita de um objeto Command. O objeto DataAdapter faz a ligao
de um ou mais objetos do tipo Command com um objeto do tipo DataSet. Por exemplo, podemos ligar vrios
objetos Command com um nico DataSet. Iremos detalhar todos estes aspectos nos exemplos deste captulo.
Utilizamos os dados retornados pelo(s) comando(s) SQL para preencher um objeto do tipo DataSet.
Vamos utilizar um Web Server Control Datagrid, para exibir os dados associados ao objeto do tipo DataSet.
Na Figura 10.10 temos uma viso geral deste processo.
Figura 10.10: Passos para acessar e exibir dados em uma pgina ASP.NET.
importante salientar que esta apenas uma das maneiras de acessarmos dados e exibi-los em uma pgina ASP.NET.
Nos Captulos 11 e 12 veremos outras maneiras de ter acesso a variadas fontes de dados. No restante deste captulo
vamos estudar os objetos indicados no diagrama da Figura 10.10.
376 www.juliobattisti.com.br
ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB
Criando Objetos Command
Para criar objetos Command temos duas opes:
SqlCommand: Este objeto utilizado para definir um comando que ser executado atravs de uma conexo do
tipo SqlConnection.
OleDbCommand: Utilizado para definir um comando que ser executado atravs de uma conexo do tipo OleDbConnection.
Conforme descrevemos no tpico anterior, podemos criar um objeto Command, no qual definimos um comando SQL
a ser executado atravs de uma conexo. As propriedades dos objetos SqlCommand e OleDbCommand so semelhantes.
Na Tabela 10.6 temos uma descrio das principais propriedades das classes SqlCommand/OleDbCommand:
Tabela 10.6 Principais propriedades das classes SqlCommand/OleDbCommand.
Propriedade Descrio
CommandText Esta propriedade utilizada para definir ou retornar o comando SQL ou o nome de um
Stored Procedure associado com o comando.
CommandTimeOut Define por quanto tempo o Framework .NET tenta executar o comando. Se no tempo
definido por esta propriedade, o comando no for executado com sucesso, o mesmo
suspenso e uma mensagem de erro retornada.
CommandType Pode ser definida como Text, que o valor padro e significa que o valor atribudo
propriedade CommandText um comando SQL. Tambm pode assumir o valor
StoredProcedure; neste caso significa que o valor atribudo propriedade CommandText
o nome de um Stored Procedure.
Connection Esta propriedade utilizada para definir ou retornar a conexo atravs da qual o
comando executado.
Na Tabela 10.7 temos uma descrio dos principais mtodos das classes SqlCommand/OleDbCommand:
Tabela 10.7 Principais mtodos das classes SqlCommand/OleDbCommand.
Mtodo Descrio
Cancel Cancela a execuo do comando.
CreateParameter Utilizada para a criao e definio de parmetros. Podemos utilizar parmetros quando
estamos executando um Stored Procedure ou uma consulta parametrizada do Microsoft
Access.
ExecuteNonQuery Executa o comando definido na propriedade CommandText, atravs da conexo definida
na propriedade Connection, para consultas que no retornam dados. Exemplo de consultas
que no retornam dados so consultas de atualizao, adio ou excluso. Este mtodo
retorna um valor inteiro, valor este que indica o nmero de registros afetados pela
execuo do comando.
377
CAPTULO 10: ACESSANDO BANCOS DE DADOS COM ASP.NET PARTE 1
www.juliobattisti.com.br
Vamos apresentar um pequeno exemplo, onde criamos uma conexo com o banco de dados C:\Meus
documentos\NorthWind.mdb. Uma vez estabelecida a conexo vamos criar um objeto OleDbCommand associado
com esta conexo e vamos exibir as propriedades do objeto OleDbCommand em um Web Server Control do tipo
TextArea. Vamos utilizar o evento Page_Load, da pgina ASP.NET, para estabelecer a conexo com o Banco de dados
pubs do SQL Server.
Na Listagem 10.3 temos o cdigo para o exemplo proposto.
Listagem 10.3 A classe OleDbCommand chap10ex3.aspx.
<%@ Import Namespace=System.Data %>
<%@ Import Namespace=System.Data.OleDb %>
<html>
<script language=C# runat=server>
protected void Page_Load(Object Src, EventArgs E )
{
// Crio uma conexo com o banco de dados Northwind.mdb
// localizado na pasta C:\Meus documentos.
String DefineConexo= PROVIDER=MICROSOFT.JET.OLEDB.4.0; +
DATA SOURCE=c:\\meus documentos\\NorthWind.mdb;
OleDbConnection MinhaConexo = new OleDbConnection(DefineConexo);
// Agora crio um objeto OleDbCommand chamado MeuComando.
// Primeiro defino o texto do comando em uma varivel TextoDoComando.
// Em seguida crio um objeto do tipo OleDbCommand e passo esta
// varivel como parmetro.
string TextoDoComando = SELECT NmeroDoPedido, CdigoDoCliente,
+ PasDeDestino FROM Pedidos;
OleDbCommand MeuComando = new OleDbCommand(TextoDoComando,MinhaConexo);
MinhaConexo.Open();
378 www.juliobattisti.com.br
ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB
// Declaro uma varivel do tipo String: auxPropriedades.
// A varivel auxPropriedades ir conter o valor das propriedades
// do comando MeuComando.
String auxPropriedades;
auxPropriedades = Propriedades do objeto OleDbCommand:;
auxPropriedades = auxPropriedades + \n\n + CommandType: +
MeuComando.CommandType.ToString();
auxPropriedades = auxPropriedades + \n\n + CommandText: +
MeuComando.CommandText.ToString();
auxPropriedades = auxPropriedades + \n\n + Timeout: +
MeuComando.CommandTimeout.ToString();
auxPropriedades = auxPropriedades + \n\n + Connection: +
MeuComando.Connection.ToString();
ExibePropriedades.Font.Bold=true;
ExibePropriedades.Text=auxPropriedades;
}
</script>
<body>
<h3><font face=Verdana>Classe OleDbCommand!!!</font></h3>
<asp:TextBox
runat=server
id=ExibePropriedades
Text=
Rows=10"
Cols=70"
379
CAPTULO 10: ACESSANDO BANCOS DE DADOS COM ASP.NET PARTE 1
www.juliobattisti.com.br
Font_Face=Arial
Font_Size=3"
BackColor=lightblue
TextMode=MultiLine
/>
</body>
</html>
Digite o cdigo da Listagem 10.3 e salve o mesmo em um arquivo chamado chap10ex3.aspx, na pasta chap10, dentro
da pasta wwwroot, conforme descrito no item: Check List para acompanhar os exemplos deste livro, no Captulo 6.
Para acessar esta pgina utilize o seguinte endereo: http://localhost/chap10/chap10ex3.aspx
Voc ir obter uma pgina semelhante pgina indicada na Figura 10.11.
Comentrios sobre o cdigo do exemplo Chap10Ex3.aspx.
Neste exemplo criamos um objeto do tipo OleDbCommand, conforme indicado no fragmento de cdigo a seguir:
string TextoDoComando = SELECT NmeroDoPedido, CdigoDoCliente,
+ PasDeDestino FROM Pedidos;
OleDbCommand MeuComando = new OleDbCommand(TextoDoComando,MinhaConexo);
Figura 10.11: Propriedades da classe OleDbCommand.
380 www.juliobattisti.com.br
ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB
Observe que primeiro criamos uma string TextoDoComando, a qual atribumos o comando SQL que ser associado
com o objeto OleDbCommand. Em seguida criamos o objeto MeuComando e passamos como parmetros, para o
mtodo construtor do objeto, primeiro a string TextoDoComando e em seguida o nome da conexo, atravs da qual o
comando deve ser executado.
importante salientar que, neste momento, o comando ainda no foi executado e, portanto, ainda no foram retornados dados.
Em seguida comeamos a concatenar os valores das propriedades do objeto MeuComando em uma string
auxPropriedades. No final, o valor desta string exibido em um controle do tipo TextArea.
Ao invs dos objetos OleDbConnection e OleDbCommand, poderamos utilizar os objetos SqlConnection e
SqlCommand para conectar com o SQL Server, conforme indicado no cdigo a seguir:
SqlConnection MinhaConexo = new
SqlConnection(server=SERVIDOR\\NETSDK;uid=sa;pwd=;database=pubs);
string TextoDoComando = SELECT au_id, au_lname, au_fname FROM authors;
OleDbCommand MeuComando = new OleDbCommand(TextoDoComando,MinhaConexo);
MinhaConexo.Open();
Apenas definir um objeto OleDbCommand ou SqlCommand no faz com que dados sejam retornados atravs da
conexo definida. Quando os dados so retornados, os mesmos so armazenados em um objeto do tipo DataSet. Mas
precisamos de uma maneira de ligar o objeto Command com o objeto DataSet, atravs dos seguintes passos:
O comando definido na propriedade CommandText, do objeto Command executado.
Os dados retornados so ligados a um objeto do tipo DataSet.
O objeto que faz esta ligao o DataAdapter.Vamos estudar este objeto em detalhes. O objeto DataAdapter
(SqlDataAdapter ou OleDbDataAdapter) trabalha em conjunto com o objeto DataSet. Nos exemplos do prximo
tpico veremos a utilizao do objeto DataAdapter e apresentaremos apenas alguns aspectos bsicos do objeto DataSet.
No tpico seguinte iremos detalhar o objeto DataSet. Tambm estaremos utilizando alguns elementos bsicos do
objeto DataGrid, o qual ser explicado em detalhes no final do Captulo.
Retornando Dados com DataAdapter
Para criar objetos DataAdapter temos duas opes:
SqlDataAdapter: Este objeto utilizado para executar um ou mais comandos ou Stored Procedures, em um
banco de dados do SQL Server e associar os resultados obtidos com um objeto do tipo DataSet.
OleDbDataAdapter: Utilizado para executar um ou mais comandos em uma fonte de dados, utilizando o OLE-
DB Provider respectivo, e associar os resultados obtidos com um objeto do tipo DataSet.
Os objetos SqlDataAdapter/OleDbDataAdapter funcionam como uma ponte entre uma fonte de dados e o objeto
DataSet, tanto para acesso quanto para alteraes nos dados. Esta ponte pode ser estabelecida de duas maneiras:
381
CAPTULO 10: ACESSANDO BANCOS DE DADOS COM ASP.NET PARTE 1
www.juliobattisti.com.br
1. Atravs da utilizao do mtodo Fill do objeto DataAdapter, para retornar dados de uma fonte de dados e colocar
estes dados em um objeto DataSet.
2. Atravs da utilizao do mtodo Update do objeto DataAdapter, mtodo este que sincroniza os dados da fonte de
dados original, com as modificaes feitas nos dados do objeto DataSet.
Na Tabela 10.8 temos uma descrio das principais propriedades das classes SqlDataAdapter/OleDbDataAdapter:
Tabela 10.8 Principais propriedades das classes SqlDataAdapter/OleDbDataAdapter.
Na Tabela 10.9 temos uma descrio dos principais mtodos das classes SqlDataAdapter/OleDbDataAdapter:
Tabela 10.9 Principais mtodos das classes SqlDataAdapter/OleDbDataAdapter:
Propriedade Descrio
DeleteCommand Utilizada para definir ou retornar um comando SQL para excluso de dados, normalmente
um comando DELETE.
InsertCommand Utilizada para definir ou retornar um comando SQL para insero de novos dados,
normalmente um comando INSERT.
SelectCommand Utilizada para definir ou retornar um comando SQL, utilizado para retornar dados,
normalmente um comando SELECT. Tambm podemos atribuir, a esta propriedade, um
objeto Command previamente criado.
UpdateCommand Utilizada para definir ou retornar um comando SQL que atualiza dados. Normalmente um
comando UPDATE.
Mtodo Descrio
Fill Com certeza o mtodo mais utilizado. Este mtodo executa o comando definido na propriedade
SelectCommand. Os dados retornados pela execuo do comando definido na propriedade
SelectCommand so associados com um objeto do tipo DataSet.
FillSchema Este mtodo retorna uma tabela em branco, isto , com zero registro, porm com a mesma
estrutura da tabela original. Na prtica o que este mtodo faz copiar a estrutura de uma tabela.
Update Com ASP.NET trabalhamos com um modelo de dados desconectados, conforme descrito no incio
deste captulo. Uma vez retornados os dados em um objeto do tipo DataSet, a conexo com o
banco de dados fechada. Alteraes podem ser feitas nos dados desconectados, porm estas
alteraes precisam ser enviadas para o banco de dados, quer seja o SQL Server, quer seja um
arquivo .mdb do Microsoft Access. O mtodo Update utilizado para enviar estas alteraes para o
banco de dados. O mtodo executa os comandos InsertCommand, UpdateCommand e
DeleteCommand para cada insero, atualizao ou excluso, feitas nos dados desconectados, de
tal forma que estas alteraes sejam enviadas para a fonte de dados original. Em poucas palavras:
sincroniza os dados do objeto DataSet com o conjunto de dados originais.
382 www.juliobattisti.com.br
ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB
Na Tabela 10.10 temos uma descrio dos principais eventos das classes SqlDataAdapter/OleDbDataAdapter:
Tabela 10.10 Principais eventos das classes SqlDataAdapter/OleDbDataAdapter:
O Objeto DataSet
Os objetos SqlDataAdapter/OleDbDataAdapter, descritos no tpico anterior, so utilizados para executar um comando
SQL ou um Stored Procedure, em um banco de dados e retornar um ou mais conjuntos de dados. Precisamos de uma
estrutura capaz de receber e manipular os dados retornados; esta estrutura o objeto DataSet. O objeto DataSet
derivado da classe DataSet, do namespace System.Data.
O objeto DataAdapter executa um comando atravs de uma conexo e retorna os dados para um objeto DataSet. A
conexo desfeita, pois o objeto DataSet fornece as funcionalidades necessrias para acessarmos e manipularmos os
dados, estando desconectados do servidor. Acessamos e alteramos os dados conforme necessrio e depois as alteraes
efetuadas so sincronizadas com o servidor.
DataSet , sem dvida, o principal objeto do ADO.NET, assim como o objeto RecordSet o principal objeto do ADO.
Um objeto DataSet formado por uma coleo de objetos do tipo DataTable, os quais pertencem coleo Tables.
Para representar o relacionamento entre dois objetos do tipo DataTable, utilizamos um objeto do tipo DataRelation.
Por exemplo, podemos criar um DataSet que contm duas tabelas: Pedidos e Clientes. A tabela Clientes relaciona-se
com a tabela Pedidos, atravs de um relacionamento do tipo um para vrios, ou seja, um cliente pode fazer vrios
pedidos. Podemos representar este relacionamento utilizando um objeto do tipo
DataRelation.
Podemos garantir a integridade dos dados atravs da definio de campos do tipo Chave
Primria utilizando o objeto UniqueConstraint; e da definio de Chaves Estrangeiras
utilizando o objeto ForeignKeyConstraint.
O objeto DataSet l e grava dados e a estrutura dos dados no formato de documentos
XML, os quais podem ser enviados pela Internet via protocolo HTTP, o que facilita a
troca de informaes com sistemas de outras empresas, sistemas estes tambm habilitados
ao XML.
Evento Descrio
FillError Ocorre quando um erro retornado durante a execuo do mtodo Fill.
RowUpdated Ocorre durante uma atualizao, aps o respectivo comando ter sido executado na fonte
de dados original.
RowUpdating Ocorre durante uma atualizao, antes do respectivo comando ter sido executado na fonte
de dados original.
NOTA: Para maiores
detalhes sobre o modelo
relacional de dados e
relacionamentos entre
tabelas, consulte o Anexo
II. Neste anexo tambm
so descritos os conceitos
de Chave primria, Chave
Estrangeira, normalizao
e integridade de dados.
383
CAPTULO 10: ACESSANDO BANCOS DE DADOS COM ASP.NET PARTE 1
www.juliobattisti.com.br
Na Tabela 10.11 temos uma descrio das principais propriedades da classe DataSet:
Tabela 10.11 Principais propriedades da classe DataSet.
Propriedade Descrio
DataSetName Utilizada para definir ou retornar o nome do DataSet.
EnforceConstraints Pode ser utilizada para definir ou retornar um valor True ou False. Se o valor desta
propriedade for True, as regras de integridade sero observadas em uma operao de
atualizao. Por exemplo, se alterarmos o cdigo do cliente em um pedido da tabela
pedidos para 01010 e no existir o cliente com o cdigo 01010 na tabela Clientes, a
operao no ser realizada. Se o valor da propriedade EnforceConstraints for False, a
operao descrita no nosso exemplo ser realizada sem que nenhuma verificao seja feita.
Relations Retorna uma coleo com todos os relacionamentos existentes entre as tabelas do
DataSet.
Tables Retorna uma coleo com todas as tabelas do DataSet.
Na Tabela 10.12 temos uma descrio dos principais mtodos da classe DataSet:
Tabela 10.12 Principais mtodos da classe DataSet.
Mtodo Descrio
AcceptChanges Torna definitivas todas as alteraes feitas nas tabelas ou
relacionamentos do DataSet, desde que o mesmo foi inicializado
ou desde a ltima vez que o mtodo AcceptChanges foi chamado.
Clear Remove todos os dados do DataSet, zerando todas as linhas de
todas as tabelas.
Clone Faz uma cpia idntica do DataSet, inclusive dos seus dados, para
um outro objeto do tipo DataSet.
GetChanges Retorna um objeto do tipo DataSet, contendo todas as alteraes
que foram feitas desde a inicializao do DataSet original, ou
desde a ltima chamada do mtodo AcceptChanges.
HasChanges Retorna um valor do tipo Boleano. True indica que houve
alteraes nos dados do DataSet adies, alteraes ou
excluses. False indica que no houve alteraes.
Neste momento j somos capazes de estabelecer uma conexo com o banco de dados, definir um objeto DataAdapter
para executar um comando atravs da conexo estabelecida e preencher um objeto DataSet com os dados retornados.
A prxima etapa exibir os dados obtidos. A exibio dos dados a nica coisa que o usurio v, ao acessar a
384 www.juliobattisti.com.br
ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB
pgina. Existem maneiras variadas para exibir os dados em uma pgina ASP.NET.
Neste captulo estaremos utilizando o controle DataGrid. Em seguida apresentaremos
um exemplo simples de conexo com um banco de dados do Microsoft Access. Neste
exemplo vamos utilizar o controle DataGrid. Mais adiante, neste captulo, iremos
estudar este controle, em detalhes.
Vamos conectar com o banco de dados C:\Meus documentos\NorthWind.mdb. Definiremos um comando SQL que
retorna os seguintes campos da tabela Clientes:
CdigoDoCliente
NomeDaEmpresa
Cidade
Pas
Na Listagem 10.4 temos o cdigo para o exemplo proposto.
Listagem 10.4 Um exemplo completo chap10ex4.aspx.
<%@ Import Namespace=System.Data %>
<%@ Import Namespace=System.Data.OleDb %>
<html>
<script language=C# runat=server>
protected void Page_Load(Object Src, EventArgs E )
{
// Crio uma conexo com o banco de dados pubs localizado no servidor local.
// Vamos acessar a instncia SERVIDOR\NETSDK.
String DefineConexo= PROVIDER=MICROSOFT.JET.OLEDB.4.0; +
DATA SOURCE=c:\\meus documentos\\NorthWind.mdb;
OleDbConnection MinhaConexo = new OleDbConnection(DefineConexo);
// Utilizamos um objeto DataAdapter para executar um comando SQL,
// o qual retorna todos os dados da tabela Clientes.
IMPORTANTE: Tambm
utilizaremos um objeto do
tipo DataView que ser
detalhado mais adiante.
385
CAPTULO 10: ACESSANDO BANCOS DE DADOS COM ASP.NET PARTE 1
www.juliobattisti.com.br
OleDbDataAdapter MeuComando = new OleDbDataAdapter(SELECT CdigoDoCliente,
+ NomeDaEmpresa, Cidade, Pas FROM Clientes, MinhaConexo);
// Criamos e preenchemos um objeto DataSet.
// Observe que no temos mais o objeto Recordset,
// como era de praxe com o ASP 3.0.
DataSet ds = new DataSet();
// Utilizo o mtodo Fill do objeto DataAdapter, para preencher
// o objeto DataSet, com os dados retornados pelo comando SQL.
MeuComando.Fill(ds);
// Conectamos um controle DataGrid com o DataSet criado anteriormente.
// MinhaGrade o id (nome) de um controle do tipo
// DataGrid que est na seo de apresentao da pgina.
DataView source = new DataView(ds.Tables[0]);
MinhaGrade.DataSource = source ;
MinhaGrade.DataBind();
}
</script>
<body>
<% Exibe as informaes do DataGrid no corpo da pgina. %>
<h3><font face=Verdana>Clientes da empresa North Wind!!!</font></h3>
<ASP:DataGrid id=MinhaGrade runat=server
Width=700"
BackColor=#ccccff
BorderColor=black
386 www.juliobattisti.com.br
ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB
ShowFooter=false
CellPadding=3
CellSpacing=0"
Font-Name=Verdana
Font-Size=8pt
HeaderStyle-BackColor=#aaaadd
MaintainState=false
/>
</body>
</html>
Digite o cdigo da Listagem 10.4 e salve o mesmo em um arquivo chamado chap10ex4.aspx, na pasta chap10, dentro
da pasta wwwroot, conforme descrito no item: Check List para acompanhar os exemplos deste livro, no Captulo 6.
Para acessar esta pgina utilize o seguinte endereo: http://localhost/chap10/chap10ex4.aspx
Voc ir obter a pgina indicada na Figura 10.12.
Comentrios sobre o cdigo do exemplo Chap10Ex4.aspx.
A primeira coisa que fizemos foi importar os namespaces necessrios System.Data e System.Data.OleDb:
<%@ Import Namespace=System.Data %>
<%@ Import Namespace=System.Data.OleDb %>
Utilizamos o evento Load da pgina para executar os comandos que estabelecem a conexo com o banco de
dados e retornam dados da tabela Clientes Page_Load.
Para estabelecer uma conexo com o banco de dados NorthWind.mdb, utilizamos um objeto OleDbCommand.
Para maiores detalhes sobre este objeto consulte o tpico respectivo, no incio deste captulo.
Uma vez definida a conexo, utilizamos um objeto OleDbDataAdapter, chamado MeuComando, para abrir a
conexo e executar um comando SQL que retorna alguns campos da tabela Clientes:
OleDbDataAdapter MeuComando = new OleDbDataAdapter(SELECT CdigoDoCliente, +
NomeDaEmpresa,Pas,Cidade FROM Clientes, MinhaConexo);
Conforme descrevemos anteriormente, podemos utilizar uma abordagem diferente: Primeiro criar um objeto
OleDbCommand (1 e 2 a seguir), depois declaramos um objeto DataAdapter e passamos o objeto Command para a
propriedade SelectCommand do objeto OleDbDataAdapter (3 e 4 a seguir):
1. string TextoDoComando = SELECT CdigoDoCliente, +
NomeDaEmpresa,Pas,Cidade FROM Clientes;
2. OleDbCommand MeuComando = new leDbCommand(TextoDoComando,MinhaConexo);
387
CAPTULO 10: ACESSANDO BANCOS DE DADOS COM ASP.NET PARTE 1
www.juliobattisti.com.br
Figura 10.12: Exibindo dados do Banco de dados NorthWind.mdb.
3. OleDbDataAdapter MeuDataAdapter = new OleDbDataAdapter( );
4. MeuDataAdapter.SelectCommand = MeuComando;
O prximo passo declarar um objeto do tipo DataSet, chamado ds, e utilizar o mtodo Fill, do objeto
OleDbDataAdapter, para preencher o objeto DataSet com os dados retornados a partir do banco de dados NorthWind:
DataSet ds = new DataSet();
MeuDataAdapter.Fill(ds);
O nome do objeto DataSet passado como parmetro para o mtodo Fill.
Na seqncia criamos um objeto do tipo DataView. A principal funo de um objeto DataView permitir a
ligao de uma fonte de dados com um controle do tipo Web Form Controls, como o caso do controle
DataGrid. Um objeto DataView representa uma viso de uma tabela de um objeto DataSet. A viso representada
pelo objeto DataView pode ser utilizada para pesquisar, ordenar, editar e navegar pelos registros da tabela. Na
criao do objeto DataView, associamos o mesmo com a primeira tabela do objeto DataSet, o que feito
utilizando a coleo Tables do objeto DataSet. Observe que a primeira tabela da coleo possui ndice zero
(ds.Tables[0]), a segunda tabela da coleo possui ndice um (ds.Tables[1]), e assim por diante.
DataView source = new DataView(ds.Tables[0]);
Em seguida definimos a propriedade DataSource do controle DataGrid (MinhaGrade), como sendo igual ao objeto
DataView recm-criado:
MinhaGrade.DataSource = source ;
388 www.juliobattisti.com.br
ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB
O passo final chamar o mtodo DataBind do controle DataGrid:
MinhaGrade.DataBind();
Feito isso, o controle DataGrid, colocado na seo de apresentao da pgina, ir exibir os registros retornados, no
formato de uma tabela. Observe que no precisamos iniciar um lao While para navegar por cada registro do objeto
DataView. Tambm no precisamos utilizar um monte de comandos Response.Write para montar a pgina de sada,
como fazamos no ASP 3.0. Todo este trabalho feito, automaticamente, pelo controle DataGrid.
Este exemplo salienta bem o poder e flexibilidade dos Web Server Controls, como o caso do controle DataGrid.
A ttulo de exemplo, vamos supor que voc deseja exibir apenas os clientes da
Alemanha. Para tal, basta alterar o comando SQL, da seguinte maneira:
OleDbDataAdapter MeuComando = new
OleDbDataAdapter(SELECT CdigoDoCliente,
+ NomeDaEmpresa, Cidade, Pas FROM Clientes where
Pas=Alemanha, MinhaConexo);
Voc obter o resultado indicado na Figura 10.13.
NOTA: Ainda neste
captulo estudaremos o
objeto DataView e o
controle DataGrid, em
maiores detalhes.
Figura 10.13: Exibindo os clientes da Alemanha.
O Objeto DataView
Para entender a funo do objeto DataView, vamos fazer uma recaptulao dos objetos que j estudamos neste captulo:
Utilizamos um objeto OleDbConnection ou SqlConnection para estabelecer uma conexo com o banco de dados.
389
CAPTULO 10: ACESSANDO BANCOS DE DADOS COM ASP.NET PARTE 1
www.juliobattisti.com.br
Figura 10.14: Acessando dados com ASP.NET.
Nesta figura fica bem destacado o papel de ponte entre o objeto DataSet e o controle DataGrid, exercido pelo objeto
DataView. No exemplo da figura, utilizamos o controle DataGrid, mas poderia ser qualquer outro Web Form Control
capaz de acessar dados de um DataView.
Um objeto DataView pode ser configurado para retornar apenas uma parte dos dados de um objeto DataTable. Podemos,
por exemplo, ter dois objetos DataView, ligados com o mesmo objeto DataTable, porm exibindo diferentes dados.
Vamos estudar mais alguns detalhes sobre o objeto DataView.
Na Tabela 10.13 temos uma descrio das principais propriedades da classe DataView:
Tabela 10.13 Principais propriedades da classe DataView.
O objeto DataAdapter faz a ponte entre um ou mais objetos Command (SqlCommand ou OleDbCommand) e
um objeto DataSet. Ao final deste processo, os dados esto armazenados em um objeto DataSet.
O objeto DataView faz a ponte entre o objeto DataSet e um Web Form ou Web Form Control, onde sero
exibidos os dados. Na Figura 10.14, temos uma viso geral deste processo:
Propriedade Descrio
AllowDelete Propriedade do tipo Boleana. Se contiver o valor True, podemos excluir registros; se
contiver o valor False, no so permitidas excluses. Esta propriedade pode ser utilizada
para definir ou para retornar um valor True ou False.
AllowEdit Utilizada para definir ou retornar um valor do tipo Boleano. Se o valor da propriedade
for True, so permitidas alteraes nos dados; caso contrrio os dados no podero ser
alterados.
AllowNew Utilizada para definir ou retornar um valor do tipo Boleano. Se o valor da propriedade for
True, poderemos adicionar novos registros, utilizando o mtodo AddNew; caso contrrio
novos registros no podero ser adicionados.
Count Retorna o nmero de registros no DataView.
390 www.juliobattisti.com.br
ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB
Na Tabela 10.14 temos uma descrio dos principais mtodos da classe DataView:
Tabela 10.14 Principais mtodos da classe DataView.
Propriedade Descrio
RowFilter Utilizada para definir ou retornar uma expresso que determina quais os dados do objeto
DataView que sero exibidos.
RowStateFilter Com ADO.NET mantido um histrico das alteraes feitas nos dados. O objeto DataView
mantm as verses anteriores de registros que foram alterados ou excludos. Podemos
utilizar esta propriedade para retornar ou definir uma expresso que filtra apenas os
registros em um determinado estado, como por exemplo: alterados, excludos, etc.
Sort Utilizada para definir ou retornar informaes sobre a(s) coluna(s) e a ordem de
classificao dos dados.
Table Utilizada para definir ou retornar a tabela a partir da qual o DataView obtm os dados.
Vamos apresentar alguns exemplos de utilizao do objeto DataView.
Exemplo 1: Neste exemplo faremos uma conexo com o banco de dados C:\Meus documentos\Northwind.mdb. Vamos
retornar os seguintes campos da tabela Funcionrios:
CdigoDoFuncionrio
Nome
Cargo
DataDeNascimento
Cidade
Os dados sero apresentados na pgina, utilizando um controle DataGrid. Tambm apresentaremos um controle ListBox,
onde o usurio poder selecionar um campo pelo qual os dados sero ordenados em ordem Crescente. Por padro, os
dados so classificados pelo CdigoDoFuncionrio.
Na Listagem 10.5 temos o cdigo para o exemplo proposto.
Mtodo Descrio
AddNew Adiciona um novo registro ao DataView.
Delete Exclui um registro do DataView.
Find Localiza um determinado registro, com base no valor da chave primria.
391
CAPTULO 10: ACESSANDO BANCOS DE DADOS COM ASP.NET PARTE 1
www.juliobattisti.com.br
Listagem 10.5 Um exemplo completo com DataView.
<%@ Import Namespace=System.Data %>
<%@ Import Namespace=System.Data.OleDb %>
<html>
<script language=C# runat=server>
protected void Page_Load(Object Src, EventArgs E )
{
// Crio uma conexo com o banco de dados do Microsoft Access.
// C:\Meus documentos\NorthWind.mdb.
String DefineConexo= PROVIDER=MICROSOFT.JET.OLEDB.4.0; +
DATA SOURCE=c:\\meus documentos\\NorthWind.mdb;
OleDbConnection MinhaConexo = new OleDbConnection(DefineConexo);
// Utilizamos um objeto DataAdapter para executar um comando SQL,
// o qual retorna todos os dados da tabela Clientes.
OleDbDataAdapter MeuComando = new OleDbDataAdapter(SELECT
CdigoDoFuncionrio, + Nome,Cargo,DataDeNascimento,Cidade
FROM Funcionrios, MinhaConexo);
// Criamos e preenchemos um objeto DataSet.
// Observe que no temos mais o objeto Recordset,
// como era de praxe com o ASP 3.0.
DataSet ds = new DataSet();
// Utilizo o mtodo Fill do objeto DataAdapter, para preencher
// o objeto DataSet, com os dados retornados pelo comando SQL.
392 www.juliobattisti.com.br
ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB
MeuComando.Fill(ds);
// Conectamos um controle DataGrid com o DataSet criado anteriormente.
// MinhaGrade o id (nome) de um controle do tipo
// DataGrid que est na seo de apresentao da pgina.
DataView source = new DataView(ds.Tables[0]);
// Utilizamos uma instruo Switch para definir a
// classificao dos dados com base no valor selecionado
// na lista CampoClassificar.
string aux = CampoClassificar.SelectedItem.Value;
switch (aux)
{
case Cargo:
source.Sort=Cargo ASC;
break;
case Cidade:
source.Sort=Cidade ASC;
break;
case Cdigo do Funcionrio:
source.Sort=CdigoDoFuncionrio ASC;
break;
case Data de Nascimento:
source.Sort=DataDeNascimento ASC;
break;
case Nome:
source.Sort=Nome ASC;
break;
default:
// outras opes.
393
CAPTULO 10: ACESSANDO BANCOS DE DADOS COM ASP.NET PARTE 1
www.juliobattisti.com.br
break;
}
MinhaGrade.DataSource = source ;
MinhaGrade.DataBind();
}
</script>
<body>
<% Exibe as informaes do DataGrid no corpo da pgina. %>
<h3><font face=Verdana>Funcionrios da empresa North Wind!!!</font></h3>
<BR>
<form runat=server>
<h3><font face=Verdana>Classificar por:</font></h3>
<asp:ListBox id=CampoClassificar
Rows=1"
Width=200px
runat=server>
<asp:ListItem>Cargo</asp:ListItem>
<asp:ListItem>Cidade</asp:ListItem>
<asp:ListItem selected=True>Cdigo do Funcionrio</asp:ListItem>
<asp:ListItem>Data de Nascimento</asp:ListItem>
<asp:ListItem>Nome</asp:ListItem>
</asp:ListBox>
<ASP:DataGrid id=MinhaGrade runat=server
Width=700"
BackColor=#ccccff
BorderColor=black
ShowFooter=false
CellPadding=3
CellSpacing=0"
Font-Name=Verdana
Font-Size=8pt
HeaderStyle-BackColor=#aaaadd
MaintainState=false
/>
394 www.juliobattisti.com.br
ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB
<BR>
<B>Clique para Classificar ></B></td>
<input type=submit value=Classificar runat=server>
</form>
</body>
</html>
Digite o cdigo da Listagem 10.5 e salve o mesmo em um arquivo chamado chap10ex5.aspx, na pasta chap10, dentro
da pasta wwwroot, conforme descrito no item: Check List para acompanhar os exemplos deste livro, no Captulo 6.
Para acessar esta pgina utilize o seguinte endereo: http://localhost/chap10/chap10ex5.aspx
Voc ir obter a pgina indicada na Figura 10.15.
Figura 10.15: Relao de funcionrios classificada pelo Cdigo do Funcionrio.
Observe que a listagem est classificada em ordem crescente do Cdigo do Funcionrio. Vamos testar o nosso exemplo.
Na lista Classificar Por, selecione Nome e d um clique no boto Classificar. Voc obter uma listagem classificada
pelo nome do funcionrio, conforme indicado na Figura 10.16:
Comentrios sobre o cdigo do exemplo Chap10Ex5.aspx.
395
CAPTULO 10: ACESSANDO BANCOS DE DADOS COM ASP.NET PARTE 1
www.juliobattisti.com.br
O cdigo para conectar com o banco de dados e retornar dados muito semelhante ao cdigo utilizado nos
exemplos anteriores. Para maiores detalhes sobre esta parte do cdigo consulte os exemplos das Listagens
10.1, 10.2, 10.3 e 10.4.
Na seo de apresentao da pgina criamos um formulrio e adicionamos um Web Server Control do tipo
ListBox chamado CampoClassificar. Este controle exibe as opes de classificao. O cdigo que define o
controle ListBox est indicado a seguir:
<asp:ListBox id=CampoClassificar
Rows=1"
Width=200px
runat=server>
<asp:ListItem>Cargo</asp:ListItem>
<asp:ListItem>Cidade</asp:ListItem>
<asp:ListItem selected=True>Cdigo do Funcionrio</asp:ListItem>
<asp:ListItem>Data de Nascimento</asp:ListItem>
<asp:ListItem>Nome</asp:ListItem>
</asp:ListBox>
Figura 10.16: Relao de funcionrios classificada pelo Nome.
396 www.juliobattisti.com.br
ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB
Observe que, por padro, ao carregarmos a pgina, a opo Cdigo do Funcionrio vem selecionada selected=True.
Para maiores informaes sobre o controle ListBox, consulte o Captulo 9.
Na seo de cdigo precisamos verificar qual a opo selecionada no ListBox e, com base na opo selecionada,
classificar os dados do DataView. Para isso utilizamos a instruo switch/case do C#, conforme indicado a seguir:
string aux = CampoClassificar.SelectedItem.Value;
<l
switch (aux)
{
case Cargo:
source.Sort=Cargo ASC;
break;
case Cidade:
source.Sort=Cidade ASC;
break;
case Cdigo do Funcionrio:
source.Sort=CdigoDoFuncionrio ASC;
break;
case Data de Nascimento:
source.Sort=DataDeNascimento ASC;
break;
case Nome:
source.Sort=Nome ASC;
break;
default:
// outras opes.
break;
}
Primeiro criamos uma string aux e atribumos a esta string o valor do item selecionado na ListBox CampoClassificar:
string aux = CampoClassificar.SelectedItem.Value;
397
CAPTULO 10: ACESSANDO BANCOS DE DADOS COM ASP.NET PARTE 1
www.juliobattisti.com.br
Em seguida, utilizamos a string aux como varivel de comparao para a instruo switch/case. Com base no valor da
string aux, definimos a classificao dos dados do DataView. Para definir a classificao utilizamos a propriedade
Sort do objeto source, objeto este que do tipo DataView, como no exemplo a seguir:
source.Sort=CdigoDoFuncionrio ASC;
A propriedade Sort uma String que contm o nome do campo seguido de um espao e
da palavra ASC para classificao crescente ou DESC para classificao decrescente.
Exemplo 2: Neste exemplo faremos uma conexo com o banco de dados C:\Meus
documentos\Northwind.mdb. Vamos retornar os seguintes campos da tabela Pedidos:
NmeroDoPedido
DataDoPedido
CidadeDeDestino
PasDeDestino
Os dados sero apresentados na pgina, utilizando um controle DataGrid. Tambm apresentaremos dois controles
ListBox. O usurio poder classificar os dados por um ou dois campos. Caso deseje classificar apenas por um campo,
basta selecionar No classificar, na segunda lista. Por padro os dados so classificados apenas pelo NmeroDoPedido.
Tambm apresentaremos dois controles do tipo RadioButton, onde o usurio pode selecionar classificao Crescente
ou Decrescente.
Na Listagem 10.6 temos o cdigo para o exemplo proposto.
Listagem 10.6 Um exemplo completo com DataView e o mtodo Sort com dois campos.
<%@ Import Namespace=System.Data %>
<%@ Import Namespace=System.Data.OleDb %>
<html>
<script language=C# runat=server>
protected void Page_Load(Object Src, EventArgs E )
{
// Crio uma conexo com o banco de dados do Microsoft Access.
// C:\Meus documentos\NorthWind.mdb.
String DefineConexo= PROVIDER=MICROSOFT.JET.OLEDB.4.0; +
IMPORTANTE: Para
maiores informaes
sobre a instruo switch/
case e sobre as demais
instrues de controle de
fluxo do C#, consulte o
Captulo 3.
398 www.juliobattisti.com.br
ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB
DATA SOURCE=c:\\meus documentos\\NorthWind.mdb;
OleDbConnection MinhaConexo = new OleDbConnection(DefineConexo);
// Utilizamos um objeto DataAdapter para executar um comando SQL,
// o qual retorna todos os dados da tabela Clientes.
OleDbDataAdapter MeuComando = new OleDbDataAdapter(SELECT NmeroDoPedido, +
DataDoPedido,CidadeDeDestino,PasDeDestino FROM Pedidos, MinhaConexo);
// Criamos e preenchemos um objeto DataSet.
// Observe que no temos mais o objeto Recordset,
// como era de praxe com o ASP 3.0.
DataSet ds = new DataSet();
// Utilizo o mtodo Fill do objeto DataAdapter, para preencher
// o objeto DataSet, com os dados retornados pelo comando SQL.
MeuComando.Fill(ds);
// Conectamos um controle DataGrid com o DataSet criado anteriormente.
// MinhaGrade o id (nome) de um controle do tipo
// DataGrid que est na seo de apresentao da pgina.
DataView source = new DataView(ds.Tables[0]);
// Crio uma varivel string chamada aux.
// Na varivel aux vamos concatenando os valores
// Selecionados nas listas CampoClassificar1 e
// CampoClassificar2, alm das opes ASC ou DESC,
// dependendo da escolha do usurio.
string aux = CampoClassificar1.SelectedItem.Value;
// Se o usurio selecionou Crescente, concateno ASC,
// caso contrrio, concateno DESC.
399
CAPTULO 10: ACESSANDO BANCOS DE DADOS COM ASP.NET PARTE 1
www.juliobattisti.com.br
if (Crescente.Checked)
{
aux = aux + ASC,;
}
else
{
aux = aux + DESC,;
}
aux = aux + CampoClassificar2.SelectedItem.Value;
if (Crescente.Checked)
{
aux = aux + ASC;
}
else
{
aux = aux + DESC;
}
// Ordeno passando aux para a propriedade Sort.
source.Sort = aux;
MinhaGrade.DataSource = source ;
MinhaGrade.DataBind();
}
</script>
<body>
<% Exibe as informaes do DataGrid no corpo da pgina. %>
<h3><font face=Verdana>Funcionrios da empresa North Wind!!!</font></h3>
400 www.juliobattisti.com.br
ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB
<form runat=server>
<B>Clique para Classificar ></B></td>
<input type=submit value=Classificar runat=server>
<BR>
<BR>
<table>
<tr>
<td>
<B><font face=Verdana>Classificar primeiro por:</font></B>
</td>
<td>
<B><font face=Verdana>&nbsp;&nbsp;Em seguida por:</font></B>
</td>
<td>
<B><font face=Verdana>&nbsp;Em qual ordem?</font></B>
</td>
</tr>
<tr>
<td>
<asp:ListBox id=CampoClassificar1"
Rows=1"
Width=200px
runat=server>
<asp:ListItem>CidadeDeDestino</asp:ListItem>
<asp:ListItem>DataDoPedido</asp:ListItem>
<asp:ListItem selected=True>NmeroDoPedido</asp:ListItem>
<asp:ListItem>PasDeDestino</asp:ListItem>
</asp:ListBox>
401
CAPTULO 10: ACESSANDO BANCOS DE DADOS COM ASP.NET PARTE 1
www.juliobattisti.com.br
</td>
<td>
&nbsp;&nbsp;
<asp:ListBox id=CampoClassificar2"
Rows=1"
Width=200px
runat=server>
<asp:ListItem>CidadeDeDestino</asp:ListItem>
<asp:ListItem selected=True>DataDoPedido</asp:ListItem>
<asp:ListItem>NmeroDoPedido</asp:ListItem>
<asp:ListItem>PasDeDestino</asp:ListItem>
</asp:ListBox>
</td>
<td>
<asp:RadioButton
id=Crescente
Text=Crescente
Checked=True
GroupName=Ordem
runat=server
/>
&nbsp;&nbsp;
<asp:RadioButton
id=Decrescente
Text=Decrescente
GroupName=Ordem
runat=server
/>
</td>
</tr>
402 www.juliobattisti.com.br
ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB
</table>
<asp:DataGrid
id=MinhaGrade
runat=server
Width=700"
BackColor=#ccccff
BorderColor=black
ShowFooter=false
CellPadding=3
CellSpacing=0"
Font-Name=Verdana
Font-Size=8pt
HeaderStyle-BackColor=#aaaadd
MaintainState=false
/>
<BR>
</form>
</body>
</html>
Digite o cdigo da Listagem 10.6 e salve o mesmo em um arquivo chamado chap10ex6.aspx, na pasta chap10, dentro
da pasta wwwroot, conforme descrito no item: Check List para acompanhar os exemplos deste livro, no Captulo 6.
Para acessar esta pgina utilize o seguinte endereo: http://localhost/chap10/chap10ex6.aspx
Voc ir obter a pgina indicada na Figura 10.17.
Observe que a listagem est classificada primeiro em ordem crescente do NmeroDoPedido, em seguida em ordem
Crescente da DataDoPedido. Vamos testar o nosso exemplo. Na primeira lista selecione PasDeDestino e na segunda lista
selecione CidadeDeDestino. Para ordem de classificao clique na opo Decrescente. D um clique no boto Classificar.
Voc obter uma listagem classificada pelo nome de Pedidos. Parte do resultado est indicado na Figura 10.18.
403
CAPTULO 10: ACESSANDO BANCOS DE DADOS COM ASP.NET PARTE 1
www.juliobattisti.com.br
Figura 10.17: Relao de pedidos opo para classificar por dois campos diferentes.
Comentrios sobre o cdigo do exemplo Chap10Ex6.aspx.
Utilizamos uma tabela para fazer o alinhamento dos controles, no incio da pgina. Para fazer um controle
mais refinado do alinhamento, utilizamos o caracter &nbsp non break space. Este um caracter especial do
HTML utilizado para espao em branco.
Figura 10.18: Relao de Pedidos classificada por Pas e dentro do pas por Cidade.
404 www.juliobattisti.com.br
ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB
No formulrio, na seo de apresentao da pgina, adicionamos dois controles do tipo ListBox, onde o
usurio pode selecionar por quais campos deseja classificar a listagem. Tambm acrescentamos um grupo
chamado Ordem, com dois controles do tipo RadioButton, onde o usurio pode selecionar Crescente ou
Decrescente. Com base nos valores selecionados nestes controles, definimos o contedo de uma varivel
string aux. Uma vez definido o contedo da string aux, utilizamos esta para definir o valor da propriedade
Sort do objeto source, o qual um objeto do tipo DataView:
string aux = CampoClassificar1.SelectedItem.Value;
// Se o usurio selecionou Crescente, concateno ASC,
// caso contrrio, concateno DESC.
if (Crescente.Checked)
{
aux = aux + ASC,;
}
else
{
aux = aux + DESC,;
}
aux = aux + CampoClassificar2.SelectedItem.Value;
if (Crescente.Checked)
{
aux = aux + ASC;
}
else
{
aux = aux + DESC;
}
// Ordeno passando aux para a propriedade Sort.
source.Sort = aux;
405
CAPTULO 10: ACESSANDO BANCOS DE DADOS COM ASP.NET PARTE 1
www.juliobattisti.com.br
Observe que, no segundo if, no acrescentamos a vrgula aps ASC ou DESC. No primeiro if acrescentamos, pois,
quando temos dois ou mais campos para definir a propriedade Sort, precisamos separar estes campos por vrgula. Se
o usurio selecionar PasDeDestino na primeira lista, CidadeDeDestino na segunda lista e Crescente, a varivel aux
ter o seguinte valor:
aux = PasDeDestino ASC, CidadeDeDestino ASC
Este valor passado para a propriedade Sort para que a classificao seja feita de acordo com os critrios selecionados
pelo usurio.
Os demais elementos do exemplo Chap10ex6.aspx j foram vistos e explicados em exemplos anteriores. Para
maiores detalhes sobre os mesmos consulte os exemplos destes e dos demais captulos.
Novamente utilizamos o evento Load da pgina Page_Load, para executar a conexo com o banco de dados,
retornar os dados, definir a string aux e ordenar os dados de acordo com os critrios estabelecidos pelo usurio.
Exerccio: Vou propor um exerccio para o amigo leitor. Caso voc tenha alguma dificuldade para resolv-lo, s
entrar em contato atravs do e-mail: batisti@hotmail.com ou batisti@juliobattisti.com.br.
Na pgina Chap10ex6.aspx podemos definir somente um critrio de classificao para os campos selecionados nas
duas listas, ou seja, somente Crescente ou somente Decrescente. O exerccio que fica para o leitor tornar o nosso
exemplo um pouco mais flexvel, de tal maneira que possamos escolher uma ordem de classificao independente
para cada campo. Explico um pouco melhor: Selecionar classificao Crescente para o campo PasDeDestino e,
dentro de um mesmo pas, classificao Decrescente por CidadeDeDestino.
Fica o desafio. Em caso de dvida s entrar em contato.
Um Pouco Mais Sobre o Controle DataGrid
O controle DataGrid, sem sombra de dvidas, assunto para um captulo inteiro. Como no dispomos de tanto espao,
caso contrrio teramos um livro de mais de 2000 pginas, vamos apresentar as principais caractersticas deste poderoso
controle, atravs de alguns exemplos prticos. Neste tpico veremos como algumas propriedades e mtodos do controle
DataGrid so capazes de efetuar verdadeiras maravilhas. Nos Captulos 11 e 12 estudaremos mais sobre o controle
DataGrid, principalmente sobre como fazer alteraes e excluses nos dados exibidos pelo controle.
Primeira Maravilha do DataGrid: Paginao
Quando obtemos um nmero grande de registros interessante dividir a exibio do mesmo em pginas, onde exibimos
um determinado nmero de registros por vez. Isso o que chamamos de paginao. Por exemplo, podemos fazer com
que 1000 registros sejam divididos em pginas onde so exibidos 20 registros por vez.
Fazer paginao com ASP 3.0 no era uma tarefa das mais fceis. Um boa quantia de cdigo era necessria e tudo
tinha que ser implementado manualmente. Com o controle DataGrid, definir paginao est resumido a configurar
duas propriedades:
406 www.juliobattisti.com.br
ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB
AllowPaging: Esta propriedade do tipo Boleana. Se for True, a paginao habilitada; se for False, a paginao
desabilitada. Por padro esta propriedade False. Ao tornarmos AllowPaging True, na ltima linha do DataGrid
so exibidos os smbolos < para voltar pgina anterior e > para ir prxima pgina. Podemos alterar
estes valores utilizando as propriedades PagerStyle-NextPageText para alterar o texto do link que vai para a
prxima pgina e PagerStyle-PrevPageText, para alterar o texto do link que volta para a pgina anterior.
Quando estamos na primeira pgina, o link para a pgina anterior automaticamente desabilitado, pois no existe
pgina anterior primeira. Quando estamos na ltima pgina, o link para a prxima pgina automaticamente
desabilitado, pois no existe pgina aps a ltima.
PageSize: O valor desta propriedade define o nmero de registros que sero exibidos, por vez. Se esta propriedade
no for definida, sero exibidos 10 registros por pgina.
Para definir que sejam exibidos 20 registros por pgina, sendo Prxima pgina >>, o texto do link para a prxima
pgina e << Pgina anterior, o texto para o link para a pgina anterior, definimos as seguintes propriedades/valores
do controle DataGrid:
AllowPaging=True
PageSize=20
PagerStyle-NextPageText=Prxima pgina >>
PagerStyle-PrevPageText=<< Pgina anterior
Inserindo a definio para essas propriedades, a tag que define o controle DataGrid ficaria da seguinte maneira:
<ASP:DataGrid
id=MeuDataGrid
runat=server
Width=600"
BackColor=#bbccff
AllowPaging=True
PageSize=20
PagerStyle-NextPageText=Prxima pgina >>
PagerStyle-PrevPageText=<< Pgina anterior
BorderColor=black
ShowFooter=false
CellPadding=3
CellSpacing=0"
Font-Name=Verdana
Font-Size=8pt
HeaderStyle-BackColor=#aaaadd
MaintainState=false
/>
407
CAPTULO 10: ACESSANDO BANCOS DE DADOS COM ASP.NET PARTE 1
www.juliobattisti.com.br
Segunda Maravilha do DataGrid: Mais do que
um Conjunto de Dados na Mesma Pgina
Vamos ver um exemplo prtico, onde exibiremos dados de duas tabelas, do banco de
dados NorthWind, na mesma pgina ASP.NET. Para isso faremos uso de dois controles
do tipo DataGrid.
O exemplo Proposto: Exibir, na mesma pgina, informaes da tabela Funcionrios e da
tabela Transportadores.
Na Listagem 10.7 temos o cdigo para o exemplo proposto.
Listagem 10.7 Exibindo dados de mltiplas tabelas em uma pgina ASP.NET.
<%@ Import Namespace=System.Data %>
<%@ Import Namespace=System.Data.OleDb %>
<html>
<script language=C# runat=server>
protected void Page_Load(Object Src, EventArgs E )
{
// Crio uma conexo com o banco de dados do Microsoft Access.
// C:\Meus documentos\NorthWind.mdb.
String DefineConexo= PROVIDER=MICROSOFT.JET.OLEDB.4.0; +
DATA SOURCE=c:\\meus documentos\\NorthWind.mdb;
OleDbConnection MinhaConexo = new OleDbConnection(DefineConexo);
// Para podermos acessar mltiplas tabelas vamos criar
// um objeto Command, conforme indicado a seguir:
OleDbCommand MeuComando = new OleDbCommand();
// defino algumas propriedades do objeto Command.
MeuComando.Connection = MinhaConexo;
MeuComando.CommandType = CommandType.Text;
IMPORTANTE: Para que
a paginao seja feita,
alm de definir a
propriedade AllowPaging
como True, temos que
criar cdigo para trocar
de pgina. O mtodo que
faz a troca de pgina
definido na propriedade
OnPageIndexChanged do
DataGrid. Aprenderemos
a implementar a
paginao no Captulo 11,
onde veremos mais
detalhes sobre o controle
DataGrid.
408 www.juliobattisti.com.br
ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB
// Utilizamos um objeto DataAdapter para executar dois comandos SQL.
// Um comando para retornar dados da tabela Funcionrios.
// Um comando para retornar dados da tabela Transportadoras.
OleDbDataAdapter MeuDataAdapter = new OleDbDataAdapter();
// Definimos o comando a ser utilizado pelo objeto DataAdapter.
// Para isso definimos a sua propriedade SelectCommand.
MeuDataAdapter.SelectCommand = MeuComando;
// Criamos e preenchemos um objeto DataSet.
// Vamos preencher o DataSet com dados das tabelas
// Funcionrios e Transportadores.
// Para isso precisamos executar dois comandos SQL.
// ************************************************
// Na prtica vamos chamar o mtodo Fill do DataAdapter
// duas vezes.
// Antes de cada chamada alteramos a propriedade
// CommandText do objeto Command.
DataSet ds = new DataSet();
MeuComando.CommandText=Select CdigoDoFuncionrio,Nome,Sobrenome,Cargo
From Funcionrios;
MeuDataAdapter.Fill(ds,Funcionrios);
// Altero a propriedade CommandText para retornar dados
// da tabela Transportadores.
// Chamo novamente o mtodo Fill.
MeuComando.CommandText = Select * From Transportadoras;
MeuDataAdapter.Fill(ds,Transportadoras);
// Conectamos um controle DataGrid com
409
CAPTULO 10: ACESSANDO BANCOS DE DADOS COM ASP.NET PARTE 1
www.juliobattisti.com.br
// cada tabela do DataSet criado anteriormente.
// ******************************************************
// GradeFuncionrios o id (nome) de um controle do tipo
// DataGrid que est na seo de apresentao da pgina.
// Este controle exibir dados dos Funcionrios.
// ******************************************************
// GradeTransportadoras o id (nome) de um controle do tipo
// DataGrid que est na seo de apresentao da pgina.
// Este controle exibir dados das Transportadoras.
DataView Funcionrios = new DataView(ds.Tables[0]);
GradeFuncionrios.DataSource = Funcionrios ;
GradeFuncionrios.DataBind();
DataView Transportadoras = new DataView(ds.Tables[1]);
GradeTransportadoras.DataSource = Transportadoras ;
GradeTransportadoras.DataBind();
}
</script>
<body>
<h3><font face=Verdana>Funcionrios da empresa North Wind!!!</font></h3>
<HR>
<ASP:DataGrid
id=GradeFuncionrios
runat=server
Width=450"
BackColor=#bbccff
BorderColor=blue
ShowFooter=false
CellPadding=3
CellSpacing=0"
Font-Name=Verdana
Font-Size=8pt
410 www.juliobattisti.com.br
ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB
HeaderStyle-BackColor=#aaaadd
HeaderStyle-Font-Bold=True
MaintainState=false
/>
<BR>
<HR>
<h3><font face=Verdana>Transportadoras da empresa North Wind!!!</font></h3>
<ASP:DataGrid
id=GradeTransportadoras
runat=server
Width=400"
BackColor=#bbddff
BorderColor=blue
ShowFooter=false
CellPadding=3
CellSpacing=0"
Font-Name=Verdana
Font-Size=8pt
HeaderStyle-BackColor=#aaaadd
HeaderStyle-Font-Bold=True
MaintainState=false
/>
<HR>
</body>
</html>
Digite o cdigo da Listagem 10.7 e salve o mesmo em um arquivo chamado chap10ex7.aspx, na pasta chap10, dentro
da pasta wwwroot, conforme descrito no item: Check List para acompanhar os exemplos deste livro, no Captulo 6.
Para acessar esta pgina utilize o seguinte endereo: http://localhost/chap10/chap10ex7.aspx
Voc ir obter a pgina indicada na Figura 10.20.
411
CAPTULO 10: ACESSANDO BANCOS DE DADOS COM ASP.NET PARTE 1
www.juliobattisti.com.br
Figura 10.19: Exibindo dados de mltiplas tabelas em uma pgina ASP.NET.
Comentrios sobre o cdigo do exemplo Chap10Ex7.aspx.
Vamos descrever os passos utilizados para acessar e exibir dados das tabelas Funcionrios e Pedidos. Alguns
passos j foram explicados em exemplos anteriores, mas iremos repetir a explicao, para fazermos uma
reviso do contedo deste captulo:
1. Utilizamos o evento Pge_Load para colocar o cdigo necessrio ao nosso exemplo.
2. Iniciamos estabelecendo uma conexo com o banco de dados NorthWind.mdb:
String DefineConexo= PROVIDER=MICROSOFT.JET.OLEDB.4.0; +
DATA SOURCE=c:\\meus documentos\\NorthWind.mdb;
OleDbConnection MinhaConexo = new OleDbConnection(DefineConexo);
3. A partir deste ponto temos algumas mudanas em relao aos exemplos anteriores. Primeiro vamos criar um
objeto OleDbCommand e definir as propriedades Connecion e CommandType do objeto OleDbCommand:
OleDbCommand MeuComando = new OleDbCommand();
// defino algumas propriedades do objeto Command.
MeuComando.Connection = MinhaConexo;
MeuComando.CommandType = CommandType.Text;
412 www.juliobattisti.com.br
ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB
4. Agora criamos um objeto DataAdapter e definimos a sua propriedade SelectCommand. Ao definirmos esta
propriedade informamos qual o objeto OleDbCommand que estar associado ao DataAdapter:
OleDbDataAdapter MeuDataAdapter = new OleDbDataAdapter();
MeuDataAdapter.SelectCommand = MeuComando;
5. Declaramos um objeto ds do tipo DataSet. O objeto DataSet ser o Conteiner para as tabelas Funcionrios e
Transportadores. Recapitulando o que estudamos anteriormente, o objeto DataSet pode conter uma ou mais
tabelas, as quais esto contidas na coleo Tables do objeto.
DataSet ds = new DataSet();
6. Chegamos ao ponto principal do nosso exemplo. Utilizamos a seguinte tcnica: definimos a propriedade
CommandText do objeto MeuComando. Esta propriedade contm a string SQL que acessa dados de uma
determinada tabela:
MeuComando.CommandText=Select CdigoDoFuncionrio,Nome,Sobrenome,Cargo
From Funcionrios;
Em seguida chamamos o mtodo Fill do objeto DataAdapter. Ao chamarmos este mtodo, o comando definido na
propriedade CommandText executado e os dados retornados so passados para o DataSet definido no primeiro
parmetro. O segundo parmetro o nome do conjunto de dados no DataSet. No nosso exemplo utilizamos o
mesmo nome da tabela, no banco de dados NorthWind, porm isso no obrigatrio:
MeuDataAdapter.Fill(ds,Funcionrios);
Repetimos os mesmos passos para retornar dados da tabela Transportadoras e coloc-los no DataSet ds:
MeuComando.CommandText = Select * From Transportadoras;
MeuDataAdapter.Fill(ds,Transportadoras);
Aps a execuo destes comandos, a coleo Tables, do DataSet ds, contm duas tabelas com dados retornados a
partir do Banco de dados NorthWind.mdb.
7. O prximo passo exibir os dados do objeto DataSet na pgina ASP.NET. Isto feito utilizando um objeto do tipo
DataView para cada tabela a ser exibida. Ao criarmos o objeto DataView, j passamos como parmetro a tabela
associada ao objeto. Em seguida definimos a propriedade DataSource do controle DataGrid como sendo igual ao
objeto DataView recm-criado. O passo final chamar o mtodo DataBind do controle DataGrid:
DataView Funcionrios = new DataView(ds.Tables[0]);
GradeFuncionrios.DataSource = Funcionrios ;
GradeFuncionrios.DataBind();
DataView Transportadoras = new DataView(ds.Tables[1]);
GradeTransportadoras.DataSource = Transportadoras ;
GradeTransportadoras.DataBind();
Para cada tabela do DataSet criamos um objeto DataView. Para o DataView Funcionrios, passamos como parmetro:
ds.Tables[0], ou seja, a primeira tabela, da coleo de tabelas do DataSet ds. Para o DataView Transportadoras, passamos
como parmetro ds.Tables[1], ou seja, a segunda tabela, da coleo de tabelas do DataSet ds. Depois s ligar cada
DataView com o respectivo DataGrid.
413
CAPTULO 10: ACESSANDO BANCOS DE DADOS COM ASP.NET PARTE 1
www.juliobattisti.com.br
8. Na seo de apresentao, utilizamos algumas propriedades do DataGrid para definir a sua aparncia. Por exemplo:
HeaderStyle-BackColor=#aaaadd: Define a cor de segundo plano da primeira linha do DataGrid, a linha
que contm os ttulos das colunas.
HeaderStyle-Font-Bold=True: Define que o texto da primeira linha deve ser exibido com fonte em negrito.
Este exemplo demonstra, mais uma vez, o poder e flexibilidade dos novos objetos para acesso a dados oferecidos pelo
ADO.NET e tambm demonstra o poder dos Web Server Controls, mais especificamente do controle DataGrid.
Concluso
Neste captulo aprendemos a conectar pginas ASP.NET com bancos de dados. Utilizamos classes, basicamente, dos
seguintes namespaces:
System.Data
System.Data.OleDb
System.Data.SqlClient
Estudamos, em detalhes, diversas classes destes namespaces:
SqlConnection/OleDbConnection
SqlCommand/OleDbCommand
SqlDataAdapter/OleDbDataAdapter
DataSet
DataView
Tambm estudamos algumas caractersticas do poderoso controle: DataGrid.
Nos prximos captulos estudaremos mais sobre estas classes e sobre controles que podem ser conectados com dados.
414 www.juliobattisti.com.br
ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB
C A P T U L O
11
Acessando Bancos de Dados
com ASP.NET Parte 2
Introduo
No Captulo 10 aprendemos a conectar pginas ASP.NET com bancos de dados.
Trabalhamos com classes dos namespaces System.Data, System.Data.SqlClient
e System.Data.OleDb. Para exibir os dados em um pgina ASP.NET utilizamos,
basicamente, o controle DataGrid.
Existem diversos Web Server Controls que podem exibir dados a partir de um
objeto DataView ou DataReader (ser visto neste captulo). Iniciaremos este
captulo estudando os seguintes Web Server Controls:
CheckBoxList
DropDownList
RadioButtonList
Estes controles tambm so conhecidos como: Data-bound list controls. Todos
possuem uma propriedade DataSource, que define a fonte de dados para o controle.
Em seguida estudaremos um pouco mais sobre o controle DataGrid. No Captulo
10 aprendemos a utilizar o controle DataGrid para efetuar as seguintes aes:
Exibir dados em uma pgina.
Ordenar dados.
Fazer paginao.
Neste captulo aprenderemos a utilizar o controle DataGrid para efetuar as seguintes
operaes:
Filtrar dados.
Criar as colunas do DataGrid manualmente.
Veremos que com poucas linhas de cdigo somos capazes de realizar operaes
que, com o ASP 3.0, demandam uma boa quantidade de codificao. Uma das
grandes vantagens do ASP.NET a disponibilidade de um conjunto de controles
mais poderoso e flexvel. Para que possamos usufruir destas vantagens importante
que saibamos utilizar estes controles. Com o estudo feito neste captulo, mais o
que foi visto nos Captulos 7, 8, 9 e 10, o leitor ter um amplo entendimento dos
novos controles do ASP.NET. Porm o assunto bastante extenso; so centenas
de mtodos e propriedades. A melhor fonte de informaes para voc aprofundar
seus estudos a documentao do Framework .NET.
Antes de iniciarmos o estudo dos Data-bound controls, iremos apresentar o
conceito de Data Binding, e veremos alguns conceitos que se aplicam a todo
415
CAPTULO 11: ACESSANDO BANCOS DE DADOS COM ASP.NET PARTE 2
www.juliobattisti.com.br
controle que pode ser associado a uma fonte de dados. Os conceitos vistos nesta parte inicial so a base para que
possamos estudar os Data-bound controls.
Um tal de Data Binding
Data Binding , sem dvidas, uma das caractersticas de ASP.NET que mais poupam
tempo do programador. Tarefas que exigiam dezenas de linhas de cdigo com as verses
anteriores de ASP, agora podem ser feitas configurando-se umas poucas propriedades
dos Data-bound controls.
Com o ASP.NET, o processamento e as funes de Data Binding so executados no
Servidor. O resultado que retorna HTML compatvel com qualquer navegador, o que
elimina a limitao das tcnicas de Data Binding no lado cliente.
Com a manuteno de estado automtica e as operaes de PostBack e round-trip
(descritas anteriormente), o funcionamento da pgina transparente para o usurio, ou
seja, do ponto de vista de quem est utilizando a pgina pouca importncia tem onde
est ocorrendo o processamento; desde que o desempenho seja satisfatrio e o acesso
possa ser feito de qualquer navegador disponvel. Para que tudo isso seja possvel, as
novas caractersticas do Framework .NET, como PostBack e round-trip de pginas so
fundamentais.
Antes de explicarmos em detalhe a sintaxe para Data Binding, vamos ver um exemplo
prtico onde fazemos uma comparao entre a maneira de construir um controle do tipo
Lista de Opes com ASP 3.0, onde as opes so criadas, automaticamente, a partir de
um banco de dados; e a maneira de construir a mesma lista, utilizando Data Binding
com ASP.NET.
Maneira Antiga: Criando uma Lista Dinmica com ASP 3.0
Neste exemplo construiremos uma lista com os nomes de todos os pases para os quais
existem Pedidos. A lista ser construda a partir da tabela Pedidos do banco de dados
C:\Meus documentos\NorthWind.mdb.
Na Listagem 11.1 temos o cdigo para o exemplo proposto.
Listagem 11.1 Uma lista dinmica com ASP 3.0 Chap11ex1.asp.
<%@ Language=VBScript %>
<HTML>
<HEAD>
<TITLE>Lista dinmica de Pases.</TITLE>
IMPORTANTE: Os
controles que utilizaremos
neste captulo fazem
parte dos chamados Web
Server Controls. Na
prtica isso significa que
estes controles so
processados no servidor e
no no Cliente. Esta
uma grande vantagem,
pois as operaes de Data
Binding iro funcionar
corretamente,
independente do
navegador que estiver
sendo utilizado. Antes do
Framework .NET,
utilizvamos algumas
tcnicas de Data Binding
no cliente. O problema
desta abordagem que
estas tcnicas so
dependentes do
navegador que est
sendo utilizado. Por
exemplo, algumas
tcnicas de Data Binding
utilizando DHTML que
funcionam no Internet
Explorer podem no
funcionar (e
provavelmente no
funcionaro) no Netscape
e vice-versa.
416 www.juliobattisti.com.br
ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB
</HEAD>
<BODY>
<%
O Primeiro passo criar a conexo com o Banco de dados.
Para isto crio um objeto do tipo Connection.
Cria um Objeto do Tipo ADODB.Connection
Set conn=Server.CreateObject(ADODB.Connection)
Agora abro uma conexo com o arquivo nwind.mdb
utilizando OLE DB.
O prximo comando deve estar todo em uma nica linha.
conn.ConnectionString = PROVIDER=MICROSOFT.JET.OLEDB.4.0;DATA SOURCE=c:\Meus
documentos\NorthWind.mdb
conn.Open
Agora criamos um Objeto RecordSet.
Este Objeto ir acessar o campo PasDeDestino
da tabela Pedidos.
Set Paises = Server.CreateObject(ADODB.Recordset)
O prximo comando deve estar todo em uma nica linha.
Paises.Open Select PasDeDestino from Pedidos Group By PasDeDestino Order By
PasDeDestino, conn, 3, 3
Neste ponto tenho o objeto Paises ligado com a tabela
Pedidos do banco de dados NorthWind.mdb
%>
<P><B>Paises para o quais existem pedidos!!!</B></P>
417
CAPTULO 11: ACESSANDO BANCOS DE DADOS COM ASP.NET PARTE 2
www.juliobattisti.com.br
<FORM action=Chap11ex1.asp method=post>
<SELECT id=listapaises name=listpaises>
<%
Agora construo a lista de opes a partir dos
dados obtidos da tabela Pedidos.
Para cada produto obtido, crio uma nova opo
na lista.
Do While Not Paises.EOF
O prximo comando deve estar todo em uma nica linha.
Response.Write <OPTION value= & Chr(34) & Paises.Fields(PasDeDestino) &
Chr(34) & > & Paises.Fields(PasDeDestino)& </OPTION>
Paises.MoveNext
Loop
%>
</SELECT>
<BR>
<BR>
<HR>
<INPUT type=submit value=Paises id=Localizar name=Localizar>
</FORM>
</BODY>
</HTML>
Digite o cdigo da Listagem 11.1 e salve o mesmo em um arquivo chamado chap11ex1.asp, na pasta chap11, dentro
da pasta wwwroot, conforme descrito no item: Check List para acompanhar os exemplos deste livro, no Captulo 6.
importante que a extenso seja .asp e no .aspx, pois trata-se de uma pgina com cdigo ASP 3.0 e no ASP.NET.
Para acessar esta pgina utilize o seguinte endereo: http://localhost/chap10/chap11ex1.asp
418 www.juliobattisti.com.br
ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB
Ao carregar a pgina voc obtm o resultado indicado na Figura 11.1.
Figura 11.1: Uma lista dinmica com ASP 3.0.
Alm da conexo, criamos um lao Do While para percorrer todos os registros do RecordSet e construir uma opo da
lista para cada registro. Com ASP 3.0 no temos muitas alternativas. Agora vamos demonstrar como a utilizao de
Data Binding torna as coisas bem mais fceis.
A Evoluo: Data Binding com ASP.NET.
Neste exemplo construiremos uma lista com os nomes de todos os pases para os quais existem Pedidos. A lista ser
construda utilizando um Web Server Control do tipo DropDownList. Para ligar a fonte de dados com o controle,
simplesmente faremos uso do mtodo DataBind do controle.
Listagem 11.2 Uma lista dinmica com ASP.NET Chap11ex2.aspx.
Na Listagem 11.2 temos o cdigo para o exemplo proposto.
<%@ Import Namespace=System.Data %>
<%@ Import Namespace=System.Data.OleDb %>
<html>
<script language=C# runat=server>
419
CAPTULO 11: ACESSANDO BANCOS DE DADOS COM ASP.NET PARTE 2
www.juliobattisti.com.br
protected void Page_Load(Object Src, EventArgs E )
{
// Crio uma conexo com o banco de dados do Microsoft Access.
// C:\Meus documentos\NorthWind.mdb.
String DefineConexo= PROVIDER=MICROSOFT.JET.OLEDB.4.0; +
DATA SOURCE=c:\\meus documentos\\NorthWind.mdb;
OleDbConnection MinhaConexo = new OleDbConnection(DefineConexo);
// Utilizamos um objeto DataAdapter para executar um comando SQL,
// o qual retorna todos os dados da tabela Clientes.
OleDbDataAdapter MeuComando = new OleDbDataAdapter(SELECT PasDeDestino +
FROM Pedidos Group By PasDeDestino Order By PasDeDestino, MinhaConexo);
// Criamos e preenchemos um objeto DataSet.
// Observe que no temos mais o objeto Recordset,
// como era de praxe com o ASP 3.0.
DataSet ds = new DataSet();
// Utilizo o mtodo Fill do objeto DataAdapter, para preencher
// o objeto DataSet, com os dados retornados pelo comando SQL.
MeuComando.Fill(ds);
// Conectamos um controle DropDownList com o DataSet criado anteriormente.
// MinhaLista o id (nome) de um controle do tipo
// DropDownList que est na seo de apresentao da pgina.
DataView source = new DataView(ds.Tables[0]);
// Ligo o objeto DataView a um controle do tipo
420 www.juliobattisti.com.br
ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB
// DropDownList MinhaLista.
MinhaLista.DataSource = source ;
MinhaLista.DataBind();
}
</script>
<body>
<h3><font face=Verdana>Lista Dinmica com ASP.NET!!!</font></h3>
<form runat=server>
<asp:DropDownList
id=MinhaLista
runat=server
DataTextField=PasDeDestino
>
</asp:DropDownList>
<BR>
<BR>
</form>
</body>
</html>
Digite o cdigo da Listagem 11.2 e salve o mesmo em um arquivo chamado chap11ex2.aspx, na pasta chap11, dentro
da pasta wwwroot, conforme descrito no item: Check List para acompanhar os exemplos deste livro, no Captulo 6.
Para acessar esta pgina utilize o seguinte endereo: http://localhost/chap10/chap11ex2.aspx
Ao carregar a pgina voc obtm o resultado indicado na Figura 11.2.
421
CAPTULO 11: ACESSANDO BANCOS DE DADOS COM ASP.NET PARTE 2
www.juliobattisti.com.br
Figura 11.2: Uma lista dinmica com ASP.NET.
Observe a simplicidade para criar a lista. Na seo de cdigo definimos a propriedade DataSource do controle
MinhaLista, que um controle do tipo DropDownList. Depois chamamos o mtodo DataBind deste controle:
MinhaLista.DataSource = source ;
MinhaLista.DataBind();
Na seo de apresentao basta criar o controle MinhaLista e definir a sua propriedade DataTextField como sendo
igual ao nome do campo a ser exibido na lista:
<asp:DropDownList
id=MinhaLista
runat=server
DataTextField=PasDeDestino
>
</asp:DropDownList>
Rpido, simples, intuitivo e sem a necessidade de criar um lao para percorrer todos os registros do DataView. Este
pequeno exemplo ilustra o quanto pode ser melhorada a produtividade do programador com a utilizao dos controles
avanados do ASP.NET.
Agora que j vimos um exemplo em ao, vamos estudar um pouco mais detalhadamente os conceitos de DataBinding,
para depois estudarmos os demais controles Data-bound controls.
422 www.juliobattisti.com.br
ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB
Data Binding de Valores Simples
A idia bsica do Data Binding fazer com que, ao ser processada a pgina ASP.NET, um ou mais valores sejam
retornados em posies especficas. Pode ser um conjunto de valores retornados para um controle como o DropDownList
que utilizamos no exemplo da Listagem 11.2, ou pode ser um nico valor. Por exemplo, podemos fazer com que o
rtulo de um controle seja baseado no valor contido em outro controle. Toda vez que a pgina for carregada e o mtodo
DataBind for chamado, o valor do rtulo ser atualizado.
O exemplo do DropDownList, da Listagem 11.2, onde so exibidos diversos valores, conhecido como repeated-
value-binding. Quando a ligao feita com um nico valor, temos o exemplo de um single-value-binding. Vamos
analisar a sintaxe e alguns exemplos para single-value-binding.
Sintaxe Para o Data Binding
Podemos fazer o Data Binding com qualquer propriedade de um controle, utilizando a seguinte sintaxe:
<%# fonte de dados %>
Onde a fonte de dados pode ser de trs tipos diferentes:
O nome de uma propriedade: <%# nome de propriedade %>
Uma chamada de mtodo: <%# mtodo(param1,param2,..., paramn) %>
Uma expresso: <%# expresso %>
Qualquer uma das situaes acima descritas deve retornar um nico valor, o qual ligado a uma propriedade do controle.
Vamos a um exemplo simples. Criaremos uma pgina ASP.NET com dois controles. Um do tipo TextBox e outro do
tipo Label. O Texto contido no controle Label ser definido pelo valor digitado no controle TextBox. O valor padro
inicial do controle TextBox : Valor Inicial. Vamos ao exemplo, depois s explicaes.
Na Listagem 11.3 temos o cdigo para o exemplo proposto.
Listagem 11.3 Um exemplo de single-value-binding.
<html>
<script language=C# runat=server>
void Page_Load(Object Src, EventArgs E )
{
Page.DataBind();
}
</script>
<body>
<form runat=server>
423
CAPTULO 11: ACESSANDO BANCOS DE DADOS COM ASP.NET PARTE 2
www.juliobattisti.com.br
<h3>Exemplo de single-value-binding!!! </H3>
<HR>
<asp:TextBox
id=CaixaTexto
Text=Valor Inicial
runat=server
/>
<BR>
<HR>
<B>Rtulo: </B>
<asp:Label
id=RotuloTexto
Text=<%# CaixaTexto.Text %>
runat=server
/>
</form>
</body>
</html>
Digite o cdigo da Listagem 11.3 e salve o mesmo em um arquivo chamado chap11ex3.aspx, na pasta chap11, dentro
da pasta wwwroot, conforme descrito no item: Check List para acompanhar os exemplos deste livro, no Captulo 6.
Para acessar esta pgina utilize o seguinte endereo: http://localhost/chap10/chap11ex3.aspx
Observe que o rtulo vem preenchido com o valor inicial da caixa de texto: Valor Inicial. Clique na caixa de texto e
digite: Novo Valor e pressione Enter. Observe que o rtulo alterado para refletir o valor digitado na caixa de texto,
conforme indicado na Figura 11.3.
A ligao do valor do rtulo, com a propriedade Text, da caixa de texto feita com o seguinte cdigo:
<asp:Label
id=RotuloTexto
Text=<%# CaixaTexto.Text %>
runat=server
/>
424 www.juliobattisti.com.br
ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB
Figura 11.3: Um exemplo de single-value-binding.
Mais especificamente com a definio da propriedade Text, onde colocamos uma expresso de ligao que aponta
para a propriedade Text do controle CaixaTexto:
Text=<%# CaixaTexto.Text %>
Podemos fazer esta ligao para qualquer propriedade, desde que o valor retornado seja compatvel com o tipo esperado
pela propriedade.
Tambm de fundamental importncia observar a chamada do mtodo DataBind do objeto Page, o qual feito no
evento Load da Pgina:
void Page_Load(Object Src, EventArgs E )
{
Page.DataBind();
}
Sem esta chamada, a ligao no seria feita. O mtodo DataBind, da classe Page, faz a ligao para a pgina ASP.NET
e para todos os controles contidos na pgina. No nosso exemplo, o efeito prtico o mesmo que se tivssemos
chamado o mtodo DataBind, do controle RotuloTexto RotuloTexto.DataBind( ).
Ao invs da propriedade de um controle, poderamos fazer a ligao com uma propriedade da pgina. Por exemplo,
se quisermos que o controle RotuloTexto exiba o valor da propriedade EnableViewState da pgina, podemos fazer
a seguinte ligao:
<asp:Label
425
CAPTULO 11: ACESSANDO BANCOS DE DADOS COM ASP.NET PARTE 2
www.juliobattisti.com.br
id=RotuloTexto
Text=<%# Page.EnableViewState %>
runat=server
/>
Data Binding de Mltiplos Valores. repeated-value-binding
Quando um controle ligado a uma fonte de dados como um DataView, temos um exemplo de repeated-value-bind-
ing. No exemplo da Listagem 11.2, apresentamos o exemplo onde os valores de um controle do tipo DropDownList
so obtidos a partir de um objeto DataView. Existem diversos controles capazes de receber dados de um objeto
DataView ou DataReader, se for o caso. Neste captulo estudaremos os seguintes controles:
CheckBoxList
DataList
DropDownList
RadioButtonList
Repeater
O controle DataGrid tambm recebe dados de um DataView, conforme j vimos nos exemplos do Captulo 10. No
Final deste captulo estudaremos mais algumas caractersticas do controle DataGrid.
O Controle CheckBoxList
Este controle permite que sejam exibidos diversos checkbox, com base em dados retornados por um objeto DataView,
um objeto DataReader, um objeto DataSet, um ArrayList ou uma coleo. Por exemplo, se fizermos o controle baseado
em um DataView que retorna o nome de 10 produtos, sero criados 10 CheckBox, uma com o nome de cada produto.
Para dar um melhor alinhamento aos checkbox que so construdos dinamicamente, o controle CheckBoxList utiliza
uma tabela. Podemos controlar a aparncia desta tabela, utilizando algumas propriedades do controle CheckBoxList.
Sintaxe para o controle CheckBoxList:
<asp:CheckBoxList
id=identificao_no_cdigo
AutoPostBack=True|False
CellPadding=Distncia entre as bordas e o contedo das clulas.
DataSource=<% Fonte dos dados, normalmente definida no cdigo da pgina. %>
DataTextField=Campo ou coluna a partir do qual obtido o texto de cada
CheckBox
DataValueField=Campo ou coluna a partir do qual obtido o valor de cada
CheckBox
RepeatColumns=Define o nmero controles por linha
RepeatDirection=Vertical|Horizontal
RepeatLayout=Flow|Table
426 www.juliobattisti.com.br
ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB
TextAlign=Right|Left
OnSelectedIndexChanged=Evento que executa quando um checkbox alterado
runat=server
>
<asp:ListItem
value=value
selected=True|False>
Items adicionados estaticamente.
</asp:ListItem>
</asp:CheckBoxList>
O controle CheckBoxList possui uma coleo chamada Items. Esta coleo contm os
elementos individuais do controle, os quais podem ser acessados atravs de cdigo de
programao. Para determinar quais itens foram selecionados, podemos fazer um loop
atravs dos elementos da coleo Items.
O valor padro da propriedade RepeatLayot Table, o que faz com que os diversos
Check Box sejam arranjados na forma de uma tabela.
Exemplo: Vamos utilizar um controle CheckBoxList que exibe todas as cidades do Brasil,
para as quais j foram enviados Pedidos. Obteremos esta informao a partir da tabela
Pedidos, do banco de dados NorthWind.mdb. Utilizaremos o layout no formato de uma
tabela, para o controle CheckBoxList. Tambm utilizamos algumas propriedades herdadas
da classe CheckBoxList Class.
Na Listagem 11.4 temos o cdigo para o exemplo proposto.
Listagem 11.4 Um exemplo do controle CheckBoxList.
<%@ Import Namespace=System.Data %>
<%@ Import Namespace=System.Data.OleDb %>
<html>
<script language=C# runat=server>
protected void Page_Load(Object Src, EventArgs E )
{
NOTA: Existem diversas
outras propriedades para
este controle. Para
maiores informaes
consulte a classe
CheckBoxList Class, do
namespace
System.Web.UI.WebControls.
427
CAPTULO 11: ACESSANDO BANCOS DE DADOS COM ASP.NET PARTE 2
www.juliobattisti.com.br
// Crio uma conexo com o banco de dados do Microsoft Access.
// C:\Meus documentos\NorthWind.mdb.
String DefineConexo= PROVIDER=MICROSOFT.JET.OLEDB.4.0; +
DATA SOURCE=c:\\meus documentos\\NorthWind.mdb;
OleDbConnection MinhaConexo = new OleDbConnection(DefineConexo);
// Utilizamos um objeto DataAdapter para executar um comando SQL,
// o qual retorna todos os dados da tabela Clientes.
OleDbDataAdapter MeuComando = new OleDbDataAdapter(SELECT CidadeDeDestino
+ FROM Pedidos Group By CidadeDeDestino,PasDeDestino HAVING PasDeDestino=Brasil

+ Order By CidadeDeDestino, MinhaConexo);


// Criamos e preenchemos um objeto DataSet.
DataSet ds = new DataSet();
// Utilizo o mtodo Fill do objeto DataAdapter, para preencher
// o objeto DataSet, com os dados retornados pelo comando SQL.
MeuComando.Fill(ds);
// Criamos um objeto DataView ligado com a primeira
// tabela, da coleo de tabelas, do objeto ds.
DataView source = new DataView(ds.Tables[0]);
// Para podermos comparar os resultados, vou utilizar um controle
// DropDownList e um controle CheckBoxList.
// ***************************************************
// Ligo o objeto DataView a um controle do tipo
// DropDownList.
MinhaLista.DataSource = source ;
428 www.juliobattisti.com.br
ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB
MinhaLista.DataBind();
// Ligo o objeto DataView a um controle do tipo
// CheckBoxList.
MeusCheckBox.DataSource = source;
MeusCheckBox.DataBind();
}
</script>
<body>
<h3><font face=Verdana>Lista e CheckBox dinmicos com ASP.NET!!!</font></h3>
<form runat=server>
<asp:DropDownList
id=MinhaLista
runat=server
DataTextField=CidadeDeDestino
>
</asp:DropDownList>
<BR>
<BR>
<BR>
<BR>
<BR>
<asp:CheckBoxList
id=MeusCheckBox
CellPadding=2"
DataTextField=CidadeDeDestino
DataValueField=CidadeDeDestino
429
CAPTULO 11: ACESSANDO BANCOS DE DADOS COM ASP.NET PARTE 2
www.juliobattisti.com.br
RepeatColumns=2"
RepeatDirection=Vertical
RepeatLayout=Table
TextAlign=Right
BackColor=#c0c0c0"
BorderWidth=2"
Font-Bold=True
BorderColor=Blue
runat=server
>
</asp:CheckBoxList>
</form>
</body>
</html>
Digite o cdigo da Listagem 11.4 e salve o mesmo em um arquivo chamado chap11ex4.aspx, na pasta chap11, dentro
da pasta wwwroot, conforme descrito no item: Check List para acompanhar os exemplos deste livro, no Captulo 6.
Para acessar esta pgina utilize o seguinte endereo: http://localhost/chap10/chap11ex4.aspx
Figura 11.4: O controle CheckBoxList.
430 www.juliobattisti.com.br
ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB
Voc obtm uma lista com o nome das cidades do Brasil para as quais existem pedidos e um grupo de controles do tipo
CheckBox, com um controle para cada cidade, conforme indicado na Figura 11.4.
Comentrios sobre o cdigo do exemplo:
Para retornar apenas o nome das cidades do Brasil, para as quais houve pedidos, tivemos que lanar mo de
um comando SQL um pouco sofisticado:
OleDbDataAdapter MeuComando = new OleDbDataAdapter(SELECT CidadeDeDestino
+ FROM Pedidos Group By CidadeDeDestino,PasDeDestino HAVING
PasDeDestino=Brasil
+ Order By CidadeDeDestino, MinhaConexo);
Sem dvidas, o ASP.NET uma evoluo em relao ao ASP 3.0, mas o bom e velho SQL est sempre presente
e necessrio. Precisamos conhecer os comandos bsicos e avanados da linguagem SQL. Um detalhe importante
que existem pequenas diferenas em relao aos comandos SQL para o Microsoft Access e para o SQL Server. No
Anexo III veremos mais detalhes sobre a linguagem SQL e as diferenas entre o SQL para o Microsoft Access e
para o SQL Server.
Na seo de cdigo definimos a propriedade DataSource do controle MeusCheckBox e chamamos o mtodo
DataBind do mesmo:
MeusCheckBox.DataSource = source;
MeusCheckBox.DataBind();
Este procedimento o mesmo que utilizamos para o controle DropDownList.
Na seo de apresentao da pgina utilizamos um controle CheckBoxList, onde fizemos uso de diversas
propriedades deste controle.
DataTextField=CidadeDeDestino: Define o nome do campo do DataView, que fornecer o texto para
cada CheckBox.
DataValueField=CidadeDeDestino: Define o nome do campo do DataView, que fornecer o valor
relacionado com cada CheckBox, quando este for selecionado.
RepeatColumns=2": Estamos utilizando um Layout de Tabela (RepeatLayout=Table). Esta opo de-
fine o nmero de colunas.
Em seguida definimos negrito para a fonte (Font-Bold=True), definimos a cor de segundo plano das clulas como
cinza (BackColor=#c0c0c0"), o tamanho da borda em 2 pixels (BorderWidth=2") e a cor da borda azul
(BorderColor=Blue).
Como detectar as opes que foram selecionadas em um controle CheckBoxList?
Para determinar as opes que foram selecionados em um controle CheckBoxList, podemos percorrer a coleo Items
do controle e testar se determinado item foi selecionado. Por exemplo, se tivermos um controle chamado
OpcoesDeCartao e quisermos determinar se o primeiro elemento foi selecionado, podemos fazer o seguinte teste:
431
CAPTULO 11: ACESSANDO BANCOS DE DADOS COM ASP.NET PARTE 2
www.juliobattisti.com.br
if (OpcoesDeCartao.Items[0].Selected)
{
Comando 1
Comando 2
...
Comando n
}
Exemplo: Vamos criar um exemplo, onde temos um controle CheckBoxList, onde as opes foram criadas de uma
maneira esttica. Cada vez que o usurio clica em uma opo disparado o evento OnSelectedIndexChanged. Criaremos
cdigo para este evento, para atualizar o controle que exibe as opes selecionadas.
Na Listagem 11.5 temos o cdigo para o exemplo proposto.
Listagem 11.5 Detectando as opes selecionadas.
<%@ Page Language=C# %>
<html>
<head>
</head>
<body>
<script language=C# runat=server>
void Verifica_Selecionados(Object sender, EventArgs e)
{
Mensagem.Text=<B>Selected Item(s):</B> + <br> + <br>;
for (int i=0; i<MinhasOpcoes.Items.Count; i++)
{
if (MinhasOpcoes.Items[i].Selected)
Mensagem.Text=Mensagem.Text + MinhasOpcoes.Items[i].Text + <br>;
}
}
</script>
432 www.juliobattisti.com.br
ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB
<form runat=server>
<asp:CheckBoxList
id=MinhasOpcoes
runat=server
AutoPostBack=True
CellPadding=5"
CellSpacing=5"
RepeatColumns=2"
RepeatDirection=Vertical
RepeatLayout=Flow
TextAlign=Right
OnSelectedIndexChanged=Verifica_Selecionados>
<asp:ListItem>Item 1</asp:ListItem>
<asp:ListItem>Item 2</asp:ListItem>
<asp:ListItem>Item 3</asp:ListItem>
<asp:ListItem>Item 4</asp:ListItem>
<asp:ListItem>Item 5</asp:ListItem>
<asp:ListItem>Item 6</asp:ListItem>
</asp:CheckBoxList>
<br><br>
<asp:label
id=Mensagem
runat=server
/>
</form>
</body>
</html>
Digite o cdigo da Listagem 11.5 e salve o mesmo em um arquivo chamado chap11ex5.aspx, na pasta chap11, dentro
da pasta wwwroot, conforme descrito no item: Check List para acompanhar os exemplos deste livro, no Captulo 6.
433
CAPTULO 11: ACESSANDO BANCOS DE DADOS COM ASP.NET PARTE 2
www.juliobattisti.com.br
Para acessar esta pgina utilize o seguinte endereo: http://localhost/chap10/chap11ex5.aspx
Clique no Item 1 e observe que, automaticamente o Item selecionado informado no controle Label. Selecione o Item
5. Novamente o Item selecionado informado. Marque o Item 4, mesma coisa. Agora desmarque o Item 4, o Label
atualizado, conforme indicado na Figura 11.5.
Figura 11.5: Exemplo da coleo Items.
Comentrios sobre o cdigo do exemplo:
Na definio do controle, utilizamos o evento OnSelectedIndexChanged. Este evento disparado toda vez que
clicamos em uma das opes do controle CheckBoxList. Em resposta a este evento, criamos o procedimento
Verifica_Selecionados, na seo de cdigo da pgina.
O procedimento Verifica_Selecionados define a propriedade Text do label Mensagem, para exibir quais opes
esto atualmente selecionadas. Utilizamos um lao For que varia de 0 at o nmero de opes do controle.
Para obter o nmero de opes do controle, utilizamos a propriedade Count da coleo Items:
MinhasOpcoes.Items.Count
No interior do lao for, se uma determinada opo estiver selecionada:
if (MinhasOpcoes.Items[i].Selected)
concatenamos o valor desta opo propriedade Text do label Mensagem, mais uma tag <BR> para uma quebra de
linha. A tag <BR> faz com que cada opo selecionada seja exibida em uma linha diferente.
No final do lao for, o Label Mensagem exibe as opes selecionadas, uma em cada linha. Este exatamente o
resultado desejado.
434 www.juliobattisti.com.br
ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB
O Controle DropDownList
Utilizamos este controle nos exemplos Chap11ex2.aspx e Chap11ex4.aspx. O controle DropDownList utilizado
para a criao de uma lista de opes. A lista pode ser definida de uma maneira esttica, utilizando uma srie de
controles ListItem ou pode ser associada a uma fonte de dados (Data Binding). Ao associarmos o controle DropDownList
a uma fonte de dados, as opes da lista sero criadas, automaticamente, a partir dos dados retornados por um objeto
DataView ou DataReader.
A sintaxe para o controle DropDownList:
<asp:DropDownList
id=identificao_no_cdigo
runat=server
DataSource=<% fonte de dados %>
DataTextField=Campo da fonte de dados com os rtulos para os itens da lista.
DataValueField=Campo da fonte de dados com os valores para os itens da lista.
AutoPostBack=True|False
OnSelectedIndexChanged=Mtodo que executa quando um elemento da lista
selecionado>
<asp:ListItem
value=valor do item da lista.
selected=True|False>
Texto do item da lista.
</asp:ListItem>
</asp:DropDownList>
O controle DropDownList derivado da classe DropDownList, do namespace System.Web.UI.Controls. Esta classe
possui uma srie de propriedades que permitem a definio dos aspectos visuais do controle. Na Tabela 11.1, temos a
definio das principais propriedades para o controle DropDownList.
Tabela 11.1 Principais propriedades do controle DropDownList.
Propriedade Descrio
BackColor Utilizada para definir ou retornar a cor de segundo plano do controle.
BorderColor Utilizada para definir ou retornar a cor de borda do controle.
BorderWidth Utilizada para definir ou retornar o tamanho, em pixels, das bordas do controle.
DataSource Define a fonte de dados a partir da qual so gerados os itens do controle.
DataTextField Define o campo da fonte de dados, que define o texto que ser exibido para cada item.
Font Define ou retorna informaes sobre as caractersticas da fonte do controle.
AccessKey Define um atalho de teclado para colocar o foco no controle.
435
CAPTULO 11: ACESSANDO BANCOS DE DADOS COM ASP.NET PARTE 2
www.juliobattisti.com.br
O principal mtodo deste controle DataBind( ), o qual faz a ligao do controle com uma fonte de dados. Poderamos
redefinir o controle DropDownList do exemplo Chap11ex2.aspx, da seguinte maneira:
<asp:DropDownList
id=MinhaLista
runat=server
DataTextField=PasDeDestino
BackColor=#c0c0c0"
ForeColor=Blue
Font-Bold=True
Font-Italic=True
>
Com estas alteraes a aparncia do controle fica conforme indicado na Figura 11.6.
O Controle RadioButtonList
Com este controle podemos criar um grupo de Radio Buttons, dinamicamente, a partir de uma fonte de dados. Por
exemplo, podemos gerar um grupo com um Radio Button para cada cidade da Alemanha, para a qual temos pedidos na
tabela Pedidos. Somente um RadioButton do controle pode estar selecionado ao mesmo tempo. O comportamento o
mesmo do controle RadioButton, com a diferena de que o controle RadioButtonList suporta Data Binding para a
gerao dinmica dos seus itens, a partir de uma fonte de dados.
Figura 11.6: Propriedades do controle DropDownList.
436 www.juliobattisti.com.br
ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB
A sintaxe para este controle:
<asp:RadioButtonList
id=identificao_no_cdigo
AutoPostBack=True|False
CellPadding=Distncia entre as bordas e o contedo das clulas.
DataTextField=Campo a partir do qual obtido o texto de cada RadioButton
DataValueField=Campo a partir do qual obtido o valor de cada RadioButton
RepeatColumns=Define o nmero controles por linha
RepeatDirection=Vertical|Horizontal
RepeatLayout=Flow|Table
TextAlign=Right|Left
OnSelectedIndexChanged=Evento que executa quando clicamos em um RadioButton
runat=server>
<asp:ListItem
Text=Texto do item.
Value=Valor do item.
Selected=True|False
/>
</asp:RadioButtonList>
O controle CheckBoxList possui uma coleo chamada Items. Esta coleo contm os
elementos individuais do controle, os quais podem ser acessados atravs de cdigo de
programao. Para determinar quais items foram selecionados, podemos fazer um loop
atravs dos elementos da coleo Items.
O valor padro da propriedade RepeatLayot Table, o que faz com que os diversos
Check Box sejam arranjados na forma de uma tabela. Utilizamos a propriedade
RepeatColumns para definir o nmero de controles por linha da tabela.
Exemplo: Vamos utilizar um controle RadioButtonList que exibe todas as cidades da
Alemanha, para as quais j foram enviados Pedidos. Obteremos esta informao a partir
da tabela Pedidos, do banco de dados NorthWind.mdb. Utilizaremos o layout no formato de uma tabela com trs colunas,
para o controle RadioButtonList. Tambm utilizamos algumas propriedades herdadas da classe RadioButtonList Class.
Na Listagem 11.6 temos o cdigo para o exemplo proposto.
Listagem 11.6 Um exemplo do controle RadioButtonList.
<%@ Import Namespace=System.Data %>
NOTA: Existem diversas
outras propriedades para
este controle. Para
maiores informaes
consulte a classe
RadioButtonList Class, do
namespace
System.Web.UI.WebControls.
437
CAPTULO 11: ACESSANDO BANCOS DE DADOS COM ASP.NET PARTE 2
www.juliobattisti.com.br
<%@ Import Namespace=System.Data.OleDb %>
<html>
<script language=C# runat=server>
void Page_Load(Object Src, EventArgs E )
{
// Crio uma conexo com o banco de dados do Microsoft Access.
// C:\Meus documentos\NorthWind.mdb.
String DefineConexo= PROVIDER=MICROSOFT.JET.OLEDB.4.0; +
DATA SOURCE=c:\\meus documentos\\NorthWind.mdb;
OleDbConnection MinhaConexo = new OleDbConnection(DefineConexo);
// Utilizamos um objeto DataAdapter para executar um comando SQL,
// o qual retorna as cidades da Alemanha.
// Para maiores informaes sobre a linguagem SQL, consulte o Anexo III.
OleDbDataAdapter MeuComando = new OleDbDataAdapter(SELECT CidadeDeDestino +
FROM Pedidos Group By CidadeDeDestino,PasDeDestino HAVING PasDeDestino=Alemanha
+ Order By CidadeDeDestino, MinhaConexo);
// Criamos e preenchemos um objeto DataSet.
DataSet ds = new DataSet();
// Utilizo o mtodo Fill do objeto DataAdapter, para preencher
// o objeto DataSet, com os dados retornados pelo comando SQL.
MeuComando.Fill(ds);
// Criamos um objeto DataView ligado com a primeira
// tabela, da coleo de tabelas, do objeto ds.
438 www.juliobattisti.com.br
ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB
DataView source = new DataView(ds.Tables[0]);
// Ligo o objeto DataView a um controle do tipo
// RadioButtonList - MeusBotoes.
MeusBotoes.DataSource = source;
MeusBotoes.DataBind();
}
</script>
<body>
<h3><font face=Verdana>Radio Button dinmicos com ASP.NET!!!</font></h3>
<form runat=server>
<HR>
<asp:RadioButtonList
id=MeusBotoes
CellPadding=2"
DataTextField=CidadeDeDestino
DataValueField=CidadeDeDestino
RepeatColumns=3"
RepeatDirection=Vertical
RepeatLayout=Table
TextAlign=Right
BackColor=#c0c000"
BorderWidth=2"
Font-Bold=True
BorderColor=Blue
runat=server
>
</asp:RadioButtonList>
439
CAPTULO 11: ACESSANDO BANCOS DE DADOS COM ASP.NET PARTE 2
www.juliobattisti.com.br
<HR>
</form>
</body>
</html>
Digite o cdigo da Listagem 11.6 e salve o mesmo em um arquivo chamado chap11ex6.aspx, na pasta chap11, dentro
da pasta wwwroot, conforme descrito no item: Check List para acompanhar os exemplos deste livro, no Captulo 6.
Para acessar esta pgina utilize o seguinte endereo: http://localhost/chap10/chap11ex6.aspx
Voc obtm o resultado indicado na Figura 11.7.
Figura 11.7: O controle RadioButtonList opes geradas dinamicamente.
Observe que utilizamos algumas propriedades para definir os aspectos visuais do controle:
RepeatColumns=3: Define que os controles sero exibidos em uma tabela com trs colunas, ou seja, trs
controles por linha.
RepeatLayout=Table: Os controles sero organizados no formato de uma tabela.
TextAlign=Right: Alinhamento de texto direita.
BackColor=#c0c000": Cor de segundo plano da tabela, na qual so colocados os controles.
BorderWidth=2": Tamanho da borda externa em pixels.
Font-Bold=True: Exibe a fonte em negrito.
BorderColor=Blue: Define a cor da borda externa.
440 www.juliobattisti.com.br
ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB
Mais um Pouco Sobre o Controle DataGrid
No Captulo 10 mostramos algumas das capacidades do controle DataGrid, ao mesmo tempo que chamamos a ateno
para o fato de ser este um controle bastante poderoso, que nos oferece um grande nmero de funcionalidades. Vamos
aprender, em detalhes, mais duas funcionalidades importantes do controle DataGrid:
Ordenar dados.
Filtrar dados.
Nos exemplos que iremos apresentar, vamos utilizar, como fonte de dados para o controle DataGrid, um objeto DataView.
Desta maneira poderemos utilizar as facilidades de ordenao e filtragem do objeto DataView, para definir quais
dados e de que maneira estes dados sero exibidos no DataGrid.
Ordenao com o Controle DataGrid
O controle DataGrid possui uma propriedade chamada AllowSorting (j descrita no Captulo 10). Quando esta
propriedade definida em True, os ttulos de coluna, do controle DataGrid, so transformados em Hyperlinks. Quando
clicamos em um destes links, ocorre um PostBack e o cdigo definido para o evento SortCommand executado.
Vamos construir um exemplo onde so exibidos todos os pedidos para o Brasil, a partir da tabela Pedidos do Banco de
dados NorthWind.mdb. Definiremos a propriedade AllowSorting do controle DataGrid para True. O passo final
criar o cdigo que executa quando o usurio clica no ttulo de uma das colunas. Por exemplo, se o usurio clicar na
coluna CidadeDeDestino, devemos ordenar os dados pela CidadeDeDestino.
Na Listagem 11.7 temos o cdigo para o exemplo proposto.
Listagem 11.7 Ordenao com o controle DataGrid.
<%@ Import Namespace=System.Data %>
<%@ Import Namespace=System.Data.OleDb %>
<html>
<script language=C# runat=server>
// Declaro uma varivel do tipo String.
// Esta varivel contm o nome da coluna pela qual
// faremos a ordenao.
// da pgina.
String OrdenaPor;
NOTA: Para a criao
deste exemplo,
utilizaremos algumas
tcnicas avanadas. Todas
as tcnicas utilizadas
sero descritas aps o
cdigo do exemplo.
441
CAPTULO 11: ACESSANDO BANCOS DE DADOS COM ASP.NET PARTE 2
www.juliobattisti.com.br
// No evento Page_Load definimos a ordenao padro, pelo campo
// NmeroDoPedido e chamamos o procedimento BuscaDados().
// A definio do campo padro de ordenao somente ocorre quando
// a pgina carregada pela primeira vez, isto , quando no for um PostBack.
void Page_Load(Object Src, EventArgs E )
{
if (Page.IsPostBack)
{
// No faz nada.
}
else
// Define, por padro, a ordenao por NmeroDoPedido.
{
OrdenaPor = NmeroDoPedido;
}
// Chamo a rotina que acessa o Banco de dados e preenche o DataGrid.
BuscaDados();
}
// Rotina que faz a conexo com o banco de dados Northwind.mdb.
// Ordena os dados de acordo com o campo definido na varivel OrdenaPor.
void BuscaDados()
{
// Crio uma conexo com o banco de dados do Microsoft Access.
// C:\Meus documentos\NorthWind.mdb.
String DefineConexo= PROVIDER=MICROSOFT.JET.OLEDB.4.0; +
DATA SOURCE=c:\\meus documentos\\NorthWind.mdb;
442 www.juliobattisti.com.br
ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB
OleDbConnection MinhaConexo = new OleDbConnection(DefineConexo);
// Utilizamos um objeto DataAdapter para executar um comando SQL,
// o qual retorna os pedidos para o Brasil.
OleDbDataAdapter MeuComando = new
OleDbDataAdapter(SELECT NmeroDoPedido,EndereoDoDestinatrio,
+ Frete,CidadeDeDestino,PasDeDestino FROM Pedidos WHERE PasDeDestino=Brasil
+ Order By NmeroDoPedido, MinhaConexo);
// Criamos e preenchemos um objeto DataSet.
DataSet ds = new DataSet();
// Utilizo o mtodo Fill do objeto DataAdapter, para preencher
// o objeto DataSet, com os dados retornados pelo comando SQL.
MeuComando.Fill(ds);
// Criamos um objeto DataView ligado com a primeira
// tabela, da coleo de tabelas, do objeto ds.
DataView source = new DataView(ds.Tables[0]);
// Defino a propriedade Sort, do objeto source, como sendo
// igual ao valor da String OrdenaPor.
source.Sort=OrdenaPor;
// Ligo o objeto DataView a um controle do tipo
// DataGrid - MinhaGrade.
MinhaGrade.DataSource = source;
MinhaGrade.DataBind();
}
443
CAPTULO 11: ACESSANDO BANCOS DE DADOS COM ASP.NET PARTE 2
www.juliobattisti.com.br
// Rotina que executa em resposta ao evento OnSortCommando
// do controle DataGrid.
// Esta rotina recebe dois argumentos, um do tipo Object e outro
// e outro do tipo DataGridSortCommandEventArgs.
void OrdenaDados(Object sender, DataGridSortCommandEventArgs e)
{
// Defino o valor da String OrdenPor, com base na propriedade
// SortExpression, do argumento e, o qual do tipo
// DataGridSortCommandEventArgs, passado como parmetro.
OrdenaPor = e.SortExpression.ToString();
// Chamo a rotina que faz a conexo para reordenar os dados,
// com base no novo valor da String OrdenaPor.
BuscaDados();
}
</script>
<body>
<h3><font face=Verdana>Ordenao com o controle DataGrid!!!</font></h3>
<form runat=server>
<H4> Clique no ttulo da coluna para ordenar pelo campo respectivo.</H4>
<HR>
<ASP:DataGrid
id=MinhaGrade runat=server
Width=700"
BackColor=#ccccff
BorderColor=black
ShowFooter=false
444 www.juliobattisti.com.br
ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB
CellPadding=3
CellSpacing=0"
Font-Name=Verdana
Font-Size=8pt
HeaderStyle-BackColor=#aaaadd
MaintainState=false
AllowSorting=True
OnSortCommand=OrdenaDados
/>
</form>
</body>
</html>
Digite o cdigo da Listagem 11.7 e salve o mesmo em um arquivo chamado chap11ex7aspx, na pasta chap11, dentro
da pasta wwwroot, conforme descrito no item: Check List para acompanhar os exemplos deste livro, no Captulo 6.
Para acessar esta pgina utilize o seguinte endereo: http://localhost/chap10/chap11ex7aspx
Voc obtm uma pgina com todos os pedidos para o Brasil. Observe que o ttulo das colunas um link. Clique no
ttulo da coluna CidadeDeDestino. Observe que os dados so classificados, em ordem Crescente, pela coluna
CidadeDeDestino, conforme indicado na Figura 11.8.
Agora d um clique no cabealho da Coluna Frete e observe que os dados so classificados, em ordem crescente do
valor do frete.
Comentrios sobre o cdigo do exemplo:
A primeira grande diferena que voc deve ter notado em relao aos exemplos anteriores a utilizao de
diversas rotinas:
1. Page_Load
2. Busca_Dados
3. OrdenaDados
Uma pgina ASP.NET uma instncia da classe Page. Ns vimos nos Captulos 3, 4 e 5 que um Classe em C# pode ser
composta de diversos procedimentos. Neste exemplo estamos criando trs procedimentos. No existe a definio
explcita da classe, atravs da palavra Class. Esta a nica diferena em relao aos exemplos dos Captulos 3, 4 e 5.
Tambm criamos uma varivel do tipo String chamada OrdenaPor. Como esta varivel foi declarada fora de qualquer
procedimento, a mesma pode ser acessada em qualquer local da seo de cdigo da pgina, ou seja, a varivel OrdenaPor
tem escopo de pgina:
String OrdenaPor;
445
CAPTULO 11: ACESSANDO BANCOS DE DADOS COM ASP.NET PARTE 2
www.juliobattisti.com.br
Figura 11.8: Dados ordenados pela coluna CidadeDeDestino.
Na seo de apresentao da pgina, inserimos um controle do tipo DataGrid. Definimos a propriedade
AllowSorting=True. Isso faz com que o cabealho das colunas seja exibido como um link. Na propriedade
OnSortCommand, definimos o nome do procedimento que ser executado quando o usurio clicar no link
referente ao cabealho de uma coluna:
AllowSorting=True
OnSortCommand=OrdenaDados
Vamos entender o procedimento Page_Load: Este evento, conforme j descrito anteriormente, executado
toda vez que a pgina for carregada. Quando a pgina for carregada pela primeira vez, a propriedade
Page.IsPostBack igual a False e, neste caso, a varivel OrdenaPor definida como sendo igual a
NmeroDoPedido.
Fora da estrutura if/else, chamado o procedimento BuscaDados( ), ou seja, este procedimento ser chamado sempre
que a pgina for carregada, independente de ser um PostBack ou no.
Vamos entender o procedimento BuscaDados( ): Grande parte do cdigo deste procedimento j de nosso
conhecimento. So comandos para conectar com o banco de dados NorthWind.mdb, executar um comando SQL e
retornar os dados em um objeto DataSet, a partir do qual criamos um objeto DataView. O nico detalhe adicional
que temos neste procedimento a definio da propriedade Sort, do objeto source, que um objeto do tipo DataView:
source.Sort=OrdenaPor;
446 www.juliobattisti.com.br
ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB
Neste momento o objeto DataView ordenado pela coluna, cujo nome est contido na String OrdenaPor.
O elemento principal: o procedimento OrdenaDados. Este procedimento executado em resposta ao evento
OnSortCommand, o qual acontece toda vez que o usurio clica em um link, de uma das colunas do DataGrid.
Vamos acompanhar o que acontece quando, por exemplo, o usurio clica no link da coluna CidadeDeDestino.
1. O evento OnSortCommand disparado.
2. Em resposta ao evento OnSortCommand, o procedimento OrdenaDados executado.
3. O procedimento OrdenaDados recebe dois argumentos. O primeiro um argumento do tipo Object e o segundo
do tipo DataGridSortCommandEventArgs. Este segundo evento tem uma propriedade chamada SortExpression,
a qual retorna o nome da coluna correspondente ao link clicado pelo usurio. No nosso exemplo a expresso:
OrdenaPor = e.SortExpression.ToString();
retorna CidadeDeDestino, uma vez que o usurio clicou no link da coluna CidadeDeDestino. Com isso conseguimos
detectar qual o link clicado e, conseqentemente, por qual campo devemos ordenar. Uma vez definido o valor da
String OrdenaPor, chamamos o mtodo BuscaDados( ), o qual retornar os dados e ir orden-los com base no
valor definido na String OrdenaPor.
Em resumo, o procedimento OrdenaDados faz o seguinte: define o valor da String OrdenaPor e chama o procedimento
BuscaDados.
importante salientar que a possibilidade de criar diferentes procedimentos e a
possibilidade de chamarmos um procedimento, dentro do outro, nos d uma
flexibilidade muito grande. Alm disso, ao dividirmos o cdigo de nossas pginas
ASP.NET em procedimentos, podemos organiz-lo de uma maneira mais intuitiva,
o que torna fcil a compreenso e, principalmente, a manuteno do mesmo.
Observe que, conhecendo os elementos (eventos, argumentos, etc.) corretos,
com poucas linhas de cdigo possvel criar funcionalidades que, com ASP 3.0,
exigem uma grande quantidade de cdigo. Mais uma vez conseguimos comprovar
o quo mais produtivo, do ponto de vista do desenvolvedor, o ASP.NET em
relao s verses anteriores.
Filtrando Dados com o Controle DataGrid
Para filtrar os dados de um objeto DataView, utilizamos a propriedade RowFilter. Atribumos, a esta propriedade, uma
expresso de filtragem. Por exemplo, se quisermos que sejam exibidos apenas os pedidos em que o campo PasDeDestino
seja igual a Brasil, utilizamos o seguinte comando:
PasDeDestino = Brasil
A expresso a mesma que utilizaramos em um clusula WHERE da linguagem SQL. Podemos utilizar todos os
operadores, funes e critrios vlidos como critrios de filtragem.
NOTA: Para maiores
informaes sobre a classe
DataGridSortCommandEventArgs,
consulte a documentao
do Framework .NET. Esta
classe faz parte do
namespace
System.Web.UI.WebControls.
447
CAPTULO 11: ACESSANDO BANCOS DE DADOS COM ASP.NET PARTE 2
www.juliobattisti.com.br
Exemplo: Vamos apresentar um exemplo, onde destacaremos as seguintes tcnicas:
Utilizao de um comando SQL para retornar dados de duas tabelas.
Utilizao da propriedade RowFilter, do objeto DataView, para filtrar os dados
exibidos em um DataGrid.
O nosso exemplo ser composto de um formulrio onde temos um controle DataGrid
que exibe os campos indicados na Tabela 11.2.
Tabela 11.2 Campos para o exemplo Chap11Ex8.aspx.
NOTA: Para maiores
detalhes sobre a
linguagem SQL, consulte
o Anexo III.
Observe que estamos retornando dados de duas tabelas diferentes: Pedidos e Clientes. Neste caso teremos que utilizar
uma clusula JOIN, no comando SQL. As tabelas Pedidos e Clientes so relacionadas atravs do campo
CdigoDoCliente. Este um relacionamento do tipo Um (tabela Clientes) para vrios (tabela Pedidos), o que significa
que cada Cliente cadastrado uma nica vez, porm pode fazer vrios pedidos. Para maiores informaes sobre
relacionamentos, consulte o Anexo II. Para maiores informaes sobre o SQL consulte o Anexo III.
Alm do controle DataGrid, teremos um campo do tipo TextBox, onde o usurio pode digitar o nome ou parte do nome
de um Cliente. Ao clicar no boto Pesquisar, o DataGrid passar a exibir somente os pedidos para os clientes cujo
nome, atende ao critrio digitado.
Na Listagem 11.8 temos o cdigo para o exemplo proposto.
Listagem 11.8 Filtragem com o controle DataGrid.
<%@ Import Namespace=System.Data %>
<%@ Import Namespace=System.Data.OleDb %>
<html>
<script language=C# runat=server>
// Declaro uma varivel do tipo String.
// Esta varivel contm o nome da coluna pela qual
Campo De qual tabela?
NmeroDoPedido Pedidos
NomeDaEmpresa Clientes
CidadeDeDestino Pedidos
PasDeDestino Pedidos
NOTA: Neste exemplo
vamos manter o cdigo que
faz a classificao dos
dados quando o usurio
clica no ttulo de uma das
colunas do DataGrid. Desta
forma poderemos filtrar e
classificar os dados.
448 www.juliobattisti.com.br
ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB
// faremos a ordenao.
// Esta varivel pode ser acessada em qualquer procedimento da pgina.
String OrdenaPor;
String FiltraDados;
void Page_Load(Object Src, EventArgs E )
{
if (Page.IsPostBack)
{
// Define o valor da String FiltraDados que,
// na prtica, a expresso de filtragem dos dados,
// que ser atribuda propriedade RowFilter.
FiltraDados=NomeDaEmpresa LIKE * + DigitaCriterio.Text + *;
}
else
// Define, por padro, a ordenao por NmeroDoPedido.
// Atribui um valor padro para o campo de pesquisa.
{
OrdenaPor = NmeroDoPedido;
DigitaCriterio.Text=a;
}
// Chamo a rotina que acessa o Banco de dados e preenche o DataGrid.
BuscaDados();
}
// Rotina que faz a conexo com o banco de dados Northwind.mdb.
// Ordena os dados de acordo com o campo definido na varivel OrdenaPor.
// Filtra de acordo com o critrio especificado na String FiltraDados.
449
CAPTULO 11: ACESSANDO BANCOS DE DADOS COM ASP.NET PARTE 2
www.juliobattisti.com.br
void BuscaDados()
{
// Crio uma conexo com o banco de dados do Microsoft Access.
// C:\Meus documentos\NorthWind.mdb.
String DefineConexo= PROVIDER=MICROSOFT.JET.OLEDB.4.0; +
DATA SOURCE=c:\\meus documentos\\NorthWind.mdb;
OleDbConnection MinhaConexo = new OleDbConnection(DefineConexo);
// Utilizamos um objeto DataAdapter para executar um comando SQL,
// o qual retorna as cidades da Alemanha.
String ComandoSQL;
String aux1SQL;
String aux2SQL;
String aux3SQL;
String aux4SQL;
aux1SQL= SELECT Pedidos.NmeroDoPedido, Clientes.NomeDaEmpresa,
Pedidos.CidadeDeDestino;
aux2SQL= , Pedidos.PasDeDestino FROM Clientes;
aux3SQL= INNER JOIN Pedidos ON Clientes.CdigoDoCliente = Pedidos.CdigoDoCliente;
aux4SQL= ORDER BY Pedidos.NmeroDoPedido;
ComandoSQL = aux1SQL + aux2SQL +aux3SQL +aux4SQL;
OleDbDataAdapter MeuComando = new OleDbDataAdapter(ComandoSQL, MinhaConexo);
// Criamos e preenchemos um objeto DataSet.
// Observe que no temos mais o objeto Recordset,
// como era de praxe com o ASP 3.0.
DataSet ds = new DataSet();
// Utilizo o mtodo Fill do objeto DataAdapter, para preencher
450 www.juliobattisti.com.br
ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB
// o objeto DataSet, com os dados retornados pelo comando SQL.
MeuComando.Fill(ds);
// Criamos um objeto DataView ligado com a primeira
// tabela, da coleo de tabelas, do objeto ds.
DataView source = new DataView(ds.Tables[0]);
// Defino a propriedade Sort, do objeto source, como sendo
// igual ao valor da String OrdenaPor.
source.Sort=OrdenaPor;
// Defino a propriedade RowFilter, para aplicar o critrio de filtragem.
// definido na varivel
source.RowFilter=FiltraDados;
// Ligo o objeto DataView a um controle do tipo
// DataGrid.
MinhaGrade.DataSource = source;
MinhaGrade.DataBind();
}
// Rotina que executa em resposta ao evento OnSortCommando
// do controle DataGrid.
void OrdenaDados(Object sender, DataGridSortCommandEventArgs e)
{
// Defino o valor da String OrdenPor, com base na propriedade
// SortExpression, do argumento e, do tipo
// DataGridSortCommandEventArgs, passado como parmetro.
451
CAPTULO 11: ACESSANDO BANCOS DE DADOS COM ASP.NET PARTE 2
www.juliobattisti.com.br
OrdenaPor = e.SortExpression.ToString();
// Chamo a rotina que faz a conexo para reordenar os dados,
// com base no novo valor da String OrdenaPor.
BuscaDados();
}
</script>
<body>
<h3><font face=Verdana>Ordenao com o controle DataGrid!!!</font></h3>
<form runat=server>
<H4> Clique no ttulo da coluna para ordenar pelo campo respectivo.</H4>
<H4> Digite o nome ou parte do nome da empresa no campo Critrio e d
um</H4>
<H4> clique no boto Pesquisar.</H4>
<HR>
<Table>
<TR>
<TD> Critrio > </TD>
<TD>
<asp:TextBox
runat=server
id=DigitaCriterio
Text=
Font_Face=Arial
Font_Size=3"
Font-Bold=True
BackColor=lightblue
452 www.juliobattisti.com.br
ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB
Height=20"
/>
</TD>
<TD>
<asp:Button
id=Pesquisar
Text=Pesquisar
runat=server
/>
</TD>
</TR>
</Table>
<ASP:DataGrid
id=MinhaGrade runat=server
Width=700"
BackColor=#ccccff
BorderColor=black
ShowFooter=false
CellPadding=3
CellSpacing=0"
Font-Name=Verdana
Font-Size=8pt
HeaderStyle-BackColor=#aaaadd
MaintainState=false
AllowSorting=True
OnSortCommand=OrdenaDados
/>
</form>
</body>
</html>
Digite o cdigo da Listagem 11.8 e salve o mesmo em um arquivo chamado chap11ex8aspx, na pasta chap11, dentro
da pasta wwwroot, conforme descrito no item: Check List para acompanhar os exemplos deste livro, no Captulo 6.
Para acessar esta pgina utilize o seguinte endereo: http://localhost/chap10/chap11ex8aspx
453
CAPTULO 11: ACESSANDO BANCOS DE DADOS COM ASP.NET PARTE 2
www.juliobattisti.com.br
Ser exibida uma pgina com todos os pedidos. Observe que o ttulo das colunas um link. Clique no ttulo da coluna
CidadeDeDestino. Observe que os dados so classificados, em ordem Crescente, pela coluna CidadeDeDestino. Clique no
ttulo da coluna NmeroDoPedido para classificar a listagem pelo NmeroDoPedido, conforme indicado na Figura 11.9.
Figura 11.9: Todos os pedidos sendo exibidos.
Agora vamos definir um critrio de Filtragem. No campo Critrio digite a palavra Moreno e d um clique no boto
Pesquisar. Sero exibidos apenas os pedidos para os clientes que contm a palavra Moreno em qualquer parte do
campo NomeDaEmpresa, conforme indicado na Figura 11.10. Para voltar a exibir todos os registros, apague o contedo
do campo Critrio e d um clique no boto Pesquisar.
Comentrios sobre o cdigo do exemplo Chap11ex8.aspx:
Novamente utilizamos trs procedimentos.
1. Page_Load
2. Busca_Dados
3. OrdenaDados
454 www.juliobattisti.com.br
ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB
Figura 11.10: Aplicando um critrio de filtragem.
Criamos duas variveis do tipo String; uma para conter o nome do campo pelo qual ordenamos a listagem OrdenaPor
e outra para conter a expresso referente ao critrio de Filtragem FiltraDados:
String OrdenaPor;
String FiltraDados;
O controle DataGrid, na seo de apresentao, idntico ao controle utilizado no exemplo da Listagem 11.7.
Ao montar o comando SQL, utilizamos quatro variveis do tipo String, depois concatenamos as quatro variveis
em uma varivel chamada ComandoSQL. Esta varivel foi passada como parmetro para a criao do objeto
DataAdapter:
String ComandoSQL;
String aux1SQL;
String aux2SQL;
String aux3SQL;
String aux4SQL;
aux1SQL= SELECT Pedidos.NmeroDoPedido, Clientes.NomeDaEmpresa,
Pedidos.CidadeDeDestino;
aux2SQL= , Pedidos.PasDeDestino FROM Clientes;
aux3SQL= INNER JOIN Pedidos ON Clientes.CdigoDoCliente =
Pedidos.CdigoDoCliente;
455
CAPTULO 11: ACESSANDO BANCOS DE DADOS COM ASP.NET PARTE 2
www.juliobattisti.com.br
aux4SQL= ORDER BY Pedidos.NmeroDoPedido;
ComandoSQL = aux1SQL + aux2SQL +aux3SQL +aux4SQL;
OleDbDataAdapter MeuComando = new OleDbDataAdapter(ComandoSQL, MinhaConexo);
Observe que fizemos uso da clusula JOIN, pois estamos retornando dados de duas tabelas: Pedidos e Clientes. O
resultado final para a string ComandoSQL o seguinte:
SELECT Pedidos.NmeroDoPedido, Clientes.NomeDaEmpresa, Pedidos.CidadeDeDestino,
Pedidos.PasDeDestino
FROM Clientes
INNER JOIN Pedidos
ON
Clientes.CdigoDoCliente = Pedidos.CdigoDoCliente
ORDER BY Pedidos.NmeroDoPedido;
Observe que estamos utilizando a nomenclatura NomeDoCampo.NomeDaTabela. Esta nomenclatura necessria quando
estamos acessando dados de duas ou mais tabelas. Com esta nomenclatura indicamos de qual tabela determinado campo
deve ser acessado. Esta nomenclatura particularmente til, para situaes em que o mesmo nome de campo existe em
duas ou mais tabelas. Por exemplo, o campo CdigoDoCliente existe tanto na tabela Pedidos quanto na tabela Clientes.
Vamos entender o procedimento Page_Load: Este evento, conforme j descrito
anteriormente, executado toda vez que a pgina for carregada. Quando a pgina
for carregada pela primeira vez, a propriedade Page.IsPostBack igual a False
e, neste caso, a varivel OrdenaPor def inida como sendo igual a
NmeroDoPedido e o contedo do controle DigitaCriterio definido como a.
Fora da estrutura if/else, chamado o procedimento BuscaDados( ), ou seja, este
procedimento ser chamado sempre que a pgina for carregada, independente de ser um
PostBack ou no.
Vamos entender o procedimento BuscaDados( ): Grande parte do cdigo deste procedimento j de nosso
conhecimento. So comandos para conectar com o banco de dados NorthWind.mdb, executar um comando
SQL e retornar os dados em um objeto DataSet, a partir do qual criamos um objeto DataView. O nico detalhe
adicional que temos neste procedimento a definio da propriedade RowFilter, do objeto source, que um
objeto do tipo DataView:
source.RowFilter=FiltraDados;
Neste momento o objeto DataView filtrado de acordo com a expresso de filtragem contida na String FiltraDados.
O funcionamento do procedimento OrdenaDados o mesmo do exemplo da Listagem 11.7. Para maiores
detalhes sobre o funcionamento deste procedimento, consulte os comentrios para o exemplo da
Listagem 11.7.
NOTA: Maiores
informaes sobre a
linguagem SQL podem ser
encontradas no Anexo III.
456 www.juliobattisti.com.br
ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB
O Controle DataGrid em Detalhes
Nos exemplos que utilizamos at o momento, definimos a propriedade DataSource de um controle DataGrid como
sendo um objeto DataView e chamamos o mtodo DataBind do DataGrid. Isso faz com que seja gerado um DataGrid
com tantas colunas quantos forem os campos do objeto DataView, sendo que as colunas do DataGrid so geradas
automaticamente.
Podemos ter controle sobre a maneira como as colunas de um DataGrid so geradas. Por exemplo, podemos definir
diferentes aspectos visuais para cada coluna, diferentes tipos, etc. Cada coluna de um DataGrid um controle de um
dos seguintes tipos:
BoundColumn
ButtonColumn
EditCommandColumn
HyperLinkColumn
TemplateColumn
Por padro a propriedade AutoGenerateColumns definida em True, o que faz com que as colunas do DataGrid sejam
geradas, automaticamente, e sejam do tipo BoundColumn. Para cada campo da fonte de dados, quer seja um objeto
DataView ou um objeto DataReader, ser gerada uma coluna do tipo BoundColumn, na ordem em que os campos
aparecem na fonte de dados.
A primeira coluna gerada exibir os dados do campo NmeroDoPedido; a segunda exibir os dados do campo
CidadeDeDestino e assim por diante.
Para controlar, manualmente, quais colunas faro parte do DataGrid e qual o formato
das colunas, devemos definir a propriedade AutoGenerateColumns=False. Uma vez
definida esta propriedade como False, podemos adicionar as colunas desejadas. Para
controlar a aparncia de cada coluna, definimos uma srie de propriedades para cada
coluna.
Alm de definir cada coluna manualmente, tambm podemos definir as caractersticas
da primeira linha do DataGrid, normalmente a linha de ttulos; dos itens de cada linha;
dos itens de cada linha quando em modo de edio e da ltima linha do DataGrid. Estes
elementos so definidos dentro de uma coluna do tipo TemplateColumn.
A seguir temos a sintaxe completa para o controle DataGrid, quando definimos as colunas
do mesmo manualmente:
<asp:DataGrid
id=identificao_no_cdigo
runat=server
NOTA: A ordem em que
os campos aparecem em
uma fonte de dados
definida pelo comando
SQL. Considere o seguinte
comando: Select
NmeroDoPedido,
CidadeDeDestino,
PasDeDestino From
Pedidos.
457
CAPTULO 11: ACESSANDO BANCOS DE DADOS COM ASP.NET PARTE 2
www.juliobattisti.com.br
DataSource=<%# Fonte de dados. %>
AutoGenerateColumns=False
(outras propriedades)
>
<AlternatingItemStyle property=value/>
<EditItemStyle property=value/>
<FooterStyle property=value/>
<HeaderStyle property=value/>
<ItemStyle property=value/>
<PagerStyle property=value/>
<SelectedItemStyle property=value/>
<Columns>
<asp:BoundColumn
DataField=DataSourceField
DataFormatString=FormatString
FooterText=FooterText
HeaderImageUrl=url
HeaderText=HeaderText
ReadOnly=True|False
SortField=DataSourceFieldToSortBy
Visible=True|False
FooterStyle-property=value
HeaderStyle-property=value
ItemStyle-property=value/>
<asp:ButtonColumn
ButtonType=LinkButton|PushButton
Command=BubbleText
DataTextField=DataSourceField
DataTextFormatString=FormatString
FooterText=FooterText
HeaderImageUrl=url
HeaderText=HeaderText
ReadOnly=True|False
SortField=DataSourceFieldToSortBy
458 www.juliobattisti.com.br
ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB
Text=ButtonCaption
Visible=True|False/>
<asp:EditCommandColumn
ButtonType=LinkButton|PushButton
CancelText=CancelButtonCaption
EditText=EditButtonCaption
FooterText=FooterText
HeaderImageUrl=url
HeaderText=HeaderText
ReadOnly=True|False
SortField=DataSourceFieldToSortBy
UpdateText=UpdateButtonCaption
Visible=True|False/>
<asp:HyperLinkColumn
DataNavigateUrlField=DataSourceField
DataNavigateUrlFormatString=FormatExpression
DataTextField=DataSourceField
DataTextFormatString=FormatExpression
FooterText=FooterText
HeaderImageUrl=url
HeaderText=HeaderText
NavigateUrl=url
ReadOnly=True|False
SortField=DataSourceFieldToSortBy
Target=window
Text=HyperLinkText
Visible=True|False/>
<asp:TemplateColumn
FooterText=FooterText
HeaderImageUrl=url
HeaderText=HeaderText
ReadOnly=True|False
SortField=DataSourceFieldToSortBy
Visible=True|False>
459
CAPTULO 11: ACESSANDO BANCOS DE DADOS COM ASP.NET PARTE 2
www.juliobattisti.com.br
<HeaderTemplate>
Header template HTML
</HeaderTemplate >
<ItemTemplate>
ItemTemplate HTML
</ItemTemplate>
<EditItemTemplate>
EditItem template HTML
</EditItemTemplate>
<FooterTemplate>
Footer template HTML
</FooterTemplate>
</asp:TemplateColumn>
</Columns>
</asp:DataGrid>
Uma vez definida a propriedade AutoGenerateColumns para False, podemos definir manualmente as colunas. Isto
feito entre as tags <Columns> </Columns>. Conforme citado anteriormente, temos diferentes tipos de colunas, tipos
estes que esto descritos na Tabela 11.3.
Tabela 11.3 Tipos de colunas para o controle DataGrid.
Tipo Descrio
BoundColumn uma coluna associada com um campo da fonte de dados (um objeto DataView ou
DataReader). Podemos controlar os aspectos visuais utilizando as diversas propriedades
da coluna. o tipo de coluna padro, isto , se optarmos pela gerao automtica de
colunas (AutoGenerateColumns=True), ser gerada uma coluna do tipo BoundColumn
para cada campo da fonte de dados.
ButtonColumn Cria uma coluna com botes de comando. Podemos definir o texto dos botes utilizando a
propriedade Text ou podemos fazer o DataBind da coluna com uma fonte de dados, de tal
maneira que o rtulo do boto de comando seja diferente para cada linha do DataGrid.
HyperLinkColumn Cria uma coluna com links que so associados com um campo da fonte de dados. Por
exemplo, uma coluna que exibe o nomedos funcionrios pode ter o nome como um link.
Ao clicarmos no Link ser aberta uma pgina com todas as informaes do funcionrio.
460 www.juliobattisti.com.br
ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB
As colunas de um DataGrid, adicionadas manualmente, fazem parte da coleo Columns. A ordem em que as colunas
so exibidas no DataGrid, da esquerda para a direita, definida pela ordem em que as colunas esto definidas na
coleo Columns. Podemos alterar esta ordem, utilizando programao.
Um Exemplo de Criao Manual de Colunas BoundColumn
Cada tipo de coluna tem uma srie de propriedades que podemos utilizar para controlar
os aspectos visuais, funcionais e de formatao da coluna. Vamos apresentar um exemplo
onde criamos manualmente as colunas de um DataGrid, utilizando colunas do tipo
BoundColumn. Utilizaremos algumas propriedades para definir as caractersticas de
cada coluna, e depois estudaremos mais detalhes sobre as propriedades disponveis.
Na Listagem 11.9 temos o cdigo para o exemplo proposto.
Listagem 11.9 Criando colunas manualmente em um DataGrid.
<%@ Import Namespace=System.Data %>
<%@ Import Namespace=System.Data.SqlClient %>
<html>
<script language=C# runat=server>
void BuscaDados()
{
// Crio uma conexo com o banco de dados pubs localizado no servidor local.
// Vamos acessar a instncia SERVIDOR\NETSDK.
SqlConnection myConnection = new
SqlConnection(server=SERVIDOR\\NETSDK;
+ uid=sa;pwd=;database=pubs);
// Conectamos com o banco de dados utilizando um comando SQL,
// o qual retorna todos os dados da tabela Authors, do banco de
// dados pubs, do SQL Server 2000 SERVIDOR\NETSDK.
Tipo Descrio
EditCommandColumn Cria uma coluna onde podemos definir os comandos para Edio (Update), incluso (Add)
ou excluso (Remove) de registros.
TemplateColumn Utilizada para definir o layout dos controles que compem o DataGrid, a partir de
modelos para determinados elementos do HTML. Veremos exemplos mais adiante.
NOTA: possvel utilizar
uma mescla entre colunas
geradas automaticamente
e colunas definidas
manualmente. Quando
isto acontece as colunas
criadas manualmente so
processadas em primeiro
lugar. As colunas geradas
automaticamente no
faro parte da coleo
Columns.
461
CAPTULO 11: ACESSANDO BANCOS DE DADOS COM ASP.NET PARTE 2
www.juliobattisti.com.br
SqlDataAdapter myCommand = new SqlDataAdapter(SELECT +
au_id,au_fname,phone FROM Authors Order By au_fname, myConnection);
// Criamos e preenchemos um objeto DataSet.
DataSet ds = new DataSet();
myCommand.Fill(ds);
// Conectamos um controle DataGrid com o DataSet criado anteriormente.
// MinhaGrade o id (nome) de um controle do tipo
// DataGrid que est na seo de apresentao da pgina.
DataView source = new DataView(ds.Tables[0]);
MinhaGrade.DataSource = source ;
MinhaGrade.DataBind();
}
void Page_Load(Object sender, EventArgs e)
{
BuscaDados();
}
</script>
<body>
<form runat=server>
<h3><font face=Verdana>Criando colunas manualmente.</font></h3>
<HR>
<H4>Observe que temos diferentes formataes para cada coluna>/H4>
<b>Product List</b>
<asp:DataGrid
id=MinhaGrade
BorderColor=black
BorderWidth=1"
CellPadding=3"
AutoGenerateColumns=false
runat=server>
<HeaderStyle
462 www.juliobattisti.com.br
ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB
BackColor=#00aaaa
Font-Bold=True
Font-Name=Courier New
ForeColor=White
>
</HeaderStyle>
<Columns>
<asp:BoundColumn
HeaderText=Cdigo
DataField=au_id
ItemStyle-BackColor=#c0c0c0"
>
</asp:BoundColumn>
<asp:BoundColumn
HeaderText=Nome
DataField=au_fname
ItemStyle-Font-Italic=True
ItemStyle-Font-Name=Courier New
>
</asp:BoundColumn>
<asp:BoundColumn
HeaderText=Telefone
DataField=phone
ItemStyle-BackColor=#c0ffff
ItemStyle-Font-Bold=True
>
</asp:BoundColumn>
</Columns>
</asp:DataGrid>
</form>
</body>
</html>
463
CAPTULO 11: ACESSANDO BANCOS DE DADOS COM ASP.NET PARTE 2
www.juliobattisti.com.br
Digite o cdigo da Listagem 11.9 e salve o mesmo em um arquivo chamado chap11ex9aspx, na pasta chap11, dentro
da pasta wwwroot, conforme descrito no item: Check List para acompanhar os exemplos deste livro, no Captulo 6.
Para acessar esta pgina utilize o seguinte endereo: http://localhost/chap10/chap11ex9aspx
Ser exibida uma listagem com o cdigo, nome e telefone dos autores, da tabela authors, do Banco de dados pubs,
conforme indicado na Figura 11.11.
Figura 11.11: Colunas com diferentes formataes.
Observe que as colunas apresentam diferentes formataes.
Comentrios sobre o cdigo do exemplo Chap11ex8.aspx:
Em primeiro lugar observe que aplicamos diversas formataes diferentes s diversas partes do controle
DataGrid.
1. Para a primeira linha dos ttulos das colunas, aplicamos as seguintes formataes: Negrito, fonte Courier New e
cor Branca.
2. Para a primeira coluna aplicamos cor cinza para o segundo plano.
3. Para a segunda coluna aplicamos uma fonte Courier New e Itlico.
4. Para a terceira coluna aplicamos negrito e uma tonalidade de verde para a cor de segundo plano.
464 www.juliobattisti.com.br
ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB
Para criar as colunas manualmente, em primeiro lugar definimos a propriedade AutoGenerateColumns do
DataGrid como False:
AutoGenerateColumns=False
A definio das colunas feita dentro das tags <Columns> </Columns>. Neste exemplo utilizamos apenas colunas do
tipo BoundColumn.
1. A primeira coluna exibe dados do campo au_id:
<asp:BoundColumn
HeaderText=Cdigo
DataField=au_id
ItemStyle-BackColor=#c0c0c0"
>
</asp:BoundColumn>
A propriedade HeaderText define o ttulo da coluna.
A propriedade DataField define com qual campo do objeto DataView a coluna ligada. Como definimos esta
propriedade com au_id, esta coluna ir exibir o cdigo do autor. Esta propriedade que faz a ligao da coluna com
um campo da fonte de dados.
A propriedade ItemStyle-BackColor define a cor de segundo plano.
2. A segunda coluna exibe dados do campo au_fname:
<asp:BoundColumn
HeaderText=Nome
DataField=au_fname
ItemStyle-Font-Italic=True
ItemStyle-Font-Name=Courier New
>
</asp:BoundColumn>
A propriedade HeaderText define o ttulo da coluna.
A propriedade DataField liga a coluna com o campo au_fname da fonte de dados. Esta coluna exibe o primeiro nome
do autor.
A propriedade ItemStyle-Font-Italic define Itlico para a fonte.
A propriedade ItemStyle-Font-Name define o tipo de fonte a ser utilizado. Poderamos ter utilizado Arial, Times New
Roman, etc.
3. A terceira coluna exibe dados do campo phone:
465
CAPTULO 11: ACESSANDO BANCOS DE DADOS COM ASP.NET PARTE 2
www.juliobattisti.com.br
<asp:BoundColumn
HeaderText=Telefone
DataField=phone
ItemStyle-BackColor=#c0ffff
ItemStyle-Font-Bold=True
>
</asp:BoundColumn>
A propriedade HeaderText define o ttulo da coluna.
A propriedade DataField liga a coluna com o campo phone da fonte de dados.
A propriedade ItemStyle-Font-Bold define Negrito para a fonte.
Tambm inclumos um elemento HeaderStyle. Este elemento define a formatao para a linha de ttulos das
colunas. Definimos negrito (Font-Bold=True), fonte CourierNew (Font-Name=Courier New) e cor de
fonte branca (ForeColor=White).
Observe que as formataes para o elemento HeaderStyle so diferentes das formataes para o elemento BoundColumn.
Por exemplo, no elemento BoundColumn, utilizamos ItemStyle-Font-PropriedadeDaFonte, para definir uma caracterstica
da fonte. Por exemplo, utilizamos ItemStyle-Font-Bold=True, para definir Negrito. J no elemento HeaderStyle utilizamos
apenas Font-PropriedadeDaFonte. Por exemplo, utilizamos Font-Bold=True, para definir Negrito.
<HeaderStyle
BackColor=#00aaaa
Font-Bold=True
Font-Name=Courier New
ForeColor=White
>
</HeaderStyle>
Na seo de cdigo da pgina, simplesmente estabelecemos uma conexo com
o servidor SQL Server e utilizamos um objeto Data Repeater para executar um
comando SQL que preenche um objeto DataSet. A partir do objeto DataSet
criamos um objeto DataView, objeto este que associado com o DataGrid.
Criamos um procedimento BuscaDados( ), o qual chamado toda vez que a
pgina carregada Page_Load.
Implementando Paginao com o Controle DataGrid
No Captulo 10 descrevemos o conceito de paginao e vimos que, para habilitar a
paginao, devemos definir a propriedade AllowPaging como True. Neste tpico veremos
NOTA: Ainda no estudamos
todos os detalhes do controle
DataGrid. No prximo tpico,
veremos como implementar a
paginao, utilizando um
controle DataGrid. No Captulo
12 aprenderemos a utilizar o
controle DataGrid para Editar,
Alterar e Excluir dados.
466 www.juliobattisti.com.br
ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB
como fazer com que a paginao funcione, ou seja, quando o usurio clica no link Prxima Pgina ou no nmero da
prxima pgina, faremos com que seja exibido o prximo conjunto de registros.
Ao tornarmos a propriedade AllowPaging igual a True, ser criada mais uma linha, no final do DataGrid. Nesta linha
podemos exibir um link para a prxima pgina e para a pgina anterior ou a numerao de pgina: 1 2 3 4 5 6 7 8 9 10
...; onde cada nmero um link para a pgina respectiva. Podemos personalizar o que exibido nesta linha que
chamaremos de Barra de Navegao. Por padro os links de navegao so alinhados esquerda, no DataGrid.
Cada vez que o usurio clica em um dos links da Barra de Navegao, disparado o evento PageIndexChanged. Ao
criarmos o DataGrid definimos a propriedade PageIndexChanged com o nome do procedimento que ser executado
em resposta ao evento. Neste procedimento colocaremos o cdigo para navegar para a pgina relacionada ao link
clicado pelo usurio.
Em resumo, para fazer paginao com o DataGrid, devemos fazer o seguinte:
Definir a propriedade AllowPaging como True.
Definir o nome do procedimento que ser executado em resposta ao evento PageIndexChanged.
Criar o cdigo do procedimento que executa em resposta ao evento OnIndexChanged.
Para definir as caractersticas da linha onde so exibidos os links de navegao, ns fazemos uso das propriedades
PagerStyle-Definio, do controle DataGrid. Por exemplo, para alinhar os links de navegao direita, ns definimos
a seguinte propriedade:
PagerStyle-HorizontalAlign=Right
Na Tabela 11.4 temos a definio das principais caractersticas da Barra de Navegao, que podem ser configuradas
com a propriedade PagerStyle.
Tabela 11.4 Configuraes da propriedade PagerStyle.
Propriedade Utilizada para definir
PagerStyle-BackColor A cor de segundo plano.
PagerStyle-BorderColor A cor das bordas.
PagerStyle-BorderWidth O tamanho das bordas.
PagerStyle-Font Caractersticas da fonte (Negrito, Itlico, etc.).
PagerStyle-ForeColor A cor da fonte.
PagerStyle-Mode Define se sero exibidos links Prximo e Anterior, ou se um link para o nmero de
cada pgina. O valor padro NextPrev, o que faz com que sejam exibidos os botes
Prximo e Anterior. Se definirmos o valor desta propriedade como NumericPages,
sero exibidos links para o nmero de cada pgina.
PagerStyle-NextPageText O texto para o link que navega para a prxima pgina.
467
CAPTULO 11: ACESSANDO BANCOS DE DADOS COM ASP.NET PARTE 2
www.juliobattisti.com.br
Para definir o nmero de linhas por pgina, utilizamos a propriedade PageSize. Por exemplo, o seguinte comando
define que sejam exibidos quinze registros por pgina:
PageSize=15
amos apresentar um exemplo.
Exemplo: Vamos criar um exemplo, onde retornamos o nome de todos os clientes da tabela Clientes, do Banco de
dados Northwind.mdb. Dividiremos os registros em pginas de dez registros. Utilizaremos o modo padro, onde
exibido um link Prxima Pgina ->> (com exceo da ltima pgina, quando este link estar desabilitado) e um link
<<- Pgina Anterior (com exceo da primeira pgina, quando este link estar desabilitado). Utilizaremos algumas
propriedades da Tabela 11.4 para personalizar a aparncia da Barra de Navegao.
Na Listagem 11.10 temos o cdigo para o exemplo proposto.
Listagem 11.10 Paginao com o controle DataGrid.
<%@ Import Namespace=System.Data %>
<%@ Import Namespace=System.Data.OleDb %>
<html>
<script language=C# runat=server>
void Page_Load(Object Src, EventArgs E )
{
if (!Page.IsPostBack)
{
MinhaGrade.CurrentPageIndex = 0;
BuscaDados();
}
}
void BuscaDados()
{
Propriedade Utilizada para definir
PagerStyle-PrevPageText O texto para o link que navega para a pgina anterior.
PagerStyle-Position Define a posio da Barra de Navegao. Pode ser Bottom barra no final do DataGrid,
que o valor padro, Top barra no incio do DataGrid ou TopAndBottom barra no
incio e no final do DataGrid.
468 www.juliobattisti.com.br
ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB
// Crio uma conexo com o banco de dados do Microsoft Access.
// C:\Meus documentos\NorthWind.mdb.
String DefineConexo= PROVIDER=MICROSOFT.JET.OLEDB.4.0; +
DATA SOURCE=c:\\meus documentos\\NorthWind.mdb;
OleDbConnection MinhaConexo = new OleDbConnection(DefineConexo);
// Utilizamos um objeto DataAdapter para executar um comando SQL,
// o qual retorna as cidades da Alemanha.
String aux1SQL;
String aux2SQL;
String ComandoSQL;
aux1SQL= SELECT CdigoDoCliente,NomeDaEmpresa,Cidade,Pas,Telefone ;
aux2SQL= FROM Clientes Order By CdigoDoCliente;
ComandoSQL= aux1SQL + aux2SQL;
OleDbDataAdapter MeuComando = new OleDbDataAdapter(ComandoSQL, MinhaConexo);
// Criamos e preenchemos um objeto DataSet.
DataSet ds = new DataSet();
// Utilizo o mtodo Fill do objeto DataAdapter, para preencher
// o objeto DataSet, com os dados retornados pelo comando SQL.
MeuComando.Fill(ds);
// Criamos um objeto DataView ligado com a primeira
// tabela, da coleo de tabelas, do objeto ds.
DataView source = new DataView(ds.Tables[0]);
// Ligo o objeto DataView a um controle do tipo
469
CAPTULO 11: ACESSANDO BANCOS DE DADOS COM ASP.NET PARTE 2
www.juliobattisti.com.br
// DataGrid - MinhaGrade.
MinhaGrade.DataSource = source;
MinhaGrade.DataBind();
}
// Procedimento que faz a navegao para a prxima pgina
// ou para a pgina anterior, dependendo do link clicado
// pelo usurio.
void TrocaPagina(Object sender, DataGridPageChangedEventArgs e)
{
MinhaGrade.CurrentPageIndex=e.NewPageIndex;
BuscaDados();
}
</script>
<body>
<h3><font face=Verdana>Paginao com ASP.NET!!!</font></h3>
<form runat=server>
<HR>
<ASP:DataGrid
id=MinhaGrade
runat=server
CellPadding=3
CellSpacing=0"
Font-Name=CourierNew
Font-Size=10pt
HeaderStyle-BackColor=#aaaadd
MaintainState=false
AllowPaging=True
OnPageIndexChanged=TrocaPagina
PageSize=10"
PagerStyle-Position=TopAndBottom
PagerStyle-NextPageText=Prxima Pgina ->>
470 www.juliobattisti.com.br
ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB
PagerStyle-PrevPageText=<<- Pgina Anterior
PagerStyle-Font-Bold=True
PagerStyle-Font-Size=12pt
PagerStyle-BackColor=#c0c0c0"
/>
<HR>
</form>
</body>
</html>
Digite o cdigo da Listagem 11.10 e salve o mesmo em um arquivo chamado chap11ex10aspx, na pasta chap11,
dentro da pasta wwwroot, conforme descrito no item: Check List para acompanhar os exemplos deste livro,
no Captulo 6.
Para acessar esta pgina utilize o seguinte endereo: http://localhost/chap10/chap11ex10aspx
Ser exibida uma listagem com os 10 primeiros clientes. Observe que temos links para a prxima pgina e para a
pgina anterior, no incio e no final do DataGrid, conforme indicado na Figura 11.12.
Figura 11.12: Listagem de Clientes dividida em pginas.
471
CAPTULO 11: ACESSANDO BANCOS DE DADOS COM ASP.NET PARTE 2
www.juliobattisti.com.br
Clique no link Prxima Pgina ->> e observe que so exibidos os prximos dez clientes. Tambm observe que o link
<<- Pgina Anterior foi habilitado, conforme indicado na Figura 11.13.
Figura 11.13: Navegando com o controle DataGrid.
Comentrios sobre o cdigo do exemplo Chap11ex8.aspx:
Na definio do DataGrid utilizamos uma srie de propriedades para a definio dos aspectos visuais da barra
de navegao. Estas propriedades esto descritas na Tabela 11.4. Uma propriedade interessante a propriedade
Mode, que por padro tem o valor NextPrev. Se alterarmos o seu valor para NumericPages, ao invs do link
Prximo e do link Anterior, teremos diversos links, um para cada pgina do DataGrid. Vamos alterar a definio
do DataGrid, para que a mesma fique da seguinte maneira:
<ASP:DataGrid
id=MinhaGrade
runat=server
CellPadding=3
CellSpacing=0"
Font-Name=CourierNew
Font-Size=10pt
HeaderStyle-BackColor=#aaaadd
MaintainState=false
472 www.juliobattisti.com.br
ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB
AllowPaging=True
OnPageIndexChanged=TrocaPagina
PageSize=10"
PagerStyle-Position=TopAndBottom
PagerStyle-Mode=NumericPages
PagerStyle-Font-Bold=True
PagerStyle-Font-Size=12pt
PagerStyle-BackColor=#c0c0c0"
/>
Se fizermos estas alteraes e recarregarmos a pgina, obteremos o resultado indicado na Figura 11.14.
Figura 11.14: PagerStyle-Mode=NumericPages.
No evento Page_Load detectamos se no um PostBack (isto acontece quando a pgina est senda carregada
pela primeira vez); caso no seja um PostBack, definimos a pgina atual como sendo a primeira pgina e
executamos o procedimento BuscaDados:
MinhaGrade.CurrentPageIndex = 0;
BuscaDados();
A definio da pgina atual feita com o uso da propriedade CurrentPageIndex, do DataGrid. A primeira pgina a
pgina zero, a segunda a pgina um e assim por diante.
473
CAPTULO 11: ACESSANDO BANCOS DE DADOS COM ASP.NET PARTE 2
www.juliobattisti.com.br
O procedimento BuscaDados idntico ao utilizado em exemplos anteriores e, portanto, dispensa maiores
comentrios.
O procedimento TrocaPagina definido na propriedade OnPageIndexChanged, do DataGrid:
OnPageIndexChanged=TrocaPagina
O evento OnPageIndexChanged disparado toda vez que o usurio clica em um dos links de navegao. O procedimento
TrocaPagina recebe um argumento do tipo DataGridPageChangedEventArgs. Chamamos este argumento de e. Este
argumento uma instncia da classe DataGridPageChangedEventArgs, do namespace System.Web.UI.WebControls.
Quando clicamos em um dos links de navegao, o ndice da pgina para a qual aponta o link pode ser acessado
atravs da NewPageIndex deste argumento. Atribumos o valor contido nesta propriedade para a propriedade
CurrentPageIndex do DataGrid. O efeito prtico carregar a pgina do DataGrid, cujo ndice o mesmo definido na
propriedade NewPageIndex.
Observe que, simplesmente, com a definio de uma propriedade e um procedimento de duas linhas,
implementamos paginao no ASP.NET, o que com ASP 3.0 demandaria uma boa quantidade de cdigo.
Concluso
Iniciamos o captulo apresentando o conceito de DataBinding e aprendendo a utilizar os seguintes Web Server Controls:
CheckBoxList
DropDownList
RadioButtonList
Em seguida comeamos a estudar mais alguns detalhes sobre o controle DataGrid. Aprendemos as seguintes operaes:
Filtrar dados.
Criar as colunas do DataGrid manualmente.
Fazer paginao.
No Captulo 12 continuaremos trabalhando com o acesso a Banco de dados. Aprenderemos a criar pginas ASP.NET
que permitem a edio, excluso e incluso de registros no Banco de dados. Aprenderemos a utilizar mais algumas
classes dos namespaces System.Data, System.Data.SqlClient e System.Data.OleDb.
Como no poderia deixar de ser, aprenderemos a realizar mais algumas operaes e a utilizar mais algumas opes do
controle DataGrid.
474 www.juliobattisti.com.br
ASP.NET: UMA REVOLUO NA CONSTRUO DE SITES E APLICAES WEB
Introduo
Nos captulos 10 e 11 aprendemos a acessar dados do Microsoft Access e do SQL
Server 2000. Utilizamos diversas classes do ADO.NET para fazer o acesso aos
dados. Comentamos que com ASP.NET temos um modelo desconectado, ou
seja, retornamos uma ou mais tabelas atravs de um objeto DataSet e encerramos
a conexo com o banco de dados.
Nos exemplos vistos at o momento apenas exibimos, pesquisamos e classificamos
os dados obtidos. Neste captulo aprende