Вы находитесь на странице: 1из 168

Apostila de C# e ASP.

Net

1 de 168

Apostila de C# & Asp.Net

Apostila de C# e ASP.Net
.Net Framework
Tpicos: Microsoft .NET CLR Common Language Runtime Metadata Assemblies Linguagens habilitadas ao .NET Common Type System eb Ser!ices A"#.NET

2 de 168

Microsoft .NET
Microsoft .NET $comumente conhecido por .NET %rame&or' em ingl(s dotNet) * uma iniciati!a da empresa Microsoft+ ,ue !isa uma plataforma -nica para desen!ol!imento e e.ecu/0o de sistemas e aplica/1es. Todo e ,ual,uer c2digo gerado para .NET+ pode ser e.ecutado em ,ual,uer dispositi!o ,ue possua um frame&or' de tal plataforma. Com id*ia semelhante 3 plataforma 4a!a+ o programador dei.a de escre!er c2digo para um sistema ou dispositi!o espec5fico+ e passa a escre!er para a plataforma .NET. A plataforma .NET * e.ecutada sobre uma Common Language Runtime 6 CLR $Ambiente de E.ecu/0o 7ndependente de Linguagem) interagindo com um Con8unto de 9ibliotecas :nificadas $frame&or'). Esta CLR * capa; de e.ecutar+ atualmente+ mais de <= diferentes linguagens de programa/0o+ interagindo entre si como se fossem uma -nica linguagem. Estas s0o> A?L 9oo Clarion C#9#L Component ?ascal C@ CAA "elphi Eiffel %orth %ortran Bas'ell 4a!a 4Script 4@ Lua Mercury Mondrian #beron #b8ect ?ascal C "elphi Language #; ?ascal ?erl ?o&er9uilder ?o&erShell ?ython R?D Ruby Scheme SmallTal' Standard ML Eisual 9asic

Esta plataforma permite a e.ecu/0o+ constru/0o e desen!ol!imento de eb Ser!ices $Aplica/1es eb) de forma integrada e unificada. A plataforma .NET baseia6se em um dos princ5pios utili;ados na tecnologia 4a!a $$4ust 7n Time Compiler 6 47T)+ os programas desen!ol!idos para ela s0o duplo6compilados $compilados duas !e;es)+ uma na distribui/0o $gerando um c2digo ,ue * conhecido como FbytecodesF) e outra na e.ecu/0o. :m programa * escrito em ,ual,uer das mais de !inte linguagens de programa/0o dispon5!eis para a plataforma+ o c2digo fonte gerado pelo programador * ent0o compilado pela linguagem escolhida gerando um c2digo intermediGrio em uma linguagem chamada MS7L $Microsoft 7ntermediate Language). Este no!o c2digo fonte gera um ar,ui!o na linguagem de bai.o n5!el Assembly+ de acordo com o tipo de pro8eto> EHE 6 Ar,ui!os E.ecutG!eis+ ?rogramas "LL 6 9iblioteca de Classes AS?H 6 ?Ggina ASMH 6 eb eb Ser!ice

Apostila de C# e ASP.Net

3 de 168

No momento da e.ecu/0o do programa ele * no!amente compilado+ desta !e; pelo compilador 47T+ de acordo com a utili;a/0o do programa+ por e.emplo> Temos um eb Site desen!ol!ido em AS?.NET+ ao entrar pela primeira !e; em uma pGgina o 47T irG compila6la+ nas outras !e;es ,ue algum outro usuGrio acessar esta pGgina+ ele usarG esta compila/0o. Tamb*m * poss5!el+ atra!*s de ferramentas espec5ficas+ Fpr*6compilarF o c2digo para ,ue n0o se tenha o custo da compila/0o 47T durante a e.ecu/0o. # fato desta ar,uitetura utili;ar a MS7L gera uma possibilidade pouco dese8ada entre os criadores de soft&are ,ue * a de fa;er a Fengenharia re!ersaF+ ou se8a+ a partir de um c2digo compilado+ recuperar o c2digo original. 7sto n0o * uma ideia agradG!el para as empresas ,ue sobre!i!em da !enda de soft&ares produ;idos nesta plataforma. ?or causa disso+ e.istem ferramentas ,ue FofuscamF o c2digo MS7L+ trocando nomes de !ariG!eis+ m*todos+ interfaces e etc para dificultar o trabalho de ,uem tentar uma engenharia re!ersa no mesmo.

CL !Commo" La"#$a#e

$"time%

# CLR * um ambiente de e.ecu/0o+ e poder5amos at* di;er ,ue * o ICora/0o do .NETJ+ o ,ual dG suporte a todas as linguagens de programa/0o habilitadas para o .NET. # Runtime $ambiente de e.ecu/0o) * o ambiente ,ue dG suporte 3 e.ecu/0o das aplica/1es .NET. Kuando um programa .NET * e.ecutado+ todo o controle do mesmo * feito atra!*s do CLR. ?ara aplica/1es anteriores+ desen!ol!idas utili;ando C#MCC#MA+ o programador era responsG!el por inserir no c2digo do programa uma s*rie de fun/1es necessGrias ao correto funcionamento do mesmo+ como por e.emplo o Derenciamento de mem2ria+ cria/0o e destrui/0o de ob8etos. A codifica/0o destas fun/1es n0o era uma tarefa fGcil+ o ,ue e.igia muito tempo do programador+ al*m de conhecimentos a!an/ados. Com aplica/1es .NET+ todas estas fun/1es s0o e.ecutadas pelo CLR+ ou se8a+ o programador n0o precisa preocupar6se com as mesmas. "esta forma somente precisamos nos preocupar com a funcionalidade do nosso programa+ o ,ue poupa tempo e agili;a o processo de desen!ol!imento. As aplica/1es criadas em uma das linguagens habilitadas para o .NET $como E9.NET+ C@ ou AS?.NET)+ ao serem compiladas+ geram um c2digo intermediGrio conhecido como MS7L Microsoft 7ntermediate Language+ o ,ual * abre!iado simplesmente como 7L 7ntermediate Language. Este c2digo * ,ue * e.ecutado pelo CRL. Eamos analisar o diagrama apresentado na abai.o>

CTS!Commo" T&pe S&stem%


# %rame&or' .NET disponibili;a+ na forma de ob8etos+ um con8unto de tipos de dados comuns+ os ,uais podem ser utili;ados por todas as linguagens habilitadas ao .NET. 7sso significa ,ue uma !ariG!el do tipo 7nt terG a mesma estrutura e ocuparG o mesmo n-mero de bytes+ ,uer se8a no C@+ no E9.NET+ no CAA ou em ,ual,uer outra linguagem habilitada ao .NET. Este con8unto de tipos comuns+ ,ue pode ser utili;ado por ,ual,uer linguagem+ * chamado de Common Type System+ ,ue a partir de agora abre!iaremos por CTS. "entre outras coisas+ * o CTS ,ue facilita a integra/0o entre os programas e ser!i/os criados+ utili;ando6se de diferentes linguagens do .NET. No modelo antigo+ uma das dificuldades de fa;er com ,ue um Componente C#MA criado com o Eisual CAA pudesse ser utili;ado por um programa escrito em Eisual 9asic * ,ue as linguagens possu5am um diferente con8unto de tipos bGsicos. ?ara ,ue os componentes+ escritos em diferentes linguagens+ pudessem se comunicar+ o programador tinha ,ue mapear os tipos de uma linguagem+ para os tipos correspondentes em outra linguagem+ fa;endo as con!ers1es necessGrias.

Apostila de C# e ASP.Net

4 de 168

Ee8am o ,uanto este procedimento * trabalhoso. Com o CTS do .NET simplesmente esta preocupa/0o n0o e.iste+ uma !e; ,ue todas as linguagens t(m acesso a um con8unto de tipos comum a todas elas. Conforme descrito na documenta/0o do %rame&or' .NET+ s0o as seguintes as principais fun/1es do CTS> %ornece uma estrutura ,ue possibilita a integra/0o entre diferentes linguagens habilitadas ao .NET+ com uma e.ecu/0o mais rGpida+ uma !e; ,ue a sobrecarga para a con!ers0o entre os diferentes tipos de diferentes linguagens dei.a de e.istir. %ornece uma estrutura de tipos com base em um modelo orientado a ob8etos+ o ,ue facilita a cria/0o de no!as linguagens habilitadas ao .NET+ fa!orecendo a utili;a/0o de boas prGticas de programa/0o+ como por e.emplo a heran/a. :ma !e; ,ue os tipos s0o ob8etos+ podemos criar tipos deri!ados dos ob8etos bGsicos+ os ,uais herdam todas as caracter5sticas dos ob8etos bGsicos. # CTS define algumas regras ,ue toda linguagem de!e seguir+ para ser habilitada ao .NET. ?or seguirem um con8unto de regras comum+ a intera/0o entre programas escritos em diferentes linguagens fica bem mais fGcil.

CLS !Commo" La"#$a#e Specificatio"%


# CLS+ ou Especifica/0o Comum da Linguagem+ * um subcon8unto do CTS+ e de6fine um con8unto de regras ,ue ,ual,uer linguagem ,ue implemente a .NET de!e seguir a fim de ,ue o c2digo gerado resultante da compila/0o de ,ual,uer pe/a de soft&are escrita na referida linguagem se8a perfeitamente entendido pelo runtime .NET. Seguir essas regras * um imperati!o por,ue+ caso contrGrio+ um dos grandes ganhos do .NET+ ,ue * a independ(ncia da linguagem de programa/0o e a sua interoperabilidade+ fica comprometido. A grosso modo+ di;er ,ue uma linguagem * compat5!el com o CLS significa di;er ,ue mesmo ,uando esta * sintaticamente diferente de ,ual,uer outra ,ue implemente .NET+ semanticamente ela * igual+ por,ue na hora da compila/0o serG gerado um c2digo intermediGrio $e n0o c2digo assembly dependente da ar,uitetura do processador) e,ui!alente para duas pe/as de c2digo iguais+ por*m escritas em linguagens diferentes. L importante entender esse conceito para n0o pensar ,ue o c2digo desen!ol!ido em C@ n0o pode interagir com c2digo desen!ol!ido em E9 ou outras linguagens+ por,ue mesmo estas sendo diferentes+ to6das s0o compat5!eis com o CLS.

MS'L !Microsoft '"termediate La"#$a#e%


A MS7L ou simplesmente 7L * a linguagem intermediGria para ,ual * interpretado ,ual,uer programa .NET+ independente da linguagem em ,ue este for escrito. Essa tradu/0o * feita para c2digo intermediGrio $como em 4AEA com os byte codes) sintaticamente e.presso na 7L. ?or sua !e;+,ual,uer linguagem .NET compat5!el+ na hora da compila/0o+ gerarG c2digo 7L e n0o c2digo assembly espec5fico da ar,uitetura do processador onde a compila/0o do programa * efetua6 da+ conforme aconteceria em CAA ou "elphi+ por e.emplo. E por ,ue issoM 7sso acontece para garantir duas coisas> a independ(ncia da linguagem e a independ(ncia da plataforma $ar,uitetura do processador). Ar,uitetura .NET A MS7L * a linguagem intermediGria para ,ual * interpretado ,ual,uer pro6 grama .NET na hora da compila/0o+ independente da linguagem em ,ue este for escrito.

Metadata
Ao registrarmos um componente C#MCC#MA+ uma s*rie de informa/1es sobre o mesmo s0o gra!adas na Registry do sistema. Estas informa/1es s0o utili;adas pelos programas ,ue precisam acessar o componente. Se alguma destas informa/1es esti!er errada ou ti!er sido alterada+ o componente n0o poderG ser acessado e os programas ,ue utili;am o componente dei.ar0o de funcionar corretamente. No %rame&or' .NET+ para utili;armos os componentes .NET $.NET Componentes)+ n0o * necessGrio ,ue os mesmos se8am registrados. # pr2prio componente .NET possui todas as informa/1es necessGrias ao seu funcionamento+ bem como as informa/1es necessGrias para ,ue outros aplicati!os possam utili;G6los. Estas informa/1es+ ,ue fa;em parte do pr2prio componente .NET ficam gra!adas no ar,ui!o ,ue comp1e componente+ na forma de Metadata. :ma tradu/0o Ipopularmente conhecidaJ para Metadata seria> dados sobre dados. No nosso caso+ Metadata seriam as informa/1es ,ue o componente .NET possui a respeito de si mesmo+ informa/1es estas ,ue podem ser utili;adas por outros componentes e ser!i/os+ para acessar o componente em ,uest0o. Al*m de fa;er com ,ue n0o se8a necessGrio o registro do componente+ as informa/1es de Metadata facilitam a interoperabilidade entre diferentes componentes+ mesmo entre componentes escritos em diferentes linguagens. Estas informa/1es s0o geradas+ automaticamente+ no momento da compila/0o do componente e s0o gra!adas no ar,ui!o ."LL ou .EHE do componente. S0o muitas as informa/1es ,ue podem ser inseridas no componente+ na forma de Metadata+ tais como>

Apostila de C# e ASP.Net

5 de 168

Nome e !ers0o do componente. :ma cha!e p-blica para !erifica/0o da origem e da autenticidade do componente. 7nforma/1es sobre todas as classes ou componentes+ dos ,uais o componente depende para funcionar. Tipos disponibili;ados $e.portados) pelo componente. ?ermiss1es de seguran/a para o acesso ao componente+ seus m*todos e propriedades. Classes bGsicas e interfaces do %rame&or' .NET+ utili;adas pelo componente. Atributos personali;ados+ implementados no componente. Membros do componente $m*todos+ campos+ propriedades+ e!entos+ etc).

Kuando o componente * acessado+ o CLR carrega os metadados do componente na mem2ria e fa; refer(ncia a estes metadados+ para obter informa/1es sobre as classes+ membros+ heran/a e depend(ncias do componente. S0o di!ersos os benef5cios do uso de metadados+ dentre os ,uais podemos destacar os seguintes> M2dulos de c2digo auto descriti!os> # pr2prio componente cont*m toda a informa/0o necessGria para interagir com outros componentes. "esta forma o componente pode ser implementado como um -nico ar,ui!o+ o ,ual cont*m a sua defini/0o $na forma de metadados) e a sua implementa/0o+ o c2digo do componente. Nunca * demais repetir> A utili;a/0o de metadados facilita+ enormemente+ a interoperabilidade entre componentes criados usando diferentes linguagens.

Assem(lies
:ma aplica/0o .NET * constitu5da de um con8unto de IblocosJ chamados Assembly. Atra!*s dos Assemblies * ,ue podemos controlar a distribui/0o de uma aplica/0o+ fa;er o controle de !ers1es+ al*m de definir as configura/1es de seguran/a. :m assembly * uma cole/0o de tipos e recursos ,ue foram constru5dos para trabalharem 8untos+ formando+ com isso+ uma unidade com funcionalidade e escopos bem definidos. :m assembly fornece ao CLR importantes informa/1es sobre a implementa/0o de tipos da aplica/0o. ?ara o CLR+ um tipo somente e.iste no conte.to de um assembly. "e uma maneira mais simples+ poder5amos di;er ,ue um assembly * o mecanismo utili;ado pelo .NET+ para IempacotarJ todos os elementos e informa/1es necessGrias ao funcionamento de uma aplica/0o ou componente. Eamos simplificar mais ainda> o assembly * uma maneira de 8untar e organi;ar os di!ersos elementos ,ue formam uma aplica/0o ou componente. #s assemblies foram criados para simplificar a distribui/0o de aplica/1es e resol!er o problema de I!ers1esJ+ e.istentes em aplica/1es baseadas em componentes. Com este termo estG!amos nos referindo ao problema de um programa+ ao ser instalado+ substituir uma "LL por uma !ers0o mais no!a ou mais antiga+ fa;endo com ,ue programas ,ue dependiam da !ers0o anterior da "LL dei.assem de funcionar. Atra!*s do uso de assemblies e dos metadados contidos em cada componente+ * poss5!el ,ue diferentes !ers1es+ do mesmo componente+ este8am dispon5!eis+ ao mesmo tempo+ em um computador. "esta forma+ cada programa utili;a a !ers0o do componente para o ,ual o programa foi criado. Ao instalarmos uma no!a !ers0o do componente+ o ,ual !em embutido em um assembly+ as !ers1es anteriores ser0o mantidas+ se as mesmas esti!erem sendo utili;ados por outros programas. 7sso fa; com ,ue o inferno das "LLs $"LL Bell) se8a coisa do passado. ?ara resol!er o problema de !ers1es e e!itar o inferno das "LLs+ o CLR utili;a assemblies da seguinte maneira> ?ermite ,ue o desen!ol!edor defina regras sobre o uso de diferentes !ers1es entre diferentes componentes .NET. %ornece a infraestrutura necessGria para ,ue as regras de !ers0o definidas pelo desen!ol!edor se8am respeitadas. %ornece a infraestrutura necessGria+ para ,ue diferentes !ers1es de um mesmo componente de soft&are possam rodar+ simultaneamente. Esta e.ecu/0o simultNnea * conhecida como Isyde6by6syde e.ecution.J :m assembly * composto de dois elementos bGsicos> Manifesto. :m con8unto de m2dulos.

Apostila de C# e ASP.Net
)C !)ar(a#e Collector% * Coletor de Li+o , )ere"ciame"to da Memria

6 de 168

# gerenciamento da mem2ria * efetuado pelo runtime+ permitindo ,ue o desen!ol!edor se concentre na resolu/0o do seu problema espec5fico. # ,ue di; respeito ao sistema operacional+ como o gerenciamento da mem2ria+ * feito pelo runtime. Como isso * efetuadoM O medida ,ue uma Grea de mem2ria * necessGria para alocar um ob8eto+ o DC ou coletor de li.o $Darbage Collector) reali;arG essa tarefa+ assim como a libera/0o de espa/os de mem2ria ,ue n0o esti!erem mais em uso. ?ara os ,ue n0o trabalham com linguagens de programa/0o como C ou CAA+ ,ue permitem o acesso direto 3 mem2ria heap !ia ponteiros+ essa * uma das maiores dores de cabe/a ,ue os programadores sofrem+ ora por fa;er refer(ncia a espa/os de mem2ria ,ue n0o foram alocados+ ora por,ue estes espa/os 8G foram liberados anteriormenteP * e.atamente esse tipo de erro ,ue o coletor de li.o nos a8uda a e!itar. # gerenciamento da mem2ria+ ,uando efetuado diretamente pelo programador+ torna os programas mais eficientes em termos de desempenho+ mas ao mesmo tempo o penali;a+ obrigando6o a alocar e desalocar mem2ria ,uando assim * re,uerido. A .NET permite ,ue o programador fa/a esse gerenciamento tamb*m+ o ,ue * chamado de Iunsafe codeJ $c2digo n0o seguro)P entretanto+ por default+ o DC * o encarregado dessa tarefa+ e o contrGrio n0o * recomendado.

Apostila de C# e ASP.Net
A li"#$a#em C#
A estrutura bGsica de uma aplica/0o C@ # pe,ueno trecho de c2digo a seguir implementa o clGssico programa I#lG mundoJ> using SystemP class Bello orld Q static !oid Main$ ) Q CC escre!endo no console Console. riteLine$FBello orld RRRF)P Console.ReadLine$ )P S S - Ca(e.al/o do pro#rama

7 de 168

A primeira linha do nosso programa+ ,ue escre!e no console I#lG mundo em C@J+ cont*m a informa/0o do namespace System+ ,ue cont*m as classes primiti!as necessGrias para ter acesso ao console do ambiente .NET. ?ara incluir um namespace em C@+ utili;amos a clGusula using seguida do nome do namespace. A declara.0o de $ma classe # C@ re,uer ,ue toda a l2gica do programa este8a contida em classes. Ap2s a declara/0o da classe usando a pala!ra reser!ada class+ temos o seu respecti!o identificador. ?ara ,uem n0o estG familiari;ado com o conceito de classe+ apenas adiantamos ,ue uma classe * um tipo abstrato de dados ,ue no paradigma de programa/0o orientada a ob8etos * usado para representar ob8etos do mundo real. No e.emplo acima+ temos uma classe ,ue cont*m apenas o m*todo Main$ ) e n0o recebe nenhum parNmetro. - M1todo Mai"! % Todo programa C@ de!e ter uma classe ,ue defina o m*todo Main$ )+ ,ue de!e ser declarado como estGtico usando o modificador static+ ,ue di; ao runtime ,ue o m*todo pode ser chamado sem ,ue a classe se8a instanciada. L atra!*s desse modificador ,ue o runtime sabe ,ual serG o ponto de entrada do programa no ambiente inT<+ para poder passar o controle ao runtime .NET. # IMJ mai-sculo do m*todo Main * obrigat2rio+ e seu !alor de retorno !oid significa ,ue o m*todo n0o retorna nenhum !alor ,uando * chamado. Al#$mas 2aria"tes do m1todo Mai"! % CC Main recebe parNmetros na linha de comando !ia o array CC args static !oid Main$stringU V args) Q CC corpo do m*todo S CC Main tem como !alor de retorno um tipo int static int Main$ ) Q CC corpo do m*todo S A forma do m*todo Main$ ) a ser usada !ai depender dos seguintes fatores> # programa !ai receber parNmetros na linha de comandoM Ent0o esses parNmetros ser0o arma;enados no array args. Kuando o programa * finali;ado+ * necessGrio retornar algum !alor ao sistemaM Ent0o o !alor de retorno serG do tipo int.

Apostila de C# e ASP.Net

8 de 168

:m programa escrito em C@ pode ter mais de uma classe ,ue implementa o m*todo Main$ ). Nesse caso+ de!erG ser especificado em tempo de compila/0o em ,ual classe se encontra o m*todo Main$ )+ ,ue de!erG ser chamado pelo runtime ,uando a aplica/0o for e.ecutada. E.emplo> using SystemP class classW Q static !oid Main$ ) Q Console. riteLine$FM*todo Main$ ) da classe WF)P S S class class< Q static !oid Main$ ) Q Console. riteLine$FM*todo Main$ ) da classe <F)P S S Al#$"s 3ltimos detal/es adicio"ais 9locos de c2digo s0o agrupados entre cha!es Q S. Cada linha de c2digo * separada por ponto6e6!5rgula. #s comentGrios de linha simples come/am com duas barrasCC. ComentGrios em bloco s0o feitos usando os terminadores CX $de in5cio) e XC $de fim). CX Este * um comentGrio de bloco Segue o mesmo estilo de CCCAA XC # C@ * sens5!el ao conte.to+ portanto int e 7NT s0o duas coisas diferentes. int * uma pala!ra reser!ada ,ue * um alias do tipo System.7ntT<. 7NT poderia ser um identificador+ entretanto n0o * recomendado usar como identificadores de !ariG!eis o nome de um tipo ou pala!ra reser!ada como no e.emplo citado. Sempre declare uma classe onde todos os aspectos inerentes 3 iniciali;a/0o da aplica/0o ser0o implementados+ e ob!iamente+ ,ue conterG o m*todo Main$ ) tamb*m. No decorrer deste li!ro seguiremos fielmente essa regra nos nossos e.emplos.

Apostila de C# e ASP.Net
Pala2ras reser2adas em C#
abstract as base bool brea' byte case catch char chec'ed class const continue decimal default delegate do double else enum e!ent e.plicit e.tern false finally fi.ed float for foreach goto if implicit in int interface internal is loc' long namespace ne& null ob8ect operator out o!erride params pri!ate protected public readonly ref return sbyte sealed short si;eof stac'alloc static string struct s&itch this thro& true try typeof uint ulong unchec'ed unsafe ushort using !irtual !olatile !oid &hile

9 de 168

Formata"do a sa4da padr0o


A formata/0o da sa5da padr0o * feita usando os chamados Icaracteres de escapeJ $!e8a a tabela abai.o). Ee8amos um e.emplo> CC Yt Z TA9 CC Yn Z ,uebra de linha e retorno de carro $CR L%) Console. riteLine$ F!arW> Q=S Yt !ar<> QWSYt !arT> Q<SYnF+ !arW+ !ar<+ !arT)P Caractere de Escape Si#"ificado Yn 7nsere uma no!a linha Yt TA9 Ya "ispara o som de um alarme sonoro simples Yb Apaga o caractere anterior da string ,ue estG sendo escrita no Yr 7nsere um retorno de carro Y= Caractere N:LL $nulo)

console$bac'space)

ece(e"do par5metros "a li"/a de coma"do


?ara receber parNmetros na linha de comando+ ou se8a+ na chamada de um programa ,uando digitamos o nome do e.ecutG!el no prompt da linha de comando do "#S $como IScan"is' CAll CAuto%i.J+ por e.emplo)+ o m*todo Main$ ) precisa ser declarado da seguinte forma> CC n0o retorna nenhum !alor ao sistema static !oid Main$stringU V args) ou+ CC retorna um !alor do tipo int ao sistema static int Main$stringU V args)

Apostila de C# e ASP.Net

10 de 168

# parNmetro args * um array de strings ,ue recebe os parNmetros passados ,uando a aplica/0o * chamada na linha de comando. A seguir mostramos uma das formas da !arrer os parNmetros recebidos> foreach $string cmd in args) Q int i Z =P Console. riteLine$F?ar Q=S> QWSF+ i+ cmd)P iAAP S ?ara saber o n-mero de argumentos ,ue foram passados+ usamos o m*todo Length$ ) do array args da seguinte forma> numArgs Z args.Length$ )P Kuando na linha de comando s0o recebidos parNmetros num*ricos+ estes de!em ser con!ertidos de string para o tipo num*rico respecti!o usando a classe Con!ert. E.emplo> Con!ert.To7ntT<$!arString)

6ari72eis
S0o utili;adas para arma;enar dados na mem2ria do computador. Em C@+ todas as !ariG!eis s0o declaradas dentro do escopo de uma classe e podem ser dos seguintes tipos> Locais> s0o declaradas no escopo de um m*todo+ inde.ador ou e!ento e n0o possuem modificadores de acesso. A sua declara/0o se limita ao tipo seguido do identificador da !ariG!el. Atributos de uma classe ou campos da classe> a !ariG!el * declarada como membro de uma classe. A declara/0o de!e ser efetuada como se segue> UModificador de acessoV Utipo atributoV [tipo da !ariG!el\ [identificador\ E.emplo> public class App Q public int !ar7ntP static !oid Main$ ) Q int !arLocalP S S

- Sistema de Tipos em C#
Em C@+ todo tipo * deri!ado da classe System.#b8ect+ ,ue constitui o n-cleo do sistema de tipos de C@. Entretanto+ os pro8etistas da linguagem+ e n0o apenas da linguagem+ mas de .NET como um todo+ sabem perfeitamente das implica/1es de ter um sistema de tipos onde tudo * um ob8eto> ,ueda de desempenho. ?ara resol!er este problema+ eles organi;aram o sistema de tipos de duas formas> Tipos Ealor> !ariG!eis deste tipo s0o alocadas na pilha e t(m como classe base System.EalueType+ ,ue por sua !e; deri!a de System.#b8ect. Tipos Refer(ncia> !ariG!eis deste tipo s0o alocadas na mem2ria heap e t(m a classe System.#b8ect como classe base.

Apostila de C# e ASP.Net

11 de 168

Apostila de C# e ASP.Net
8o+i"# e 9"8o+i"#

12 de 168

A ra;0o de se criar uma origem comum de tipos * para facilitar a intera/0o entre tipos !alor e refer(ncia. # processo de con!ers0o e.pl5cita de um tipo !alor para um tipo refer(ncia * conhecido em C@ como 9o.ing $encai.otar). # processo contrGrio a 9o.ing * conhecido como :nbo.ing. Nesse caso+ o compilador !erifica se o tipo !alor a receber o conte-do do tipo refer(ncia * e,ui!alente a este -ltimo. No processo de 9o.ing+ o ,ue de fato estG ocorrendo * ,ue um no!o ob8eto estG sendo alocado na mem2ria heap e o conte-do da !ariG!el de tipo !alor * copiado para a Grea de mem2ria referenciada por esse ob8eto. E.emplo> int intNumero Z W=P CC %a; o bo.ing para o tipo referencia. #b8ect ob8Numero Z intNumeroP CC %a; o unbo.ing para o tipo !alor int intEalor Z $int)ob8NumeroP Kuando essa opera/0o * efetuada entre tipos ,ue n0o s0o e,ui!alentes+ uma e.ce/0o * gerada pelo runtime.

Tipos 6alor
Tipos !alor n0o podem ser usados como classes base para criar no!os tipos por ,ue estes s0o implementados usando classes chamadas IseladasJ+ a partir das ,uais n0o * poss5!el implementar o mecanismo de heran/a. Antes de serem usados+ os tipos !alor de!em ser iniciali;ados+ caso contrGrio o compilador acusarG um erro. #s tipos !alor s0o subdi!ididos em duas categorias> W. Estruturas <. Enumerados

Estr$t$ras
Estruturas s0o usadas para implementar tipos simples chamados de primiti!os em outras linguagens de programa/0o+ s0o criadas na pilha e ainda oferecem muito do potencial de uma classe a um custo menor. #s seguintes tipos s0o implementados usando estruturas>

Tipos primiti2os
Num*ricos> inteiros+ ponto flutuante e decimal 9ooleanos> !erdadeiro e falso Tipos definidos pelo usuGrio> estruturas propriamente ditas ,ue permitem ,ue o usuGrio crie seus pr2prios tipos.

E"$merados
S0o usados para implementar listas de !alores constantes+ os ,uais podem ser de ,ual,uer tipo inteiro $long+ int etc.)P por*m n0o podem ser do tipo char. Cada constante tem um !alor inteiro associado+ o ,ual pode ser sobrescrito ,uando assim definido na lista enumerada. #s !alores inteiros associados a cada constante da lista enumerada come/am a partir de ;ero.

Tipos
class ob8ect string delegate interface

efer:"cia

#s seguintes tipos refer(ncia fa;em parte do namespace System e deri!am diretamente do System.#b8ect>

Apostila de C# e ASP.Net
Stri"#s

13 de 168

# tipo string representa uma se,](ncia de caracteres :nicode. string * um alias para System.String no. NET %rame&or'. string a Z FhelloFP string b Z FhFP # operador A concatena strings> string a Z F9om F A FdiaFP # UV operador acessa caracteres indi!iduais de uma string> char . Z FtesteFU<VP CC . Z ^s^P # arroba $_) e!ita ,ue se,](ncia de escape se8am processadas> _Fc>Y"ocsYSourceYa.t.tF CC o mesmo ,ue Fc>YY"ocsYYSourceYYa.t.tF

-peradores
-peradores aritm1ticos Em C@ temos os seguintes operadores aritm*ticos> -perador ;escri.0o A 6 X C ` $Adi/0o) $Subtra/0o) $Multiplica/0o) $"i!is0o) $RestoCM2dulo)

-peradores de atri($i.0o Em C@ temos os seguintes operadores de atribui/0o> -perador ;escri.0o Z AZ 6Z XZ CZ `Z $Atribui/0o simples) $Atribui/0o aditi!a) $Atribui/0o Subtrati!a) $Atribui/0o Multiplicati!a) $Atribui/0o de di!is0o) $Atribui/0o de m2dulo)

-peradores relacio"ais Em C@ temos os seguintes operadores relacionais>

Apostila de C# e ASP.Net
-perador ;escri.0o ZZ \ [ [Z \Z RZ $7gualdade) $Maior) $Menor) $Menor igual) $Maior igual) $"iferente)

14 de 168

-peradores l#icos Em C@ temos os seguintes operadores l2gicos> -perador ;escri.0o aa bb $E) $#:)

Apostila de C# e ASP.Net
'"str$.<es de Co"trole

15 de 168

:ma instru/0o de controle * usada para controlar o flu.o de e.ecu/0o do programa baseando6se em uma condi/0o !erdadeira ou falsa. '"str$.0o if A declara/0o if seleciona uma declara/0o para a e.ecu/0o com base no !alor de uma e.press0o 9ooleana. No e.emplo a seguir um flag flagChec' 9ooleano * definido como !erdadeiro e+ em seguida+ !erificado no caso declara/0o. bool flagChec' Z trueP if $flagChec' ZZ true) Q Console. riteLine$F# flag * !erdadeiro.F)P S else Q Console. riteLine$F# flag * falso.F)P S E+erc4cio: using SystemP class Teste7fElse Q static !oid Main$) Q Console. riteLine$F"igite um dos seguintes n-meros> W+ <+ T+ cF)P int a Z 7ntT<.?arse$Console.ReadLine$))P string mensagem Z FEariG!el a igual> FP if $aZZW) Q Console. riteLine$mensagem A a)P S else if $a ZZ <) Q Console. riteLine$mensagem A a)P S else if $a ZZ T) Q Console. riteLine$mensagem A a)P S else Q Console. riteLine$mensagem A a)P S Console.Read$)P S S

Apostila de C# e ASP.Net
'"str$.0o switc/

16 de 168

# s&itch * uma declara/0o de controle ,ue trata m-ltiplas sele/1es e enumera/1es passando por um controle para um dos casos dentro do seu corpo como o seguinte e.emplo> int caseS&itch Z WP s&itch $caseS&itch) Q case W> Console. riteLine$FCase WF)P brea'P case <> Console. riteLine$FCase <F)P brea'P default> Console. riteLine$F"efault caseF)P brea'P S E+erc4cio using SystemP class Testes&itch Q static !oid Main$) Q Console. riteLine$F"igite um dos seguintes n-meros> W+ <+ T+ c+ dF)P int a Z 7ntT<.?arse$Console.ReadLine$))P string mensagem Z FEariG!el a igual> FP s&itch $a) Q case W> Console. riteLine$mensagem A FWF)P brea'P case <> Console. riteLine$mensagem A F<F)P brea'P case T> goto case WP case c> case d> Console. riteLine$mensagem A a)P brea'P default> Console. riteLine$mensagem A a)P brea'P S Console.Read$)P S S

Apostila de C# e ASP.Net
'"str$.<es de 'tera.0o

17 de 168

As instru/1es de itera/0o permitem repetir um determino trecho do algoritmo de acordo com uma condi/0o $itera/0o condicional) ou de acordo com um n-mero de !e;es fi.o $itera/0o definida). '"str$.0o for # loop for e.ecuta uma instru/0o ou um bloco de instru/1es repetidamente at* ,ue uma e.press0o especificada * a!aliada como false. # loop for * -til para iterar em matri;es e para processamento se,]encial. E+emplo: class %orLoopTest Q static !oid Main$) Q for $int i Z WP i [Z dP iAA) Q Console. riteLine$i)P S S S CX #utput> W < ... d XC

E+erc4cio using SystemP class foraninhado Q static !oid Main$) Q for $int i Z WP i [Z W=PiAA ) Q for $int 8 Z WP 8 [Z W=P8AA ) Q Console. riteLine$8.ToString$))P S Console. riteLine$i.ToString$))P S Console.Read$)P S S

Apostila de C# e ASP.Net
'"str$.0o w/ile

18 de 168

A instru/0o &hile e.ecuta uma instru/0o ou um 9lo,uear de instru/1es at* ,ue uma e.press0o especificada * a!aliada como false. class hileTest Q static !oid Main$) Q int n Z WP &hile $n [ d) Q Console. riteLine$FCurrent !alue of n is Q=SF+ n)P nAAP S S S CX #utput> Current !alue Current !alue Current !alue Current !alue XC '"str$.0o do .. w/ile # la/o do..&hile $fa/a..en,uanto) * usado ,uando ,ueremos repetir uma instru/0o ou bloco de instru/1es ENK:ANT# uma condi/0o for satisfat2ria. A -nica diferen/a entre este la/o e o la/o &hile+ * ,ue+ no la/o do..&hile a condi/0o de parada * testada ap2s a itera/0o+ o ,ue garante ,ue o la/o do..&hile serG e.ecutado no m5nimo uma !e;. No la/o &hile a condi/0o * testada antes da itera/0o. public class Test"o hile Q public static !oid Main $) Q int . Z =P do Q Console. riteLine$.)P .AAP S &hile $. [ d)P S S CX #utput> = W < T c XC of of of of n n n n is is is is W < T c

Apostila de C# e ASP.Net
'"str$.0o for eac/

19 de 168

Esta instru/0o fornece uma maneira simples e limpa para iterar Atra!*s os elementos de uma matri;. Atra!*s e.emplo+ o c2digo a seguir cria uma matri; chamada numbers e itera6lo com a instru/0o foreach> CC cseforeach.cs class %orEachTest Q static !oid Main$stringUV args) Q intUV fibarray Z ne& intUV Q =+ W+ <+ T+ d+ f+ WT SP foreach $int i in fibarray) Q System.Console. riteLine$i)P S S S = W < T d f WT

(reak # comando brea' * usado para a sa5da de la/os $ &hile+ for + s&itch+ etc..) . E.emplo> using SystemP class 9rea'Test Q public static !oid Main$) Q for $int i Z WP i [Z W==P iAA) Q if $i ZZ d) brea'P Console. riteLine$i)P S S S Sa4da W < T c

Apostila de C# e ASP.Net
Co"ti"$e

20 de 168

# comando continue tamb*m * usado em la/os$&hile+ for+ etc.) ,uando em e.ecu/0o o comando continue irG mo!er a e.ecu/0o para o pr2.ima itera/0o no la/o sem e.ecutar as linhas de c2digo depois de continue. E+emplo: using SystemP class ContinueTest Q public static !oid Main$) Q for $int i Z WP i [Z W=P iAA) Q if $i [ g) continueP Console. riteLine$i)P S S S Sa4da g W=

Apostila de C# e ASP.Net
Pro#rama.0o -rie"tada a -(=etos

21 de 168

:ma !e; ,ue o %rame&or' .NET * fortemente baseado em conceitos de orienta/0o a ob8etos+ tamb*m a linguagem C@ ,ue utili;aremos nesta apostila para a cria/0o de pGginas AS?.NET * baseada nos conceitos de orienta/0o a ob8etosP * bastante oportuno ,ue re!isemos os seguintes conceitos>

# ,ue * um ob8etoM # ,ue s0o ClassesM M*todos e propriedades Beran/a ?olimorfismo e %un/1es Eirtuais Encapsulamento e Eisibilidade

Todo o %rame&or' .NET foi criado com base nos conceitos de #rienta/0o a #b8etos. A linguagem C@ * totalmente orientada a ob8etos+ onde tudo s0o classes. Claro ,ue alguns IpuristasJ poderiam di;er ,ue o C@ n0o * completamente orientado a ob8etos por,ue n0o suporta heran/a m-ltipla. Na !erdade !eremos ,ue o C@ foi pro8etado para conciliar os benef5cios da orienta/0o a ob8etos e ao mesmo tempo ser simples e prGtico. ?ara isso foram eliminadas algumas caracter5sticas da orienta/0o a ob8etos+ caracter5sticas estas ,ue mais causa!am problemas do ,ue propriamente forneciam solu/1es.

-(=eto
:m ob8eto * uma entidade ,ue cont*m+ al*m dos dados+ todas as fun/1es $m*todos) ,ue atuam sobre estes dados. #u se8a+ um ob8eto * composto dos dados ,ue descre!em o ob8eto $propriedades) e das opera/1es ,ue podem ser reali;adas sobre estes dados $m*todos). Esta abordagem 8G * um pouco mais pr2.ima da abordagem entendida pelos usuGrios finais do sistema. Eamos imaginar um sistema para uma Escola de N5!el M*dio. #s usuGrios falam em termos de alunos+ s*ries+ etc. ?oder5amos ter um ob8eto chamado Alunos. Este ob8eto poderia conter di!ersas propriedades+ tais como> Matr5cula. Nome. Endere/o. "ata de Entrada. Nome do ?ai. Nome da M0e. N-mero da 7dentidade. N-mero do C?%. Com isso podemos obser!ar ,ue as propriedades descre!em as caracter5sticas de um determinado ob8eto. # con8unto de !alores contidos nas propriedades de um determinado ob8eto define o seu estado atual. Al*m das propriedades o ob8eto pode conter m*todos. #s m*todos descre!em a/1es ,ue podem ser reali;adas pelo ob8eto ou no ob8eto. ?or e.emplo+ o nosso ob8eto Alunos poderia ter um m*todo chamado Recebimento+ outro chamado transfer(ncia+ mais um chamado ?romo/0o e assim por diante. :m m*todo+ na prGtica+ * uma fun/0o ou procedimento ,ue reali;a uma s*rie de a/1es. #s m*todos de um ob8eto podem receber parNmetros e ter o seu comportamento alterado+ dependendo do !alor dos parNmetros. ?or e.emplo+ o m*todo ?romo/0o de um ob8eto Alunos pode receber+ como parNmetros+ a Matr5cula do Aluno+ a data da promo/0o e o c2digo do no!o curso em ,ue aluno estarG cursando. "entro do m*todo ?romo/0o pode ser chamado um m*todo Atuali;a?agamento+ o ,ual atuali;a o !alor das mensalidades dos alunos+ de acordo com a no!a s*rie ,ue o mesmo irG cursar.

Apostila de C# e ASP.Net
Classes

22 de 168

Se pes,uisarmos a bibliografia sobre orienta/0o a ob8etos encontraremos um mundo de defini/1es para classes. Eamos inicialmente apresentar algumas das defini/1es formais encontradas na bibliografia. "epois !amos a uma+ digamos+ e.plica/0o mais fGcil> W) Classes constituem modelos ,ue s0o utili;ados para a cria/0o de ob8etos. Nas classes s0o descritas a estrutura de dados $atra!*s das propriedades) e o comportamento $atra!*s de seus m*todos) de um ou mais ob8etos similares ,ue possuem seus dados estruturados da mesma forma e s0o manipulados pelos mesmos m*todos. <) :m ob8eto * uma instNncia de uma classe ,ue * criada em tempo de e.ecu/0o. Classes s0o puramente uma descri/0o estGtica de um con8unto de poss5!eis ob8etos. Na prGtica+ o ,ue significa+ por e.emplo+ termos uma classe chamada AlunosM Esta classe ser!e como modelo para a cria/0o de ob8etos do tipo Aluno. Na classe Alunos est0o as defini/1es das propriedades e dos m*todos para um ob8eto Aluno. #u se8a+ sempre ,ue criarmos um ob8eto do tipo Aluno+ o mesmo serG criado com todas as propriedades e m*todos da classe Alunos. IClasse * uma forma para fa;er ob8etosJ. $?ensamento de um ?rogramador Doogle.) Drande parte da funcionalidade do %rame&or' .NET * fornecida por um grande n-mero de classes+ as ,uais fa;em parte de I.NET %rame&or' Class LibraryJ+ 8G descrita anteriormente. # %rame&or' .NET agrupa as classes de acordo com suas funcionalidades. :m agrupamento de classes criadas para um determinado fim * tamb*m conhecido como um namespace $espa/o de nomes). ?or e.emplo+ temos o namespace System."ata. "entro deste namespace e.istem !Grias classes ,ue fornecem os m*todos necessGrios para a cone.0o e manipula/0o de fontes !ariadas de dados. E.istem classes para a cone.0o com o SKL Ser!er <===+ outras para a cone.0o com fontes #"9C e assim por diante. A biblioteca de classes do %rame&or' .NET * organi;ada de uma forma hierGr,uica+ onde as classes de n5!eis inferiores herdam todas as caracter5sticas da classe m0e. %alaremos mais sobre heran/a no pr2.imo item.

E+emplo: ;eclara"do classes


class ClasseTeste Q CC M*todos+ propriedades+ campos e e!entos S ?ara criar uma instNncia> Tipo Refer(ncia Z ne& Tipo$)P No nosso e.emplo> ClasseTeste teste Z ne& ClasseTeste$)P ?odemos criar uma refer(ncia sem criar um ob8eto> Tipo Refer(nciaP ClasseTeste testeP

Apostila de C# e ASP.Net
Modificadores Para os Mem(ros de $ma Classe

23 de 168

Conforme descrito anteriormente e.istem modificadores ,ue definem a !isibilidade dos membros de uma classe. ?or e.emplo+ o modificador public torna o membro acess5!el de fora da classeP 8G o modificador pri!ate torna o membro dispon5!el somente dentro da pr2pria classe. A seguir uma descri/0o dos principais modificadores.

p$(lic> Torna o membro acess5!el de fora da defini/0o da classe. protected> # membro n0o pode ser acessado fora da classe+ por*m o membro estG dispon5!el para outras classes deri!adas da classe base. pri2ate> # membro n0o pode ser acessado fora da classe+ nem mesmo por outras classes deri!adas da classe base. i"ter"al> # membro somente * !is5!el na unidade de c2digo onde o mesmo estG definido. L um meio6 termo entre public e protected+ uma !e; ,ue o membro pode ser acessado por todas as classes definidas na mesma unidade $p-blico para as classes da mesma unidade)+ por*m n0o pode ser acessado por classes definidas em outras unidades $protected para unidades definidas em outras unidades).

Estr$t$ras !Str$cts%
:m tipo struct * um tipo de !alor normalmente usado para encapsular pe,uenos grupos de !ariG!eis relacionadas+ como as coordenadas de um retNngulo ou as caracter5sticas de um item em um in!entGrio. # e.emplo a seguir mostra uma declara/0o de struct simples> public struct Li!ro Q public decimal precoP public string tituloP public string autorP S As estruturas tamb*m podem conter de construtores constantes de campos + de m*todos de + propriedades+ inde.adores+ de operadores + e!entos e aninhados tipos+ embora se !Grios membros forem necessGrios+ !oc( de!e considerar tornar o tipo de uma classe em !e; disso. As estruturas podem implementar uma interface+ mas elas n0o herdam de outra estrutura. ?or esse moti!o+ struct membros n0o podem ser declarados como protegido.

Apostila de C# e ASP.Net
Cria"do 9ma Classe em C# "o 6is$al St$dio

24 de 168

Eisando e.emplificar a cria/0o de Classes na linguagem C@+ este8a com o ambiente do EisualStudio em e.ecu/0o+ procedendo da seguinte forma> Passo > Acessando o Menu %ile b Ne& b ?ro8ect+ selecione em Templates Class Li(rar&. "esta maneira estamos iniciando um pro8eto para acomodar nosso e.emplo de uso de Classes+ na forma de um Assembly+ ou se8a um aplicati!o .Net $byte Code). ?reencha na cai.a de dialogo representada pela Fi#$ra ?> os campos Name+ Locatio" e Sol$ctio" Name conforme indicado. # campo Name representa o nome da NameSpace ,ue acomodara as Classes do pro8eto de e.emplo+ Locatio" refere6se ao diret2rio onde os fontes do pro8eto ser0o guardados e Sol$ctio" Name o nome do pro8eto em si. ?or fim cli,ue no bot0o -k.

Fi#$ra ?>

Passo @ Como resultado do passo anterior+ teremos na 8anela Soluction E.plorer representada plea Fi#$ra ?@ e.ibindo as Classes do nosso pro8eto+ at* o momento somente a Classe inicial Calss>+ representada pelo ar,ui!o Class>.cs.

Fi#$ra ?@

Apostila de C# e ASP.Net

25 de 168

#utra obser!a/0o+ se refere ao nome da Classe+ a,ui ClassW+ ,ue conforme e.ibido na Lista#em ?>+ promo!eremos imediatamente uma altera/0o para ?roduto. ?roceda como e.ibido nas Fi#$ra ?A e Fi#$ra ?B+ pois desta forma+ n0o s2 o nome da Classe serG alterada+ como o nome do ar,ui!o ,ue a representa na Soluction E.plore tamb*m. Lista#em ?> using SystemP using System.Collections.DenericP using System.Lin,P using System.Te.tP namespace ?ro8etoe##? Q public class ClassW Q S S

Fi#$ra ?A

Fi#$ra ?B

Apostila de C# e ASP.Net
Lista#em ?@ using SystemP using System.Collections.DenericP using System.Lin,P using System.Te.tP namespace ?ro8etoe##? Q public class ?roduto Q S S

26 de 168

# resultado fina pode ser obser!ado na Lista#em ?@ com o nome da Classe 8G alterado para Prod$to.

A,ui !amos nos deter somente no desen!ol!imento da Classe e seus aspectos+ dei.ando as e.plica/1es mais aprofundadas sobre o conceito de NameSpace para o t2pico na se,u(ncia ,ue trata do assunto. Mas para n0o ficarmos no !a;io+ consideremos NameSpace como um agrupamento $l2gico) de Classes. ?ara este e.emplo+ uma refer(ncia para nossa Classe ?roduto+ seria algo como> ?ro8etoe##?.?roduto. Com refer(ncia as ,uatro declara/1es $si"# no in5cio da Lista#em ?@+ s0o refer(ncias as NameSpaces do %rame or' .Net+ ,ue o ambiente do EisualStudio acrescentou 8ulgando -teis no desen!ol!imento do c2digo ,ue se seguirG. Essas e outras NameSpace do %rame or' ser0o necessGrias para ,ue possamos fa;er uso pleno da linguagem C@.

Apostila de C# e ASP.Net
Campos !Fields%

27 de 168

:m campo * uma !ariG!el de ,ual,uer tipo ,ue * declarado diretamente em uma Classe ou Struct. Campos s0o membros da Classe compondo um modelo. UmodificadorV tipo nomeP E+emplo: public class Calendario Q public string dia Z F"omingoFP CC... S

Propriedades !Properties%
Em C@+ uma propriedade * um membro nomeado de uma classe+ struct ou interface oferecendo uma maneira sistemGtica de acessar campos particulares atra!*s do ,ue * chamado o get e set+ ou se8a+ m*todos acessores. E+emplo: class ?essoa Q pri!ate string nomeP public string Nome Q get Q return nomeP S set Q nome Z !alueP S S pri!ate int idadeP public int 7dade Q get Q return idadeP S set Q idade Z !alueP S S S

Co"sta"tes !Co"sta"ts%
A pala!ra6cha!e const * usada para modificar uma declara/0o de um campo ou !ariG!el local. Ela especifica ,ue o !alor do campo ou a !ariG!el local * constante+ o ,ue significa ,ue ele n0o pode ser modificado. E+emplo: public class TesteConstante Q static !oid Main$) Q const int c Z WgfcP Console. riteLine$FMinha constante Z Q=SF+ c)P S S ,, Sa4da: Mi"/a co"sta"te C >DEB

Apostila de C# e ASP.Net
Acresce"ta"do Mem(ros !Fields e Properties% a Classe de E+emplo

28 de 168

Eisando e.emplificar a cria/0o de Classes na linguagem C@+ este8a com o ambiente do EisualStudio em e.ecu/0o+ procedendo da seguinte forma> Passo > Sobre a 8anela Soluction E.plorer do pro8eto ?ro8etoe##?+ cli,ue no n2 ?roduto.cs com o bot0o direito do mouse+ selecionando Eie& Class "iagram conforme %igura =W. Este procedimento cria um m2dulo diagrama permitindo n0o s2 !isuali;ar a Classe ?roduto em forma de componente+ mas acrescentar Membros sem ,ue se8a necessGrio implenta6los manualmente no c2digo fonte.

Fi#$ra ?> # resultado * a representa/0o grGfica da Classe ?roduto conforme imagem da %igura =<.

Fi#$ra ?@

Apostila de C# e ASP.Net
Passo @

29 de 168

Eamos agora definir os campos pri!ados e seus m*todos set get+ p-blicos+ possibilitando leitura e atribui/0o de !alores. Se baseie na %igura =T para acrescentar os campos pri!ados na Classe ?roduto+ clicando com o bot0o direito do mouse sobre a representa/0o da Classe ?roduto no "iagrama.

Fi#$ra ?A Em seguida proceda como obser!ado na %igura =c+ definindo na 8anela Class "etails o tipo long $inteiro longo) para o campo eid.

Fi#$ra ?B

Apostila de C# e ASP.Net

30 de 168

Encerre esta etapa repetindo os passos anteriores para criar os campos edescricao de tipo string e epreco de tipo decimal. A representa/0o grGfica da Classe ?roduto de!erG estar semelhante a %igura =d.

Fi#$ra ?F ?erceba como ficou o c2digo fonte ap2s adicionarmos campos pri!ados em nossa Classe ?roduto+ representado a seguir pela Liatagem =W. Lista#em ?> using SystemP using System.Collections.DenericP using System.Lin,P using System.Te.tP namespace ?ro8etoe##? Q public class ?roduto Q pri2ate lo"# GidH pri2ate stri"# GdescricaoH pri2ate decimal GprecoH S S

Apostila de C# e ASP.Net
Passo A

31 de 168

#b8eti!ando criar os m*todos acessores aos campos pri!ados+ orientando6se pela %igura =h+ selecione indi!idualmente cada membro %ield no "iagrama da Classe ?roduto. ?ara tanto cli,ue com o bot0o direito do mouse sobre o campo edescricao+ escolhendo no menu de conte.to Rafactor b Encapsulate %ield...+ confirmando as etapas na se,u(ncia da %igura =h+ =i e =f.

Fi#$ra ?I

Fi#$ra ?J

Apostila de C# e ASP.Net

32 de 168

Fi#$ra ?E Complete o processo repetindo a etapa para os campos eid e epreco. ?or conse,u(ncia+ teremos a representa/0o grGfica da Classe conforme a imagem da %igura =g e o c2digo fonte implementando os m*todos set e get conforme demonstrado na Listagem =<.

Fi#$ra ?D

Apostila de C# e ASP.Net
Lista#em ?@ public class ?roduto Q pri!ate long eidP public long 7d Q get Q return eidP S set Q eid Z !alueP S S pri!ate string edescricaoP public string "escricao Q get Q return edescricaoP S set Q edescricao Z !alueP S S pri!ate decimal eprecoP public decimal ?reco Q get Q return eprecoP S set Q epreco Z !alueP S S S

33 de 168

Apostila de C# e ASP.Net
Co"str$tores !Co"str$cts% e ;estr$tores !;estr$ctors%

34 de 168

Ao criarmos uma classe podemos definir um m*todo ,ue serG e.ecutado toda !e; ,ue uma instNncia da classe for criada. Este m*todo especial * chamado de Construtor $Constructor) da classe. Colocamos neste m*todo todo o c2digo ,ue de!e ser e.ecutado na cria/0o da classe. ?or e.emplo+ se estamos criando uma classe ,ue possui m*todos para fa;er pes,uisas em um banco de dados do SKL Ser!er <===. No m*todo Construtor podemos incluir o c2digo ,ue estabelece a cone.0o com o banco de dados. ?ara ,ue a classe se8a de uso gen*rico+ podemos definir parNmetros a serem passados para o m*todo Construtor+ de tal forma ,ue a cone.0o se8a estabelecida de acordo com o !alor dos parNmetros passados para o m*todo construtor. Se n0o definirmos um m*todo construtor e.plicitamente+ o %rame&or' .NET define e e.ige um m*todo construtor sem parNmetros. E+emplo: public class Ta.i Q public bool is7nitiali;edP public Ta.i$) Q is7nitiali;ed Z trueP S S class TestTa.i Q static !oid Main$) Q Ta.i t Z ne& Ta.i$)P Console. riteLine$t.is7nitiali;ed)P S S E+erc4cio using SystemP public class Li!ro Q public string tituloP public string autorP public Li!ro$) Q titulo Z FAS?.NET com C@FP autor Z FAlfredo LotarFP S public Li!ro$string tit+string aut) Q titulo Z titP autor Z autP S S

Apostila de C# e ASP.Net
class TesteLi!ro Q static !oid Main$) Q Li!ro l! Z ne& Li!ro$)P Console. riteLine$l!.titulo)P Console. riteLine$l!.autor)P Console.Read$)P S S

35 de 168

?ara chamar um destrutor+ o C@ usa um K !tio% antes do nome do construtor $sem parNmetros). Ao atribuir "$ll a um ob8eto+ o garbage collector n0o * e.ecutado no mesmo momento+ o ,ue significa ,ue o ob8eto continua na mem2ria e o m*todo destrutor n0o * chamado na mesma hora. N0o * poss5!el determinar ,uando o garbage collector * chamado+ portanto * sempre aconselhG!el e!itar o uso de destrutores. E+emplo: class Car Q jCar$) CC destructor Q CC cleanup statements... S S

Apostila de C# e ASP.Net
Acresce"ta"do M1todos Co"str$tores "a Classe de E+emplo

36 de 168

?ara tornarmos nossa Classe IinstanciG!elJ+ ou se8a ser a.cec5!el em um aplicati!o cliente $inclusi!e por outras Classes dentro ou fora da NameSpace)+ de!emos adicionar os m*todos abai.o em nossa Classe de e.emplo. ?articularmente este m*todo construtor n0o implementa nenhuma funcionalidade+ e naturalmente n0o e.ige nenhum parNmetro. public ?roduto$) Q S

Apostila de C# e ASP.Net
Namespaces

37 de 168

A pala!ra6cha!e namespace * usada para declarar um escopo. Este escopo de namespace permite organi;ar o c2digo $Classes) e oferece uma maneira para criar tipos globalmente e.clusi!os. A pala!ra6cha!e using pode ser usada para ,ue o nome completo n0o se8a necessGrio. E+emplo: using SystemP namespace NamespaceSamples Q class Classe?rimeira Q public !oid MetodoTeste$) Q Console. riteLine$F MetodoTeste inside NamespaceSamplesF)P S S S

Partial
L poss5!el di!idir a defini/0o de uma Classe ou uma Struct+ interface ou m*todo em dois ou mais ar,ui!os fonte. Cada ar,ui!o cont*m uma se/0o para defini/0o de tipo ou m*todo+ e todas as partes s0o combinadas ,uando a aplica/0o * compilada. E+emplo: public partial class ?roduto Q pri!ate long eid pri!ate string edescricao pri!ate decimal epreco CCM*todos get e set omitidos S public partial class ?roduto Q public !oid 7ncluir?roduto$) Q CCc2digo omitido S public "ataTable #bter?roduto$long id) Q CCc2digo omitido S S

Apostila de C# e ASP.Net
Altera"do a Classe de E+emplo para S$portar Partial Class

38 de 168

9asicamente de!emos adicionar um outro ar,ui!o $Class)ao pro8eto+ nomeando por e.emplo como ?roduto9L.cs $caracteri;ando a fun/0o de acomodar as Regras de Neg2cio M*todos). Passo > 9uscando adicionar a no!a Classe+ cli,ue com o bot0o direito do mouse sobre o n2 ,ue representa o pro8eto+ em seguida+ no menu de conte.to selecione Add bNe& 7tem. Na se,u(ncia+ 8G com a cai.a de dialogo Add Ne& 7tem e.ibida $%igura =W)+ selecione o Template Class nomeando6o como ?roduto9L.cs.

Fi#$ra ?> Passo @ Repare o resultado do c2digo gerado para a no!a Classe+ obser!ando a Listagem =W. Lista#em ?> using SystemP using System.Collections.DenericP using System.Lin,P using System.Te.tP namespace ?ro8etoe##? Q class ?roduto9L Q S S Passo A Altere a assinatura da classe para ,ue suporte ?artial Class+ conforme trecho em negrito na Listagem =<. %inali;ando+ promo!a tamb*m altera/0o na Classe ?roduto onde temos o modelo de dados $Membros)+ para ,ue possa fa;er parte de uma -nica Classe ?roduto+ ainda ,ue assinada como ?artial. A Listagem =T e.ibe o c2digo em negrito ,ue de!e ser alterado na Classe.

Apostila de C# e ASP.Net
Lista#em ?@ using SystemP using System.Collections.DenericP using System.Lin,P using System.Te.tP namespace ?ro8etoe##? Q p$(lic partial class Prod$to L M S Lista#em ?A using SystemP using System.Collections.DenericP using System.Lin,P using System.Te.tP namespace ?ro8etoe##? Q p$(lic partial class Prod$to Q pri!ate long eidP public long 7d Q get Q return eidP S set Q eid Z !alueP S S pri!ate string edescricaoP public string "escricao Q get Q return edescricaoP S set Q edescricao Z !alueP S S pri!ate decimal eprecoP public decimal ?reco Q get Q return eprecoP S set Q epreco Z !alueP S S public ?roduto$) Q S S S

39 de 168

Apostila de C# e ASP.Net
M1todos !Met/ods%

40 de 168

:m m*todo cont*m c2digo ,ue atua sobre os dados do ob8eto. #s m*todos+ falando em termos de #rienta/0o a #b8etos+ descre!em as a/1es ,ue podem ser reali;adas pela classe. Na prGtica+ a funcionalidade de uma classe * implementada atra!*s dos seus m*todos. E+emplo: UmodificadorV tipoedeeretorno nome $tipo parNmetro) public class #peracoes Q public int Soma$int nW+ int n<) Q return nW A n<P S S

Modificadores de Acesso de M1todos


Tipos e membros de tipo t(m um n5!el de acessibilidade+ ,ue controla se ,ue possam ser usados no outro c2digo no seu Assembly ou outros assemblies. Eoc( especificar a acessibilidade de um tipo ou membro ,uando !oc( declarG6lo usando um desses modificadores de acesso> Modificador public pri!ate protected internal protected internal E+emplo: ,, p$(lic class: public class Tricycle Q ,, protected met/od: protected !oid ?edal$) Q S ,, pri2ate field: pri!ate int &heels Z TP C, protected i"ter"al propert&: protected internal int heels Q get Q return &heelsP S S S ;escri.0o # tipo ou membro pode ser acessado por ,ual,uer outro c2digo no mesmo assembly ou outro con8unto ,ue fa; refer(ncia a ele. # tipo ou membro s2 pode ser acessado pelo c2digo na mesma classe ou struct. # tipo ou membro s2 pode ser acessado pelo c2digo no mesmo classe ou struct+ ou em uma classe deri!ada. # tipo ou membro pode ser acessado por ,ual,uer c2digo no mesmo assembly+ mas n0o no outro con8unto. # tipo ou membro pode ser acessado por ,ual,uer c2digo no mesmo assembly+ ou por ,ual,uer classe deri!ada em outro assembly.

Apostila de C# e ASP.Net
'mpleme"ta"do M1todos de Ne#cio "a Classe Prod$to

41 de 168

7mplementaremos m*todos de neg2cio na Classe ?roduto+ lan/ando m0o da parte da Classe representada pelo ar,ui!o ?roduto9L.cs+ fa;endo claramente uma di!is0o das fun/1es de a/0o da Classe+ com rela/0o ao modelo e os m*todos construtores. Passo > Criar um m*todo para funcionalidade 7nserir?roduto+ sem parNmetros e ,ue retorne uma mensagem de sucesso ou n0o. Confira a Listagem =W. Lista#em ?> public string 7nserir?roduto$) Q CCC2digo omitido a,ui return F?roduto inserido com sucesso.FP S Passo @ Criar um m*todo para e.clus0o de ?roduto+ ,ue implemente um parNmetro do tipo long. Confira na Listagem =T o c2digo. Lista#em ?@ public !oid E.cluir?roduto$long id) Q CCC2digo omitido a,ui S Passo A Criar um m*todo ,ue retorne um con8unto de registros $"ataTable)+ implementando um parNmetro para pes,uisa pelas iniciais da descri/0o de ?roduto. Ressaltamos a,ui+ a necessidade de adicionarmos uma refer(ncia para a NameSpace System."ata para podermos utili;ar o tipo "ataTable. ?ara tanto+ adicione ent0o using System."ataP na Grea superior do c2digo fonte. Lista#em ?A public "ataTable Lista?roduto$string descricao) Q "ataTable "T Z ne& "ataTable$)P CCC2digo omitido a,ui return "TP S

Apostila de C# e ASP.Net
E"caps$lame"to

42 de 168

Encapsulamento !em de encapsular+ ,ue em programa/0o orientada a ob8etos significa separar o programa em partes+ o mais isoladas poss5!el. A id*ia * tornar o soft&are mais fle.5!el+ fGcil de modificar e de criar no!as implementa/1es. :ma grande !antagem do encapsulamento * ,ue toda parte encapsulada pode ser modificada sem ,ue os usuGrios da classe em ,uest0o se8am afetados. # encapsulamento protege o acesso direto $refer(ncia) aos atributos de uma instNncia fora da classe onde estes foram declarados. Esta prote/0o consiste em se usar modificadores de acesso mais restriti!os sobre os atributos definidos na classe. "epois de!em ser criados m*todos para manipular de forma indireta os atributos da classe.

Nera".a
IL o mecanismo ,ue permite definir uma no!a classe a partir de uma classe 8G e.istente. A classe ,ue estG sendo criada * dita subclasse ou classe filha da classe 8G e.istente. Em contrapartida a classe 8G e.istente * chamada de superclasse da classe ,ue estG sendo criada. A subclasse herda a estrutura de dados e os m*todos da superclasse+ podendo adicionar !ariG!eis na estrutura de dados herdada+ bem como adicionar no!os m*todos e reescre!er m*todos herdados. :ma classe pode possuir uma -nica superclasse heran/a simples+ ou pode conter mais do ,ue uma superclasse heran/a m-ltipla. A heran/a m-ltipla tem sido al!o de muitas discuss1es e contro!*rsias. A -nica linguagem+ do %rame or' .NET+ ,ue implementa diretamente a heran/a m-ltipla * o CAA. A grande discuss0o em torno da heran/a m-ltipla tem a !er com a rela/0o custo . benef5cio+ uma !e; ,ue a mesma * de dif5cil implementa/0o e concep/0o+ embora os benef5cios nem sempre se8am os esperados. Beran/a * um conceito fundamental para a orienta/0o a ob8etos. Atra!*s do mecanismo de heran/a podemos criar uma classe baseada em outra 8G e.istente. A no!a classe ,ue estG sendo criada IherdaJ todas as propriedades e m*todos da classe base+ tamb*m chamada de classe m0e ou superclasse conforme descrito anteriormente. A heran/a e!ita ,ue as propriedades e m*todos da classe m0e tenham ,ue ser redefinidos na classe filho+ embora a classe filho ou subclasse possa redefinir os m*todos da classe m0e+ atra!*s de um mecanismo conhecido como #!er&rite. ?ara ilustrar o mecanismo de heran/a !amos a um e.emplo prGtico. Eamos imaginar ,ue !oc( este8a pro8etando um programa baseado na orienta/0o a ob8etos+ e!identemente+ para uma Mercearia. :ma das pro!G!eis classes seria a classe Clientes. Nesta classe poder5amos definir as caracter5sticas e m*todos bGsicos para um Cliente bGsico. ?ara a classe Clientes poder5amos definir as seguintes propriedades> Nome C?% RD 7dentidade Endere/o Cidade CE? %one E6Mail Cr*dito ?ara a classe Clientes poder5amos definir os seguintes m*todos> Cadastrar E.cluir Atuali;ar

Apostila de C# e ASP.Net

43 de 168

#bser!e ,ue a nossa classe Clientes possui apenas as propriedades e m*todos comuns a ,ual,uer Cliente+ Este * um dos princ5pios da utili;a/0o de classes> nas classes de primeiro n5!el definimos apenas as propriedades e m*todos comuns+ os ,uais de!er0o ser utili;ados pelas classes dos demais n5!eis. Na %igura abai.o temos uma !is0o geral da classe Clientes.

E+emplo de Nera".a using SystemP public class Conta Q public !irtual double Calculo$) Q return $hXWd)P S S public class ContaW > Conta Q public o!erride double Calculo$) Q return $hXd)P S S

Apostila de C# e ASP.Net
Modificadores de classe
#s seguintes modificadores podem ser usados em classes+ no C@> Modificador ne& sealed abstract ;escri.0o

44 de 168

* usado em classes aninhadas. Se a classe ti!er o mesmo nome da classe e.terna+ de!emos usar esse moderador para indicar a sobreposi/0o. a classe n0o pode ter classes deri!adas. a classe n0o pode ser instanciada.

Modificadores ,ue de!em ser para ocultar ou redefinir m*todos da classe6base. Modificador abstract o!erride !irtual ne& ;escri.0o 7ndica ,ue o m*todo n0o possui implementa/0o. Redefine um m*todo definido como !irtual. 7ndica ,ue o m*todo pode ser redefinido na classe deri!ada. 7ndica ,ue o m*todo dei.a de ser !irtual em uma classe deri!ada.

6irt$al
A pala!ra6cha!e !irtual * usada para modificar um m*todo+ propriedade+ inde.ador ou declara/0o de e!ento e permitir ,ue ser substitu5do em uma classe deri!ada. ?or e.emplo+ esse m*todo pode ser substitu5do por ,ual,uer classe ,ue herda a ele> public !irtual double Area$) Q return . X yP S

8ase
A pala!ra6cha!e base * usada para acessar membros da classe base da dentro uma classe deri!ada> Chame um m*todo na classe base ,ue foi substitu5do por outro m*todo. Especifica o construtor de classe base de!e ser chamado durante a cria/0o de instNncias da classe deri!ada. :m acesso de classe base * permitido apenas em um construtor+ um m*todo de instNncia ou um acessador de propriedade de instNncia. E+emplo: public class ?erson Q protected string ssn Z Fccc6dd6hhhhFP protected string name Z F4ohn L. MalgraineFP public !irtual !oid Det7nfo$) Q Console. riteLine$FName> Q=SF+ name)P Console. riteLine$FSSN> Q=SF+ ssn)P S S

Apostila de C# e ASP.Net
class Employee > ?erson Q public string id Z FA9CdhiE%DFP public o!erride !oid Det7nfo$) Q CC Calling the base class Det7nfo method> base.Det7nfo$)P Console. riteLine$FEmployee 7"> Q=SF+ id)P S S class TestClass Q static !oid Main$) Q Employee E Z ne& Employee$)P E.Det7nfo$)P S S CX Sa5da Name> 4ohn L. Malgraine SSN> ccc6dd6hhhh Employee 7"> A9CdhiE%D XC

45 de 168

-2erride
# modificador de o!erride * necessGrio para estender ou modificar a implementa/0o abstrata ou !irtual de um m*todo herdado+ propriedade+ inde.ador ou e!ento. E+emplo: abstract class ShapesClass Q abstract public int Area$)P S class S,uare > ShapesClass Q int side Z =P public S,uare$int n) Q side Z nP S CC Area method is re,uired to a!oid CC a compile6time error. public o!erride int Area$) Q return side X sideP S

Apostila de C# e ASP.Net
static !oid Main$) Q S,uare s, Z ne& S,uare$W<)P Console. riteLine$FArea of the s,uare Z Q=SF+ s,.Area$))P S interface 7 Q !oid M$)P S abstract class C > 7 Q public abstract !oid M$)P S S CC Sa5da> Area of the s,uare Z Wcc

46 de 168

:m m*todo o!erride fornece uma implementa/0o no!a de um membro ,ue * herdada de uma classe base. # m*todo ,ue * substitu5do por uma declara/0o de o!erride * conhecido como o m*todo base substitu5do. # m*todo de base substitu5do de!e ter a mesma assinatura ,ue o m*todo o!erride. Eoc( n0o pode substituir um m*todo ou !irtual n0o6estGtico. # m*todo substitu5do base de!e ser !irtual+ abstract ou o!erride. :ma declara/0o de o!erride n0o * poss5!el alterar a acessibilidade do m*todo !irtual. Tanto o m*todo o!erride e o m*todo !irtual de!em ter o mesmo acessar modificador n5!el. Eoc( n0o pode usar a ne&+ static+ !irtual ou abstract modificadores para modificar um m*todo o!erride. :ma declara/0o de propriedade substitui/0o de!e especificar e.atamente o mesmo modificador de Acessar+ tipo e nome como a propriedade herdada+ e a propriedade substitu5da de!e ser !irtual+ abstractou o!erride.

Apostila de C# e ASP.Net
'"terfaces

47 de 168

:ma interface * um tipo de refer(ncia ,ue * um pouco semelhante a uma classe base abstrata ,ue consiste apenas membros abstratos. Kuando uma classe deri!a de uma interface+ ele de!e fornecer uma implementa/0o para todos membros da interface. :ma classe pode implementar m-ltiplas interfaces mesmo ,ue ele possa herdar da apenas uma -nica direta classe base. 7nterfaces s0o usadas para definir recursos espec5ficos para classes ,ue n0o t(m necessariamente uma rela/0o F * um F . ?or e.emplo+ a interface de 7E,uatableUkWV pode ser implementada por ,ual,uer classe ou struct ,ue de!e permitir a determinar se dois ob8etos do tipo s0o e,ui!alentes $no entanto+ o tipo define e,ui!al(ncia) de c2digo do cliente. 7E,uatable[$#f [$T\)\) n0o implica o mesmo tipo de F * um F rela/0o ,ue e.iste entre uma classe base e uma classe deri!ada $por e.emplo+ um Cachorro * uma Animal). E+emplo: interface 7My7nterface Q !oid MethodTo7mplement$)P S Classe implementando interface> class 7nterface7mplementer > 7My7nterface Q static !oid Main$) Q 7nterface7mplementer i7mp Z ne& 7nterface7mplementer$)P i7mp.MethodTo7mplement$)P S public !oid MethodTo7mplement$) Q Console. riteLine$FMethodTo7mplement$) called.F)P S S

Apostila de C# e ASP.Net
Erros e Ma"ip$la.0o de E+ce.0o

48 de 168

Kuando algo der errado en,uanto um programa C@ estG E.ecutando+ uma e.ce/0o ocorre. E.ce/1es interromper o flu.o atual do programa e se nada for feito+ o programa simplesmente pGra E.ecutando. E.ce/1es podem ser causadas por um bug em ,ue o programa l por e.emplo+ se um n-mero * di!idido por ;ero l ou pode ser um resultado de alguns entrada inesperado+ tais como um usuGrio selecionar um ar,ui!o ,ue n0o e.iste. Como um programador+ !oc( precisarG permitir ,ue o programa lidar com esses problemas sem falhando at* parar. C@ fornece !Grias pala!ras6cha!e l try+ catche finally l ,ue permite ,ue programas detectar e.ce/1es+ lidar com eles e continuar a E.ecutando. Eles s0o uma ferramenta muito -til para tornar seus aplicati!os mais confiG!eis. Tr& e Catc/ # try e catch as pala!ras6cha!e s0o usadas 8untos. Colo,ue try o 9lo,uear de c2digo ,ue !oc( estG preocupado pode gerar uma e.ce/0o e catch para conter o c2digo ,ue serG e.ecutado se a e.ce/0o ocorrer. Neste e.emplo+ um cGlculo cria uma di!is0o por ;ero e.ce/0o+ ,ue+ em seguida+ * detectada. Sem o try e catch blocos+ esse programa falharG. E+emplo: class ?rogramTryCatch Q static !oid Main$) Q int .Z=+ yZ=P try Q . Z W= C yP S catch $System."i!ide9ymeroE.ception) Q System.Console. riteLine$FThere &as an attempt to di!ide by ;ero.F)P S S S

Fi"all&

C2digo contido em um 9lo,uear de finally sempre * e.ecutado+ se ocorrer uma e.ce/0o ou n0o. :se o 9lo,uear de finally para fa;er se recursos s0o retornados> ?or e.emplo+ para certificar6se ,ue um ar,ui!o este8a fechado. E.emplo> try Q CC Code to try here. S catch $SomeSpecificE.ception e.) Q CC Code to handle e.ception here. S finally Q CC Code to e.ecute after try $and possibly catch) here. S

Apostila de C# e ASP.Net
Oi"dows Forms

49 de 168

Kue o %rame or' .Net foi todo pro8etado tendo em !ista a internet nos 8G sabemos + por*m nem todas as aplica/1es ser0o desen!ol!idas para a &eb. A utili;a/0o de indo&s %orms $ in %orm) * o mecanismos ,ue nos permite criar as tradicionais aplica/1es para indo&s. in %orms * o No!o Mecanismos para constru/0o de Aplicati!os indo&s+ baseados no %rame or' .Net. :m indos %orm * bastante semelhante ao conceito de formulario utili;ado pelas !ers1es atuais do E9 e "elphi. # %ormulGrio * o Elemento 9Gsico+ sobre o ,ual adicionaremos controles e c2digos para determinados e!entos associados com o %ormulGrio e seus Controles. # indo&s %orm * tudo isso+ por*m com a diferen/a ,ue pode usar todos os mecanismos do .Net %rame or'+ dentre os principais mecanismos dispon5!eis+ destaca6se o mecanismo de heran/a+ o ,ual * chamado+ para o caso do in %orms+ de Beran/a Eisual. # in %orms+ como tudo no %rame or' .Net * um #b8eto+ o ,ual * obtido a partir de uma classe bGsica. Todos os formulGrios no %rame or' .Net s0o baseados uma das seguintes classes> System. indo&s+%orms. S0o baseados em um formulGrio padr0o criado pelo usuGrio+ atra!*s de mecanismos de heran/a.

Em Resumo+ o indo&s %orm * o Elemento bGsico de 7ntera/0o com o :suGrioP em outras pala!ras+ o in %orms * o Elemento !isual das aplica/1es+ elemento este com o ,ual o usuGrio irG trabalhar. Tendo em !ista o nosso bre!e aprendi;ado sobre o %rame or'+ #rienta/0o a #b8etos e algumas funcionalidades do Eisual Studio <==d como 7"E de "esen!ol!imento+ !amos praticar.

Apostila de C# e ASP.Net
Co"/ece"do o 6is$al St$dio @??E
Ser!er E.plorer Aba responsG!el por toda a parte de cone.0o com o 9anco.

50 de 168

Solution E.plorer Ar!or* do ?ro8eto+ local onde se !( todos os %orms+ Classes+ Ref(rencias e ?ropriedades do ?ro8eto. Tool9o. Cai.a de Componentes$#b8etos Eis5!eis e n0o !is5!eis ) $ in %orm+ eb %orm).

Apostila de C# e ASP.Net
Primeiro Pro=eto em C#
Parte >

51 de 168

Proposta: Criar um pro8eto indo&s Application contendo um modulo de calculadora e um modulo de cadastro de produtos. Criaremos um formulGrio principal em nossa aplica/ao com o controle Menu para acessar os seus m2dulos. Neste formulGrio teremos o primeiro contato com a linguagem C@ e a 7"E do Eisual Studio. Aprenderemos tamb*m sobre !ariG!eis e tipos e.istentes+ al*m de iniciar a codifica/0o na linguagem. ?ara isto+ !amos iniciar o Eisual Studio e seguir os passos descritos abai.o> Passo >: Acessando a op/0o de menu %ile b Ne& b ?ro8ect+ obteremos acesso 3 cai.a de diGlogo representada na figura =W. Selecione indo&s Application para iniciarmos um pro8eto baseado em in%orm. ?reencha o campo nome com AppAula e aponte o pro8eto para sua pasta.

Fi#$ra ?> * Pa"ela de di7lo#o para cria.0o de $m "o2o pro=eto Como resultado desta etapa+ o Eisual Studio * apresentado 8G com um no!o pro8eto e um formulGrio dispon5!el. Este formulGrio serG o formulGrio principal da nossa aplica/0o+ ent0o+ usando o Solution E.plorer+ renomeie o formulGrio de %ormW.cs para %orm?rincipal.cs. # Eisual Studio irG perguntar se !oc( dese8a renomear todas as refer(ncias de %ormW. Cli,ue em ^Sim^ para continuar.

Fi#$ra ?@ * Co"firma.0o para alterar "ome do form$l7rio

Passo @: Acrescente ao formulGrio %orm?rincipal o controle MenuStrip locali;ado na Toolbo. dentro da se/0o Menus a Toolbars. # menu irG automaticamente se posicionar no topo do formulGrio como padr0o indo&s. #nde aparece Type Bere !oc( pode escre!er os itens do menu conforme a lista abai.o. # resultado serG apresentado na figura =T.

Apostila de C# e ASP.Net
Cadastro 6 Clientes 6 ?rodutos :tilitGrios 6 Calculadora Sair

52 de 168

Fi#$ra ?A * Form$l7rio pri"cipal com co"trole Me"$Strip Passo A: Adicione ao formulGrio um controle StatusStrip+ tamb*m locali;ado na se/0o Menus a Toolbars da Toolbo.. Adicione dois StatusLabel ao StatusStrip e mude suas propriedades Name para status"ata para o primeiro e statusBora para o segundo. Passo B: Adicione um controle Timer locali;ado na se/0o Compoennts da Tollbo. e mude suas propriedades conforme a tabela abai.o> Propriedade Name 7nter!al Enabled 6alor tmRelogio W=== True

Passo F: "ando um duplo cli,ue no controle Timer+ !c irG para o c2digo no e!ento Tic' do mesmo. Agora !amos iniciar a codifica/0o conforme descrito abai.o>
using ... namespace AppAula Q public partial class %orm?rincipal > %orm Q public %orm?rincipal$) Q 7nitiali;eComponent$)P S pri!ate !oid tmRelogioeTic'$ob8ect sender+ E!entArgs e) Q status"ata.Te.t Z "ateTime.No&.ToShort"ateString$)P statusBora.Te.t Z "ateTime.No&.ToLongTimeString$)P S

S S

Apostila de C# e ASP.Net
?odemos agora e.ecutar a aplica/0o para !ermos o resultado.

53 de 168

Note o delay ,ue ocorre para ,ue o tmRelogio inicie. ?ara e!itar este bug+ podemos chamar o m*todo tmRelogioeTic' ap2s a iniciali;a/0o do formulGrio. Ent0o+ dentro da declara/0o do formulGrio+ ap2s 7nitiali;eComponent$)P+ fa/a a chamada do m*todo.
public %orm?rincipal$) Q 7nitiali;eComponent$)P tmRelogioeTic'$null+ null)P S

Parte @ * Calc$ladora
Agora adicionaremos um formulGrio na aplica/0o para aprenderemos a manipular classes+ m*todos+ atributos e propriedades. Passo >: Cli,ue com o bot0o direito do mouse no nome da aplica/0o dentro do Solution E.plorer e escolha a op/0o Add b Ne& 7tem... e na 8anela ,ue se abre+ selecione indo&s %orm e preencha seu nome de %ormCalculadora conforme a figura =c.

Fi#$ra ?B * Adicio"a"do $ma "o2a classe ao pro=eto

Passo @: Monte a tela da calculadora com os controles abai.o alterando suas propriedades conforme descrito. Teremos um formulGrio semelhante ao da figura =d. Co"trole Label Te.t9o. Label Te.t9o. Label Label Combo9o. 9utton Propriedade Te.t Name Te.t Name Te.t Name Te.t Name Name Te.t 6alor Ealor W> te.tEalorW Ealor <> te.tEalor< Resultado> labelResultado #pera/0o Cmb#peracao 9tCalcular Calcular

Apostila de C# e ASP.Net

54 de 168

Fi#$ra ?F * Form$l7rio Calc$ladora

Passo A: Eamos adicionar uma classe ao pro8eto ,ue serG responsG!el por ter as propriedades e m*todos da calculadora. Cli,ue com o bot0o direito do mouse sobre o nome do pro8eto no Solutio E.plorer e escolha Add b Ne& 7tem.... Selecione Class na cai.a de diGlogo e d( o nome de Calculadora.cs e cli,ue em Add. %eito isso+ a classe * e.ibida em nossa 8anela para iniciarmos a codifica/0o das suas propriedades+ atributos e m*todos conforme o c2digo abai.o>
class Calculadora Q pri!ate "ouble e!alorWP public "ouble EalorW Q get Q return e!alorWP S set Q e!alorW Z !alueP S S pri!ate "ouble e!alor<P public "ouble Ealor< Q get Q return e!alor<P S set Q e!alor< Z !alueP S S public enum #peracao Q Soma+ Subtracao+ Multiplicacao+ "i!isao S public Calculadora$) Q S public Calculadora$"ouble EW+ "ouble E<) Q this.e!alorW Z EWP this.e!alor< Z E<P S public "ouble Somar$) Q return this.e!alorW A this.e!alor<P S public "ouble Subtrair$) Q return this.e!alorW 6 this.e!alor<P S

Apostila de C# e ASP.Net
public "ouble Multiplicar$) Q return this.e!alorW X this.e!alor<P S public "ouble "i!idir$) Q return this.e!alorW C this.e!alor<P S public "ouble Calcular$#peracao oper) Q s&itch $oper) Q case #peracao.Soma> return Somar$)P case #peracao.Subtracao> return Subtrair$)P case #peracao.Multiplicacao> return Multiplicar$)P case #peracao."i!isao> return "i!idir$)P default> return =P S S

55 de 168

Passo B: Com a classe pronta+ !amos !oltar ao formulGrio %ormCalculadora pra implementarmos o c2digo abai.o nos e!entos ,ue seguem>
public partial class %ormCalculadora > %orm Q public %ormCalculadora$) Q 7nitiali;eComponent$)P cmb#peracao."ataSource Z Enum.DetEalues$typeof$Calculadora.#peracao))P S pri!ate !oid btnCalculareClic'$ob8ect sender+ E!entArgs e) Q "ouble EW Z Con!ert.To"ouble$te.tEalorW.Te.t)P "ouble E< Z "ouble.?arse$te.tEalor<.Te.t)P Calculadora calc Z ne& Calculadora$EW+ E<)P "ouble resultado Z calc.Calcular$$Calculadora.#peracao)cmb#peracao.Selected7tem)P labelResultado.Te.t Z FResultado> F A resultado.ToString$FN<F)P S S

Passo F: Resta agora fa;er a chamada do formulGrio %ormCalcuuladora no item do menu Calculadora no formulGrio %orm?rincipal. ?ara isto+ d( um duplo cli,ue no item do menu e proceda com o c2digo abai.o e e.ecute a aplica/0o para !er o resultado.
pri!ate !oid calculadoraToolStripMenu7temeClic'$ob8ect sender+ E!entArgs e) Q %ormCalculadora frmCalc Z ne& %ormCalculadora$)P %rmCalc.Sho&"ialog$this)P S

Apostila de C# e ASP.Net
Se#$"do Pro=eto em C# Asem(l&!;LL% Co"te"do ;ataSet Tipado
Parte '

56 de 168

Proposta Criar uma camada de acesso a dados+ ,ue forne/a uma interface com m*todos para manuten/0o completa de uma tabela. ?ara tanto criaremos um ob8eto "ataSet para uma tabela+ com dois m*todos de pes,uisa nesta al*m das funcionalidades bGsicas $7nsert+ :pdate e "elete). Tamb*m iremos implementar uma classe ,ue forne/a acesso aos m*todos desta classe "ataSet+ ocultando detalhes relati!o a classe ,ue se relaciona com o 9". Entre outras ,uest1es rele!antes+ considerando o paradigma do modelo de ?rograma/0o #rientada a #b8etos $##?)+ a classe -ltima citada+ al*m de ocultar detalhes da implementa/0o de acesso e manipula/0o de dados+ permite uma mudan/a de Midlle are $?ro!iders) de acesso a dados. Como -ltima ressal!a+ citamos o fato de inicialmente estarmos utili;ando estas duas classes $"ataSet e Acesso) em um pro8eto inform+ permitindo sua reutili;a/0o em pro8etos outros como> Aplicati!os eb e ebser!ices. Esta camada serG desen!ol!ida em formato de dll. A Estr$t$ra do Pro=eto Na prGtica ser0o duas classes. :ma serG o "ataSet e a outra uma classe de acesso aos m*todos do "ataSet. "epois faremos outro aplicati!o baseado em inform+ fa;endo acesso as funcionalidades do primeiro aplicati!o. Na se,uencia relacionamos a lista de m2dulos de cada aplicati!o> Pro=eto Prod$to 6Class?roduto 6"S?roduto Pro=eto Oi"Form 6%orm?rincipal 6%ormCons?roduto 6%ormCad?roduto

Passo ?>: Acessando a op/0o de menu %ilebNe& ?ro8ect+ obteremos acesso a cai.a de dialogo representada pela figura =W. Selecione Class Library para iniciarmos um pro8eto. ?reencha a propriedade Name como ?roduto. %inali;ando cli,ue no bot0o #n.

Fi#$ra ?>

Apostila de C# e ASP.Net
Em seguida nomeie a ClassW.cs como Class?roduto.cs+ sal!ando em seguida com este nome. ?ara o nome do pro8eto+ confirme os dados conforme

57 de 168

Passo ?@: Eamos agora implementar o es,ueleto da classe Class?roduto+ definindo os Campos+ ?ropriedades e M*todos para em seguida realmente implementarmos as funcionalidades. Ee8a a figura =W ,ue e.p1em toda a classe e tamb*m os comentGrios sobre as instru/1es ali contidas. using SystemP using System.Collections.DenericP using System.Lin,P using System.Te.tP using System."ataP namespace ?roduto Q public class Class?roduto Q pri!ate int e7dP pri!ate string e"escricaoP pri!ate decimal e?recoP pri!ate int e#riginale7dP pri!ate string e#riginale"escricaoP pri!ate decimal e#riginale?recoP public int #riginale7d Q get Q return e#riginale7dP S set Q e#riginale7d Z !alueP S S public decimal #riginale?reco Q get Q return e#riginale?recoP S set Q e#riginale?reco Z !alueP S S public string #riginale"escricao Q get Q return e#riginale"escricaoP S set Q e#riginale"escricao Z !alueP S S

Apostila de C# e ASP.Net
public decimal ?reco Q get Q return e?recoP S set Q e?reco Z !alueP S S public string "escricao Q get Q return e"escricaoP S set Q e"escricao Z !alueP S S public int 7d Q get Q return e7dP S set Q e7d Z !alueP S S CCC Altera um produto e.istente public !oid Alterar$) Q S CCC Cria um no!o produto public !oid 7ncluir$) Q S CCC E.clui um produto public !oid E.cluir$) Q S public "ataTable #bter?roduto$int 7de?roduto) Q S CCC Retorna EGrios produtos+ com base nas iniciais do campo descri/0o public "ataTable #bter?roduto$string "escricao) Q S S S

58 de 168

Apostila de C# e ASP.Net

59 de 168

Com os %ields $campos) da nossa Classe Criados precisamos encapsular os campos criando assim as ?roperties+ como segue na figura abai.o>

Fi#$ra ?@

Passo ?A: :m recurso bastante interessante do Eisual Studio <==f+ e.tendendo6se naturalmente ao C@.Net+ * a possibilidade de e.ibirmos uma Classe em forma de diagrama $figura =<). "e forma in!ersa+ podemos inclusi!e criar elementos+ %ields$campos)+ ?roperties$propriedades) e Methods$m*todos) diretamente no diagrama. Como e.emplo dessas possibilidades+ confira as figuras a seguir+ obser!ando como * fGcil e produti!o tal recurso. Com ob8eti!o de e.perimentar tal recurso+ cli,ue sobre o diagrama da classe com o bot0o direito do mouse+ fa;endo op/0o Add. Com este menu de conte.to ati!o+ escolha %ield. # resultado * a declara/0o automGtica no corpo da classe no local pr2prio+ bastando alternar para a pGgina de c2digo da classe+ obser!ando a declara/0o abai.o.

pri!ate double eTesteP

?rocedendo da mesma maneira para criar uma propriedade+ fa/a a op/0o Method+ obser!ando em seguida a declara/0o de tal propriedade e seus m*todos Det e Set. ?ara criar um m*todo+ basta tamb*m proceder como nas duas intru/1es anteriores e obser!ar o resultado.

Apostila de C# e ASP.Net

60 de 168

Fi#$ra ?A

Passo ?B: :ma !e; definido toda a estrutura base da classe+ necessitamos agora criar um "ataSet Tipado ,ue realmente implemente o acesso aso dados+ b*m como+ possibilite por interm*dio da classe Class?roduto a inclus0o+ e.clus0o e atuali;a/0o de registros no banco de dados. :m passo importante se fa; necessGrio antes de criarmos tal "ataSet. Refirimo6nos a pr2pria cone.0o com o banco de dados. Acesse o menu Eie&+ habilitando a e.ibi/0o do utilitGrio Ser!er E.plorer. Este recurso permite n0o s2 criarmos !Grias cone.1es para ?ro!iders diferentes+ como permite criarmos ob8etos de banco de dados entre outros. #bser!e a figura =c+ ,ue e.p1e este recurso.

Fi#$ra ?B

?ara criar uma no!a cone.0o+ cli,ue com o bot0o direito do mouse sobre "ata Connection na 8anela do Ser!er E.plorer e serG e.ibido a cai.a de dialogo Add Connection $figura =d).

Apostila de C# e ASP.Net

61 de 168

Fi#$ra ?F Fi#$ra ?B Q Clicando no bot0o Change+ nesta cai.a de dialogo+ serG e.ibido a cai.a de dialogo Change "ata Source+ onde podemos trocar o estabelecer o ?ro!ider de acesso a dados espec5fico par o banco de dados dese8ado. Neste caso optamos pelo ?ro!ider do banco de dados MS6SKL Ser!er+ mas em outras etapas faremos uso de outros ?ro!iders para compro!ar a possibilidade de troca de pro!edor de dados+ sem grande impacto sobre a aplica/0o num todo. Confira na imagem da figura =h.

Fi#$ra ?I

Apostila de C# e ASP.Net
:ma !e; criado o n2 ,ue representa a cone.0o+ podemos partir para a pr2.ima etapa.

62 de 168

Passo ?F: 7niciando o processo+ cli,ue no menu "ata+ escolhendo a op/0o Ne& "ata Source. #bser!e a figura i+ onde escolhemos a origem dos dados+ neste caso "atabase .

Fi#$ra J

Em seguida+ conforme demonstra a figura f+ iremos selecionar a cone.0o rec*m6criada.

Fi#$ra E

Apostila de C# e ASP.Net

63 de 168

Clicando em Ne.t+ na cai.a de dialogo "ata Source Configuration i;ard $figura f) basta escolher na estrutura de Gr!ore a tabela ?rodutos e dando um nome para o "ataSet. Em seguida cli,ue em %inish e teremos um ob8eto !isual colocado no m2dulo "S?roduto representando um "ataTable+ ob8eto esse ,ue onde implementaremos os m*todos necessGrios a nossa classe. #bser!e o resultado e.posto na figura g.

Fi#$ra D

Fi#$ra >?

#bser!e a figura g onde um "ataTable denominado ?roduto+ implementa um TableAdapter nomeado como ?rodutoTableAdapter. Nele encontramos criado automGticamente um m*todo nomeado como Det"ata com a seguinte instru/0o SKL> SELECT idR descricaoR preco F -M Prod$tos

Esta instru/0o de!erG ser alterada para ,ue possamos obter somente um registro+ baseado na cha!e6primGria da tabela. Lembre6se ,ue nosso m*todo #bter?roduto+ sobrecarregado+ em uma de suas implementa/1es+ re,uer o identificador de um produto para retornar um ob8eto "ataTable com tal registro. Assim o c2digo correto *> SELECT idR descricaoR preco F -M Prod$tos ONE E !id C Sid%

Repare a inclus0o do parNmetro _id+ ,ue serG substitu5do com o !alor passado por parNmetro no m*todo. E.iste duas maneiras de se alterar a instru/0o SKL deste m*todo. A primeira+ representada pela figura WW+ * acessar a cai.a de propriedade deste m*todo+ clicando sobre o mesmo com o bot0o direito do mouse e manipulando diretamente na propriedade CommandTe.t. Apro!eitando o ense8o+ altere tamb*m o nome do m*todo para #bter?roduto7" em DetMethodName+ e!idenciando sua habilidade para retornar um registro baseado na pes,uisa sobre o campo 7d.

Fi#$ra >> A outra maneira sugerida+ conforme podemos obser!ar na figura W<+ clicando nas retic(ncias da propriedade CommandTe.t+ ter acesso ao utilitGrio Kuery 9uilder+ onde temos recursos a!an/ados para montagem de consultas

Apostila de C# e ASP.Net
parametri;adas. %a/a da maneira ,ue melhor lhe con!ir.

64 de 168

Fi#$ra >@ Passo ?J: "e!emos agora adicionar mais um m*todo de pes,uisa ao "ataSet+ denominado #bter?rodutodescricao+ permitindo a pes,uisa na tabela ?rodutos pelas iniciais do ?roduto $campo descricao). Assim+ cli,ue sobre ?rodutosTableAdapter com o bot0o direito do mouse+ escolhendo Add Kuery no menu de conte.to. A cai.a de dialogo $figura WT) TableAdapter Kuery Configuration i;ard * apresnetada+ para a ,ual faremos a escolha da primeira op/0o $:se SKL Statements)+ clicando em seguida no bot0o Ne.t.

Fi#$ra >A

Apostila de C# e ASP.Net
Ee8a a figura Wc para essas orienta/1es.

65 de 168

Caracteri;ando a Kuery a ser criada+ no nosso caso uma istru/0o Select+ fa/a a op/0o SELECT &hith returns ro&s indicando ,ue dese8amos criar uma istru/0o ,ue retorne registros. Cli,ue em Ne.t para prosseguir.

Fi#$ra >B

Nesta etapa basta digitar a instru/0o Select dese8G!el+ ou ainda+ utili;ar o Kuery 9uilder para a8uda neste sentido clicando em Ne.t para proseguir. A figura Wd reflete esta etapa.

Fi#$ra >F

Apostila de C# e ASP.Net

66 de 168

7mediatamente antes de finali;ar+ de!emos adaptar o nome do m*todo para nossa realidade. Repare na figura Wh os nomes alterados para %ill9y"escricao e #bter?roduto"escricao respecti!amente.

Fi#$ra >I

Clicando em %inish obtemos o resultado final conforme figuaras Wi e Wf. ?ronto o no!o m*todo do "ataSet estG concluido.

Fi#$ra >J

Fi#$ra >E

Apostila de C# e ASP.Net

67 de 168

L important5ssimo ressaltar+ ,ue ainda ,ue n0o tenhamos fieto nenhum esfor/o+ os m*todos necessGrios para inclus0o+ altera/0o e e.clus0o de registros na tabela ?roduto+ foram criados+ podendo ser acessado por uma instNncia do ob8eto ?rodutoTableAdapter+ presente na classe "S?roduto. Tais m*todos s0o denominados como> 7nsert+ :pdate e "elete+ podendo ser acessados conforme e.emplo abai.o. ;SProd$toTa(leAdapters.P -;9T-Ta(leAdapter Prod$tos C "ew ;SProd$toTa(leAdapters.P -;9T-Ta(leAdapter!%H Prod$tos.9pdate!G'dR G;escricaoR GPrecoR G-ri#i"alG'dR G-ri#i"alG;escricaoR G-ri#i"alGPreco%H Na !erdade+ podemos e de!emos interferir nas intru/1es criadas para as propriedades 7nsertCommand+ "eleteCommand e :pdateCommand+ a8ustando as intru/1es conforme ob8eti!o. ?ara acessar tais propriedades basta clicar com o bot0o direito do mouse sobre ?rodutoTableAdapter+ escolhendo ?roperties no menu de conte.to. #bser!e tal cai.a de dialogo conforme figura Wg.

?ara a instru/0o 7nsert+ nada al*m de ,uatro parNmetros+ um para cada campo da tabela produto. Tais parNmetros sempre de!em ter o nome iniciado com I_J+ sendo opcional mas muito importante+ ,ue tenham o nome da coluna para ,ual ser0o atribuidos. Eer c2di abai.o. 'NSE T 'NT- Prod$tos!idR descricaoR preco% 6AL9ES !SidRSdescricaoRSpreco% Com rela/0o a instru/0o "elete+ mais simples e ob8eti!a+ basta um -nico parNmetro para identificar o registro pela cha!e6primGria da tabela. No caso o campo 7d. Confira o c2digo asseguir.

;ELETE F -M Prod$tos ONE E id C S-ri#i"alGid

A e.ce/0o a simplicidade n0o se aplica a instru/0o :pdate. N0o basta definirmos os parNmetros na ,uantidade de atribui/1es+ sendo necessGrio parNmetros e.tras para implementa/0o da clGusula here. Este fato de!e6se a necessidade considerarmos a concorr(ncia de dados. Kuando simultNneamente dois o mais processos obterem o mesmo registro para altera/0o+ de!emos pre!er ,ue no momento da atuali;a/0o de um desses processos+ um entre os tr(s 8G teria finali;ado com sucesso+ obrigando ser sinali;ado ,uando da tentati!a de upadete por dos dois processos restantes. 7sto n0o * uma regra+ mas se n0o assim procedermos+ teriamos uma situa/0o ,ue um registro obtido+ com campos tendo !alores originais no momento da efeti!a altera/0o 8G teriam sido mudados. Caso isso n0o se8a uma restri/0o+ basta manter como parNmetro+ a cha!e6primGria+ neste caso+ o campo 7d.

9P;ATE ONE E

Prod$tos SET descricao C SdescricaoR preco C Spreco

!id C S-ri#i"alGid% AN; !descricao C S-ri#i"alGdescricao% AN; !preco C S-ri#i"alGpreco%

Earia/0o do comando "elete le!ando6se em conta as mesmas condi/1es do :pdate+ ou se8a+ concorr(ncia de dados.

;ELETE F -M Prod$tos ONE E !id C S-ri#i"alGid% AN; !descricao C S-ri#i"alGdescricao% AN; !preco C S-ri#i"alGpreco%

Apostila de C# e ASP.Net

68 de 168

Fi#$ra >D

Passo ?E: 4G ,ue toda implementa/0o do "ataSet "S?roduto estG finali;ada+ com m*todos necessGrios a atender nossa classe Class?roduto+ !amos agora fa;er uso dos m*todos deste "ataSet em nossa classe+ !isando assim dar funcionalidaes aos m*todos da classe class?roduto para ,ue aplicati!os possam fa;er uso. #bser!e o c2digo em ,uest0o na listagem =<. CCC Altera um produto e.istente CCC [Csummary\ public !oid Alterar$) Q "S?rodutoTableAdapters.?rodutosTableAdapter ?rodutos Z ne& "S?rodutoTableAdapters.?rodutosTableAdapter$)P ?rodutos.:pdate$e"escricao+ e?reco+ e#riginale7d+ e#riginale"escricao+ e#riginale?reco)P S CCC Cria um no!o produto public !oid 7ncluir$) Q "S?rodutoTableAdapters.?rodutosTableAdapter ?rodutos Z ne& "S?rodutoTableAdapters.?rodutosTableAdapter$)P ?rodutos.7nsert$e7d+ e"escricao+ e?reco)P S

Apostila de C# e ASP.Net
CCC E.clui um produto public !oid E.cluir$) Q "S?rodutoTableAdapters.?rodutosTableAdapter ?rodutos Z ne& "S?rodutoTableAdapters.?rodutosTableAdapter$)P ?rodutos."elete$e7d+ e"escricao+ e?reco)P S public "ataTable #bter?roduto$int ideproduto) Q "S?rodutoTableAdapters.?rodutosTableAdapter ?rodutos Z ne& "S?rodutoTableAdapters.?rodutosTableAdapter$)P return ?rodutos.#bter?roduto7"$ideproduto)P S CCC Retorna EGrios produtos+ com base na descri/0o recebida public "ataTable #bter?roduto$string "escricao) Q "S?rodutoTableAdapters.?rodutosTableAdapter ?rodutos Z ne& "S?rodutoTableAdapters.?rodutosTableAdapter$)P return ?rodutos.#bter?roduto"escricao$"escricao)P S Lista#em ?@

69 de 168

Acima !emos um n5tido modelo de ?olimorfismo+ temos um m*todo denominado #bter?roduto com dois parNmetros. Sendo assim terminamos os conceitos bGsicos de ##.

Apostila de C# e ASP.Net
Parte '' - Pro=eto Clie"te

70 de 168

"esen!ol!eremos nesta etapa um aplicati!o basedo indo&s %orms+ ,ue de!erG gerar as interfaces necessGrias para consumir os m*todos da nossa "ll anteriormente desen!ol!ida. 4G ,ue in!estimos na separa/0o da l2gica de neg2cio e acesso a dados+ li!rando nosso aplicati!o de camada de apresenta/0o de ter ,ue lidar com c2digo ,ue n0o diga respeito a funcionalidade e apar(ncia+ !amos ent0o in!estir nosso tempo em um aplicati!o ,ue pre;a por utili;ar as melhores prGticas e padr1es do desen!ol!imento. Neste artigo complementar+ faremos uso de um m*todo e.posto pela "ll+ implementando uma consulta parametri;ada permitindo a intera/0o do usuGrio ,ue poderG fa;er submiss1es consecuti!as por interm*dio de um formulGrio.

Co"s$lta de Prod$tos.
Construa uma No!a Aplica/0o no Menu %ile Ne& ?ro8ect.

Fi#$ra ?>

# Nome do %orm criado automaticamente de!erG ser %orm?rincipal.cs. Adicione ao %orm?rincipal os seguintes componentes.

Apostila de C# e ASP.Net
Co"trole MenuStrip -ri#em !Tool(o+% Menus e Tool9ars Propriedade 6alor

71 de 168

"e!endo Criar os seguintes itens de menus Cadastros ?rodutos Sair. "e!endo ficar assim>

Fi#$ra ?@ Com o 9ot0o direito do Mouse sobre o Solution E.plorer+ selecione a op/0o A"" indo&s %orms.

Fi#$ra ?A

Apostila de C# e ASP.Net
Sal!ando6o como %ormeConsultae?roduto+ e colocando os Seguinte Componentes sobre o mesmo.
Co"trole MenuStrip 9utton -ri#em !Tool(o+% Menus e Tool9ars Commom Controls Name Te.t 9utton Commom Controls Name Te.t 9utton Commom Controls Name Te.t 9utton Commom Controls Name Te.t 9utton Commom Controls Name Te.t Label Te.t9o. "ataDridEie& Droup9o. Commom Controls Commom Controls "ata Containers Te.t Name Name "oc' Name Te.t Droup9o. Containers "oc' Name Te.t %ill Droup9o.e< 9utton?es,uisar ?es,uisar 9utton7ncluir 7ncluir 9uttonAlterar Alterar 9uttonE.cluir E.cluir 9uttoneSair Sair Propriedade 6alor

72 de 168

Nome ?arcial do ?roduto Te.t9o.e"escricao DridConsulta Top Droup9o.eW

# %orm de!erG ficar da seguinte forma.

Fi#$ra ?B

Apostila de C# e ASP.Net
Configurando o #b8eto Drid Eie&.

73 de 168

Fi#$ra ?F

Passo A: "e!emos lin'ar a aplica/0o com a "ll+ para tanto+ de!emos clicar com o bot0o direito sobre a estrutura de ar!ore apresentada na Solution E.plorer e clicar em IAdd ReferenceJ+ na tela ,ue abrirG $figura =h)+ cli,ue em 9ro&se e indi,ue o caminho da dll.

Fi#$ra ?I

Apostila de C# e ASP.Net
Nossa "LL estG na ?asta 9in "ebug ?roduto.dll

74 de 168

Passo B: Agora ,ue 8G temos o desing pronto e as aplica/1es ligadas+ partiremos para a 7mplementa/0o do formulGrio de consulta de produtos+ segue abai.o o c2digo e comentGrios. Ati!ando o E!ento Clic' do 9ot0o ?es,uisar$"ar dois Cli,ues no Componente) e adicionar as seguintes refer(ncias.

Consulta de ?rodutos

pri!ate !oid 9utton?es,uisareClic'$ob8ect sender+ E!entArgs e) Q ?roduto.Class?roduto Class Z ne& ?roduto.Class?roduto$)P DridConsulta."ataSource Z Class.#bter?roduto$Te.t9o.e"escricao.Te.t)P S

Fi#$ra ?J %icando assim nossa Consulta.Sendo necessGrio ao E!ento dos 9ot1es 7ncluir e Alterar+ !amos criar o %ormulGrio de Cadastro de ?rodutos. "a Mesma forma em ,ue 7mplementamos os #utros %orms+ iremos criar esse. # Nosso %ormulario de!erG ficar assim>

Fi#$ra ?E

Apostila de C# e ASP.Net
Agora sim poderemos prosseguir com os C2digos do %orm de Consulta. pri!ate !oid 9utton7ncluireClic'$ob8ect sender+ E!entArgs e) Q %ormCadastroe?rodutos frmCad?roduto Z ne& %ormCadastroe?rodutos$)P frmCad?roduto.sete#pcao$F7F)P frmCad?roduto.Sho&"ialog$this)P S pri!ate !oid 9uttonAlterareClic'$ob8ect sender+ E!entArgs e) Q "ataDridEie&Ro& linha Z ne& "ataDridEie&Ro&$)P linha Z DridConsulta.CurrentRo&P %ormCadastroe?rodutos frmCad?roduto Z ne& %ormCadastroe?rodutos$)P frmCad?roduto.sete#pcao$FAF)P frmCad?roduto.?reencher$linha.CellsUF7dFV.Ealue.ToString$)+ linha.CellsUF"escricaoFV.Ealue.ToString$)+linha.CellsUF?recoFV.Ealue.ToString$))P frmCad?roduto.Sho&"ialog$this)P S pri!ate !oid 9uttonE.cluireClic'$ob8ect sender+ E!entArgs e) Q CX# C2digo Referente 3 E.clus0o de ?rodutos+ fica para e.ercicio+ podemos nos basear nos e!entos acima para atingir nosso ob8eti!o. XC S Na se,u(ncia e.ercitaremos o Cadastro de ?rodutos.

75 de 168

Apostila de C# e ASP.Net
Cadastro de Prod$tos
using using using using using using using using SystemP System.Collections.DenericP System.ComponentModelP System."ataP System."ra&ingP System.Lin,P System.Te.tP System. indo&s.%ormsP

76 de 168

namespace ?ro8etoeCliente Q public partial class %ormCadastroe?rodutos > %orm Q pri!ate string st#pcaoP pri!ate int e#ldeidP pri!ate string e#lde"escricaoP pri!ate decimal e#lde?recoP CC C@+ utili;ando conceitos de ##+ ou se8a+ atributos sempre pri!ados public %ormCadastroe?rodutos$) Q 7nitiali;eComponent$)P S public !oid sete#pcao$string prst#pcao) Q this.st#pcao Z prst#pcaoP CCthis seta o pr2prio ob8etos S public !oid Limpar$) Q CC7nstancia um #b8eto Controle ,ue * da Classe %ormCad?roduto CCforeach roda itens dentro de arrays Control controles Z thisP foreach $Control ctr in controles.Controls) Q if $ctr.DetType$).ToString$).E,uals$FSystem. indo&s.%orms.Te.t9o.F)) Q $$Te.t9o.)ctr).Te.t Z FFP S S

Apostila de C# e ASP.Net
if $Message9o..Sho&$F"ese8a sair da tela MF+ F7ntera/0oF+ Message9o.9uttons.oesNo+ Message9o.7con.Kuestion+ Message9o."efault9utton.9uttonW) ZZ "ialogResult.oes) Q this.Close$)P S S

77 de 168

CC 7rG rodar em todos os controles do form+ caso o controle se8a do tipo Te.t9o.+ irG atribuir IJ+ ou se8a+ limparG o controle public !oid ?reencher$string 7d+ string descricao+ string preco) Q t.tCodigo.Te.t Z 7dP t.t"escricao.Te.t Z descricaoP t.t?reco.Te.t Z precoP e#ldeid Z int.?arse$7d)P e#lde"escricao Z descricaoP e#lde?reco Zdecimal.?arse$preco)P S pri!ate !oid btCancelareClic'$ob8ect sender+ E!entArgs e) Q Limpar$)P S pri!ate !oid btConfirmareClic'$ob8ect sender+ E!entArgs e) Q CC 7nstancio a classe de cadastro+ obser!e ,ue n0o uso o "ataSet+ mas a outra classe ClasseCadastro ?roduto.Class?roduto classe?roduto Z ne& ?roduto.Class?roduto$)P CC Atribuo !alores para as propriedades da classe+ CC e estas por sua !e;+ atribuir0o estes !alores para os atributos. classe?roduto.#riginale"escricao Z e#lde"escricaoP classe?roduto.#riginale?reco Z e#lde?recoP classe?roduto.7d Z int.?arse$t.tCodigo.Te.t)P classe?roduto.#riginale7d Z e#ldeidP classe?roduto."escricao Z t.t"escricao.Te.tP classe?roduto.?reco Z decimal.?arse$t.t?reco.Te.t)P if $this.st#pcao.E,uals$F7F)) Q classe?roduto.7ncluir$)P this.Limpar$)P Selse if $this.st#pcao.E,uals$FAF)) Q

Apostila de C# e ASP.Net
classe?roduto.Alterar$)P this.Limpar$)P SelseQ Message9o..Sho&$F7mplementar a E.clus0oF)P S S S S

78 de 168

?ronto+ agora podemos come/ar os testes e implementar o ,ue achar necessGrio para o I9om %uncionamento desta telaJ.

Apostila de C# e ASP.Net

79 de 168

Camada Model e 8$si"ess Q Adota"do Li#$a#em STL


Esta camada implementa as classes de neg2cio do pro8eto+ incluindo o modelo ,ue representa a classe. SerG responsabilidade desta camada conectar a base de dados+ fornecer um modelo para classe bem como implementar os m*todos de neg2cio+ principalmente o CR:". A hist2ria bGsica do proposto *> ?ro!er m*todos bGsicos de CR:" para tabela de ?roduto bem como a tabela Mo!imento de forma relacionada. Alguns m*todos de consulta tanto para ?roduto como Mo!imento ser0o igualmente implementados. Toda implementa/0o farG uso direto da linguagem SKL para implementar os m*todos de neg2cio+ o ,ue caracteri;a um mecanismo clGssico+ n0o fa;endo uso de %rame&or's como n6Bibernate ou Lin,. '"icia"do o Pro=eto >Q Com o ambiente do EisualStudio em e.ecu/0o+ selecione Menu %ile Ne& ?ro8ect. Conforme demostrado na figura =W+ defina o nome do pro8eto $NameSpace) como NameSpaceSKL.

Fi#$ra ?> @Q 7nicialmente a 8anela Soluction E.plorer de!erG ficar como e.ibido na figura =+ ap2s renomear a Classe denominada ClassW para ?roduto.

Fi#$ra ?@

Apostila de C# e ASP.Net

80 de 168

AQ Adicione mais duas Classes+ a saber+ Classe Mo!imento e ListaMo!imento. 7sto * poss5!el clicando com o bot0o direito do mouse sob o n2 ,ue representa a aplica/0o $NameSpaceSKL)+ escolhendo na op/0o Add Ne& 7tem+ conforme figura =T+ o Template Class.

Fi#$ra ?A BQ Agora pro!idenciaremos a cone.0o com a base de dados+ para tanto+ cli,ue com o bot0o direito do mouse sobre o n2 ?ropeties e fa/a a op/0o #pen. Em seguida+ baseando6se na figura =c+ cli,ue em Settings para adicionarmos uma propriedade ,ue representarG a com e.0o com o 9anco de "ados.

Fi#$ra ?B

Apostila de C# e ASP.Net

81 de 168

FQ ?reencha as propriedades Name+ Type e Scope conforme e.ibido na figura =h. ?ara a propriedade Ealue+ ,ue define a string de cone.0o+ cli,ue nas retic(ncias na pr2pria propiedade Ealue+ tomando por base a figura =d ,ue conecta uma base SKL Ser!er.

Fi#$ra ?F

Fi#$ra ?I IQ #bser!e o c2digo fonte da classe ?roperties+ principalmente o trecho ,ue define a propriedade "9Aula ,ue implementa a string de cone.0o com o 9anco de "ados. Sendo necessGrio poder5amos alterar parNmetros desta cone.0o. namespace NameSpaceSKL.?roperties Q Uglobal>>System.Runtime.CompilerSer!ices.CompilerDeneratedAttribute$)V internal sealed partial class Settings > global>>System.Configuration.ApplicationSettings9ase Q ,,. . . cdi#o omitido aU$i Uglobal>>System.Configuration."efaultSettingEalueAttribute$ F"ata SourceZ S<<<YYSKLEH?RESSP7nitial CatalogZ9ancoAulaP?ersist Security 7nfoZTrueF A FP:ser 7"ZsaP?ass&ordZW<TF)V public string "9Aula Q get Q return $$string)$thisUF"9AulaFV))P S S S S

Apostila de C# e ASP.Net
>Q

82 de 168

Come"ta"do Passo a Passo o Cdi#o Fo"te da Classe Prod$to Partial !Model%


efer:"cias !$si"#% as classes "ecess7rias ao dese"2ol2ime"to do cdi#o da Classe Prod$to. using using using using SystemP System.Collections.DenericP System.Lin,P System.Te.tP

@Q ;efi"i.0o da NamSpace U$e acomodar7 as classes Prod$to !partial class%. namespace NameSpaceSKL Q AQ ;efi"i.0o da Classe Prod$to. public partial class ?roduto Q Nota: Repare ,ue na defini/0o da classe foi utili;ado da declara/0o IpartialJ+ indicando ,ue o c2digo do Modelo de ?roduto+ a,ui implementados+ fa;em parte de um todo. Conforme serG comentado posteriormente+ a Classe ?roduto tamb*m implementa o c2digo relati!o as Regras de Neg2cio e o CR:".

BQ ;efi"i.0o dos campos pri2ados do Modelo Prod$to. pri!ate pri!ate pri!ate pri!ate pri!ate pri!ate pri!ate long eidP string edescricaoP decimal eprecoP List[Mo!imento\ emo!imentoP long eoldidP string eolddescricaoP decimal eoldprecoP

FQ M1todo Co"str$tor da Classe Prod$toR U$e cria $ma List da classe Mo2ime"to. public ?roduto$) Q this.Mo!imento Z ne& List[Mo!imento\$)P S Nota: Este m*todo * necessGrio em fun/0o do pro8eto em ,uest0o+ contemplar um relacionamento entre as Classes ?roduto e Mo!imento. Na ?rGtica manipulamos uma cole/0o de ob8etos Mo!imento para cada representa/0o de ob8eto ?roduto. 7sso ocorrerG ,uando da inclus0o de um ?roduto+ podermos tamb*m incluir um ou mais ob8etos Mo!imento. #s comentGrios relati!o a 7nclus0o de ?roduto+ implementado na classe ?roduto ?artial ,ue e.pressa a L2gica de Neg2cio da classe dar0o lu; a este t2pico.

Apostila de C# e ASP.Net

83 de 168

IQ -s m1todos descritos a(ai+o defi"em )et!s% e Set!s% para os mem(ros pri2ados da classeR come"tados "o tpico B. Nota: ?ara criar esses m*todos+ n0o * necessGrio digitG6los no corpo da classe+ bastando apenas in!ocar os recursos representados pela figuas abai.o+ da seguinte forma> Cli,ue com o bot0o direito do mouse+ sobre o nome do membro pri!ado 7"+ fa/a a op/0o Refactro Encapsulate %ield... e a cai.a de dialogo representada pela figura oi serG e.ibida. ?ronto+ basta clicar no bot0o #n e os m*tos Set e Det para este membro pri!ado serG criado. Repita os pa/os para os campos pri!ados restantes.

Fi#$ra ?I

Fi#$ra ?J

JQ M1tos Set e )et para o campo pri2ado ';R criado a partir do tpico J. public long 7d Q get Q return eidP S set Q eid Z !alueP S S

Apostila de C# e ASP.Net
EQ public string "escricao Q get Q return edescricaoP S set Q edescricao Z !alueP S S public decimal ?reco Q get Q return eprecoP S set Q epreco Z !alueP S S public long #ld7d Q get Q return eoldidP S set Q eoldid Z !alueP S S public string #ld"escricao Q get Q return eolddescricaoP S set Q eolddescricao Z !alueP S S public decimal #ld?reco Q get Q return eoldprecoP S set Q eoldpreco Z !alueP S S public List[Mo!imento\ Mo!imento Q get Q return emo!imentoP S set Q emo!imento Z !alueP S S

84 de 168

esta"te dos m1tos Set e )et para os campos pri2ados resta"tes da Classe Prod$to !Modelo%.

DQ E"cerra o (loco U$e defi"e a Classe Prod$to !partial%. S >?Q E"cerra o (loco U$e defi"e a Classe Prod$to !partial% S

Apostila de C# e ASP.Net

85 de 168

Come"ta"do Passo a Passo o Cdi#o Fo"te da Classe Prod$to Partial ! e#ras de Ne#cio%
>Q efer:"cias !$si"#% as classes "ecess7rias ao dese"2ol2ime"to do cdi#o da Classe Prod$to. using SystemP using System.Collections.DenericP using System.Lin,P using System.Te.tP using System."ataP using System."ata.S,lClientP

@Q ;efi"i.0o da NamSpace U$e acomodar7 as classes Prod$to !partial class%. namespace NameSpaceSKL Q AQ ;efi"i.0o da Classe Prod$to. public partial class ?roduto Q Nota: Repare ,ue na defini/0o da classe foi utili;ado da declara/0o IpartialJ+ indicando ,ue o c2digo $regras de neg2cio) a,ui implementados+ fa;em parte de um todo. Conforme apresentado anteriormente+ a Classe ?roduto tamb*m implenta o c2digo ,ue define o Modelo ?roduto. A.>Q Atri($i.0o da Stri"# de co"e+0o a 2ari72el strco"" do tipo Stri"#. String strconn Z NameSpaceSKL.?roperties.Settings."efault."9AulaP A.@Q Cria"do i"st5"cia da Classe de Tratame"to de Erro. ClasseErro ClasseErro Z ne& ClasseErro$)P Nota: A cone.0o com o banco de dados na Classe+ e foi abordada nos t2picos relati!o as figuras =c e =d. BQ Come"t7rio detal/ado do M1todo ec$rsi2o etor"aC/a2e.

B.>Q "efine o m*todo como uma fun/0o ,ue retorna um 7nteiro Longo e parNmetro de entrada String. # ob8eti!o do m*todo * obter 8unto a tabela DerarCha!e $!er dados e estrutura listados abai.o)+ um !alor ,ue represente o -ltimo !alor mais um+ para o registro cu8o o campo NomeCampoCha!e se8a igual ao parNmetro passado para o m*todo.

Apostila de C# e ASP.Net
public long RetornaCha!e$string NomeCampo) Q

86 de 168

B.@Q Respecti!amente cria um ob8eto denominado conn $implementa cone.0o com base de dados)+ ,ue recebe como parNmetro a !ariG!el strconn+ definida em no passo c. Na se,u(ncia * e.ecutado pelo m*todo #pen. S,lConnection conn Z ne& S,lConnection$ strconn)P conn.#pen$)P B.AQ "efine a string ,ue contem o c2digo SKL para obten/0o do !alor do campo :ltimoNumero. String s,l:ltimoNumero Z F Select :ltimoNumero %rom DerarCha!e F A F here NomeCampoCha!e Z F A F^F A NomeCampo A F^FP

B.BQ "efine e cria um ob8eto do tipo S,lCommand tendo como parNmetro a instru/0o SKL s,l:ltimoNumero e o ob8eto de cone.0o conn implementado e e.ecutado no passo c.<. S,lCommand cmdDerarCha!e Z ne& S,lCommand$s,l:ltimoNumero+ conn)P B.FQ Cria !ariG!el Num*rica 7nteira ,ue recebe o !alor retornado do m*todo E.ecuteScalar$) do ob8eto cmdDerarCha!e. "uas obser!a/1es importantes s0o> # ?r2prio m*todo E.ecuteScalar$)+ utili;ado ,uando espera6se um -nico !alor de retorno+ a outra obser!a/0o * o uso da Classe 7nthc colocada entre parenteses para con!erter o !alor retornado pla instru/0o SKL. 7nthc EalorCampo#ld Z $7nthc)cmdDerarCha!e.E.ecuteScalar$)P B.IQ 7nstru/0o SKL responsG!el pela atuali;a/0o do campo :ltimoNumero acrescido de um. Repare ,ue por ,uest1es de trtar a concorr(ncia de dados+ a clGusula here da instru/0o compara n0o s2 o !alor para o campo NomeCampoCha!e+ como o !alor do campo :ltimoNumero+ obtido a partir da !ariG!el EalorCampo#ld+ ,ue contem o !alor deste campo lido anteriormente na tabela. 7sso garante ,ue somente serG e.ecutado o comando :pdate+ caso entre a leitura $Select) e o momento do :pdate+ o registro n0o tenha sido modificado. String s,lAtuali;aNumero Z F :pdate DerarCha!e Set :ltimoNumero Z F A F :ltimoNumero A W F A F here NomeCampoCha!e Z F A F^F A NomeCampo A F^F A F AN" :ltimoNumero Z F A Con!ert.ToString$EalorCampo#ld)P B.JQ "efine e cria um ob8eto do tipo S,lCommand tendo como parNmetro a instru/0o SKL s,lAtuali;aNumero e o ob8eto de cone.0o conn implementado e e.ecutado no passo c.<. S,lCommand cmdAtuali;aNumero Z ne& S,lCommand$s,lAtuali;aNumero+ conn)P

Apostila de C# e ASP.Net

87 de 168

B.EQ E.ecuta o m*todo E.ecuteNonKuery$) para o ob8eto cmdAtuali;aNumero em uma condi/0o 7% ,ue !erifica se o retorno num*rico * ;ero. Caso se8a+ * em fun/0o do fato de ,ue o instru/0o :pdate do comando cmdAtuali;aNumero n0o afetou o registro definido em sua clGusula here. # moti!o para tanto foi descrito no t2pico c.i. Sendo !erdadeiro a condi/0o 7%+ o m*todo * e.utado recursi!amente at* retornar um !alor $sucesso na e.ucu/0o do comando :pdate). if $cmdAtuali;aNumero.E.ecuteNonKuery$) ZZ =) Q RetornaCha!e$NomeCampo)P S B.DQ Na se,u(ncia+ * definido um ob8eto do tipo Long $Num*rico 7nteiro Longo)+ * atribuido ao mesmo o !alor da !riG!el EalorCampo#ld mais um+ e por fim+ o m*todo retorna tal !alor. long EalorNo!oP EalorNo!o Z $EalorCampo#ld A W)P return EalorNo!oP B.>?Q Encerra o bloco relati!o ao m*todo RetornaCha!e. S

FQ Cdi#o relati2o ao M1todo de Ne#cio '"serirProd$toMo2ime"to !C 9;% F.>Q "efine o m*todo sem parNmetros com reorno do tipo String+ Cria e e.ecuta o m*todo #pen para um ob8eto tipo S,lConnection. Na se,u(ncia este ob8eto serG responsG!el por controlar a transa/0o da regra de neg2cio ,ue o m*todo implementa. Eale ressaltar a,ui+ ,ue se fa; necessGrio um controle e.pl5cito de transa/0o com a base de dados+ 8G ,ue o m*todo tem como ob8eti!o+ incluir um produto na tabela ?roduto+ e um mo!imento na tabela Mo!imento. Logo+ de!emos garantir a condi/0o atpmica para a transa/0o+ onde ambos os registros s0o criados ou nenhum registro * criado. public string 7nserir?rodutoMo!imento$) Q S,lConnection conn Z ne& S,lConnection$strconn)P conn.#pen$)P F.@Q "efine um ob8eto do tipo S,lTransaction+ sendo atribuido ao mesmo+ o in5cio de transa/0o para a cone.0o representada pelo ob8eto conn. S,lTransaction transacao Z conn.9eginTransaction$)P F.AQ 7nicia um bloco try C catch C finnaly. Seu ob8eti!o+ * a partir de clGusula try+ minitorar a e.ecu/0o das instru/1es do m*todo+ obser!ando alguma e.ce/0o e des!iando para Grea de tratamento de e.ce/1es denominada catch. #correndo ou n0o e.ce/0o+ a clGusula $todo o bloco) finally * e.ecutada. try Q

Apostila de C# e ASP.Net

88 de 168

F.BQ "efine uma string ,ue recebe como atribui/0o a instru/0o 7nsrte para ?roduto. Repare nos parNmetros posicionados como !alores a serem atribuidos aos campos da tabela ?roduto. String s,l?roduto Z F 7nsert 7nto ?roduto Ealues$_7d+ _"escricao+ _?reco) FP

F.FQ "efine o ob8eto do tipo S,lCommand para inser/0o de ?roduto. Repare ,ue o m*todo recebe como parNmetro s,l?roduto contendo a instru/0o 7nsert+ conn ,ue representa o ob8eto de cone.0o+ e por fim+ transacao+ ,ue representa o ob8seto de transa/0o em curso. S,lCommand cmd?roduto Z ne& S,lCommand$s,l?roduto+ conn+ transacao)P

F.IQ Atribui/0o dos membros p-blicos da Classe ?roduto+ a saber+ 7d+ "escricao e ?reco para os parNmetros _7d+ _"escricao e _?reco pertencentes a instru/0o 7nsert contida no ob8eto cmd?roduto. cmd?roduto.?arameters.Add ithEalue$F_7dF+ this.eid)P cmd?roduto.?arameters.Add ithEalue$F_"escricaoF+ this.edescricao)P cmd?roduto.?arameters.Add ithEalue$F_?recoF+ this.epreco)P

F.JQ E.ecuta o m*todo E.ecuteNonKuery$) para o ob8eto cmd?roduto+ instruindo o banco de dados na inclus0o de um ?roduto. Este m*todo * -til para e.ecu/0o de instru/1es 7nsert+ :pdade e "elete. cmd?roduto.E.ecuteNonKuery$)P F.EQ Cria um la/o do tipo foreach+ ,ue na!ega pelos registros contidos no membro this.Mo!imento $ob8etos Mo!imento). ?ara cada ob8eto Mo!imento * montado uma instru/0o 7nsert tendo como !alores os campos do ob8eto Mo!imento da lista. #bser!e ,ue o primeiro parNmetro de foreach * um tipo Mo!imento e o segundo+ ap2s in+ representa a cole/0o Mo!imento definida no modelo ?roduto. foreach $Mo!imento Mo!imento in this.Mo!imento) Q String s,lMo!imento Z F 7nsert 7nto Mo!imento Ealues$_7d+ _?roduto7d+ F A F _TipoeMo!imento7d+ _"ata+ _Kuantidade+ _Ealor) FP S,lCommand cmdMo!imento Z ne& S,lCommand$s,lMo!imento+ conn+ transacao)P cmdMo!imento.?arameters.Add ithEalue$F_7dF+ Mo!imento.7d)P cmdMo!imento.?arameters.Add ithEalue$F_?roduto7dF+ Mo!imento.?roduto7d)P cmdMo!imento.?arameters.Add ithEalue$F_TipoeMo!imento7dF+ Mo!imento.Tipoemo!imentoid)P cmdMo!imento.?arameters.Add ithEalue$F_"ataF+ Mo!imento."ata)P cmdMo!imento.?arameters.Add ithEalue$F_KuantidadeF+ Mo!imento.Kuantidade)P cmdMo!imento.?arameters.Add ithEalue$F_EalorF+ Mo!imento.Ealor)P cmdMo!imento.E.ecuteNonKuery$)P S F.DQ E.ecuta o m*todo Commit$) para o ob8eto transacao+ instruindo o banco de dados concluir a inclus0o do ?roduto e dos ob8etos Mo!imento em definiti!o+ encerrando a transa/0o. transacao.Commit$)P

Apostila de C# e ASP.Net

89 de 168

F.>?Q Atribui uma string !a;ia para retorno do m*todo. Em seguida encerra o bloco try+ des!iando de catch. return FFP S

F.>>Q Caso ocorra erro entre o in5cio do bloco try e catch+ as intru/1es deste -ltimo bloco s0o e.ecutadas+ instruindo o banco de dados a encerrar cancelando a transa/0o $transacao.Rollbac'$)P) e retornando pelo m*todo+ a mensagem de erro retornada pelo m*todo TrataErro da Classe ClasseErro tendo como parNmetro a propriedade Message da instNncia de E.ception representada pelo ob8eto Erro. catch $E.ception Erro) Q transacao.Rollbac'$)P conn.Close$)P return ClasseErro.TrataErro$Erro.Message)P S

F.>@Q Sempre e.ecutado+ o bloco finally implementa o fechamento da cone.0o representada pelo ob8eto conn. Na prGtica+ como obser!ado no assunto Darbage Colector+ sabemos ,ue na !erdade ,uem controla o destruir de um ob8eto * este mecanismo+ ficando a cargo do m*todo simplesmente indicar ,ue o recurso estG liberado para este. 7sso tamb*m !ale para os m*todos #pen e Close das cone.1es de banco de dados+ ,ue s0o gerenciadas pelo pooled de cone.1es da middle&are Ado.Net. finally Q conn.Close$)P S S

F.>AQ #s m*tos Alterar?roduto e E.cluir?roduto n0o ser0o comentados pois sua l2gica 8G foi analisada e comentada nos m*todos anteriores. public string Alterar?roduto$) Q S,lConnection conn Z ne& S,lConnection$strconn)P conn.#pen$)P S,lTransaction transacao Z conn.9eginTransaction$)P try Q String s,l?roduto Z F :pdate ?roduto Set F A F "escricao Z _"escricao+ F A F ?reco Z _?reco here F A F 7d Z _#lde7" AN" F A F "escricao Z _#ldedescricao AN" F A F ?reco Z _#lde?reco FP S,lCommand cmd?roduto Z ne& S,lCommand$s,l?roduto+ conn+ transacao)P cmd?roduto.?arameters.Add ithEalue$F_"escricaoF+ this.edescricao)P cmd?roduto.?arameters.Add ithEalue$F_?recoF+ this.epreco)P cmd?roduto.?arameters.Add ithEalue$F_#lde7"F+ this.eoldid)P cmd?roduto.?arameters.Add ithEalue$F_#ldedescricaoF+ this.eolddescricao)P cmd?roduto.?arameters.Add ithEalue$F_#lde?recoF+ this.eoldpreco)P

Apostila de C# e ASP.Net

90 de 168

if cmd?roduto.E.ecuteNonKuery$) ZZ = Q transacao.Rollbac'$)P conn.Close$)P return I?roduto n0o Alterado. #u o registro foi alterado ou e.clu5do desde a obten/0o.JP S transacao.Commit$)P return FFP S catch$E.ception Erro)Q transacao.Rollbac'$)P conn.Close$)P return ClasseErro.TrataErro$Erro.Message)P S finally Q conn.Close$)P S S public string E.cluir?roduto$) Q S,lConnection conn Z ne& S,lConnection$strconn)P conn.#pen$)P S,lTransaction transacao Z conn.9eginTransaction$)P tryQ String s,l?roduto Z F "elete ?roduto here 7d Z _7" AN" "escricao Z _"escricao AN" ?reco Z _?reco FP S,lCommand cmd?roduto Z ne& S,lCommand$s,l?roduto+ conn+ transacao)P cmd?roduto.?arameters.Add ithEalue$F_#lde7"F+ this.eold7d)P cmd?roduto.?arameters.Add ithEalue$F_#ldedescricaoF+ this.eolddescricao)P cmd?roduto.?arameters.Add ithEalue$F_#lde?recoF+ this.eoldpreco)P if cmd?roduto.E.ecuteNonKuery$) ZZ = Q transacao.Rollbac'$)P conn.Close$)P return I?roduto n0o E.clu5do. #u o registro foi alterado ou e.clu5do desde a obten/0o.JP S transacao.Commit$)P return FFP S catch$E.ception Erro)Q transacao.Rollbac'$)P conn.Close$)P return ClasseErro.TrataErro$Erro.Message)P S finallyQ conn.Close$)P S S

Apostila de C# e ASP.Net

91 de 168

F.>BQ M*todo responsG!el po retornar um registro da tabela ?roduto+ baseado no !alor de sua cha!e6primGria. # m*todo retorna um tipo "ataTable+ ideal para acomodar registros de uma tabela. ?ara implementar este mecanismo * necessGrio criar al*m de um ob8eto S,lCommand+ um ob8eto S,lAdapter e por fim um ob8eto "ataSet. :tili;amos o m*todo %ill deste -ltimo para preencher o o8eto Table com os !alres retornados pelo command cmdproduto. public "ataTable Retorna?roduto$long 7d) Q S,lConnection conn Z ne& S,lConnection$strconn)P conn.#pen$)P String s,l?roduto Z F Select X %rom ?roduto here ?roduto.7d Z _7d FP S,lCommand cmd?roduto Z ne& S,lCommand$s,l?roduto+ conn)P cmd?roduto.?arameters.Add ithEalue$F_7dF+ 7d)P S,l"ataAdapter da Z ne& S,l"ataAdapter$)P da.SelectCommand Z cmd?rodutoP "ataSet ds Z ne& "ataSet$)P da.%ill$ds)P return ds.TablesU=VP S F.>FQ #s m*todos Retorna?roduto sobrecarregados e o m*todo RetornaMo!imento+ n0o ser0o comentados 8G ,ue s0o semelhantes ao m*todo anterior+ de!idamente comentado e e.plicado. public "ataTable Retorna?roduto$string "escricao) Q S,lConnection conn Z ne& S,lConnection$strconn)P conn.#pen$)P String s,lMo!imento Z F Select X %rom ?roduto here ?roduto."escricao Li'e _"escricao FP S,lCommand cmdMo!imento Z ne& S,lCommand$s,lMo!imento+ conn)P cmdMo!imento.?arameters.Add ithEalue$F_"escricaoF+ "escricao A F`F)P S,l"ataAdapter da Z ne& S,l"ataAdapter$)P da.SelectCommand Z cmdMo!imentoP "ataSet ds Z ne& "ataSet$)P da.%ill$ds)P return ds.TablesU=VP S public "ataTable Retorna?roduto$"ecimal ?reco) Q S,lConnection conn Z ne& S,lConnection$strconn)P conn.#pen$)P String s,l?roduto Z F Select X %rom ?roduto here ?roduto.?reco \Z _?recoFP S,lCommand cmd?roduto Z ne& S,lCommand$s,l?roduto+ conn)P cmd?roduto.?arameters.Add ithEalue$F_?recoF+ ?reco)P S,l"ataAdapter da Z ne& S,l"ataAdapter$)P da.SelectCommand Z cmd?rodutoP "ataSet ds Z ne& "ataSet$)P da.%ill$ds)P return ds.TablesU=VP S

Apostila de C# e ASP.Net

92 de 168

public "ataTable RetornaMo!imento$String "ecri?roduto+ "ateTime "ata7ni+ "ateTime "ata%in) Q S,lConnection conn Z ne& S,lConnection$strconn)P conn.#pen$)P String s,lMo!imento Z F Select X %rom !&eListaMo!imento here F A F "escricaoe?roduto Li'e I A I _?roduto AN" "ata 9et&een _"ata7ni AN" _"ata%inFP S,lCommand cmdMo!imento Z ne& S,lCommand$s,lMo!imento+ conn)P cmdMo!imento.?arameters.Add ithEalue$F_?rodutoF+ "ecri?roduto A F`F)P cmdMo!imento.?arameters.Add ithEalue$F_"ata7niF+ String.%ormat$FQ=>MMCddCyyyySF+ "ata7ni))P cmdMo!imento.?arameters.Add ithEalue$F_"ata%inF+ String.%ormat$FQ=>MMCddCyyyySF+ "ata%in))P S,l"ataAdapter da Z ne& S,l"ataAdapter$)P da.SelectCommand Z cmdMo!imentoP "ataSet ds Z ne& "ataSet$)P da.%ill$ds)P return ds.TablesU=VP S F.>IQ Encerra o bloco da Casse. S

F.>JQ Encerra o bloco da NameSpace. S

Apostila de C# e ASP.Net
Cdi#o Fo"te da Classe Mo2ime"to !Model%
using using using using SystemP System.Collections.DenericP System.Lin,P System.Te.tP

93 de 168

namespace NameSpaceSKL Q public class Mo!imento Q pri!ate long eidP pri!ate long eproduto7dP pri!ate long etipoemo!imentoidP pri!ate "ateTime edataP pri!ate "ecimal e,uantidadeP pri!ate "ecimal e!alorP public Mo!imento$) Q S public long 7d Q get Q return eidP S set Q eid Z !alueP S S public long ?roduto7d Q get Q return eproduto7dP S set Q eproduto7d Z !alueP S S public long Tipoemo!imentoid Q get Q return etipoemo!imentoidP S set Q etipoemo!imentoid Z !alueP S S public "ateTime "ata Q get Q return edataP S set Q edata Z !alueP S S public "ecimal Kuantidade Q get Q return e,uantidadeP S set Q e,uantidade Z !alueP S S public "ecimal Ealor Q get Q return e!alorP S set Q e!alor Z !alueP S S S S

Apostila de C# e ASP.Net
Cdi#o Fo"te da Classe ListaMo2ime"to !Model%
using using using using SystemP System.Collections.DenericP System.Lin,P System.Te.tP

94 de 168

namespace NameSpaceSKL Q public class ListaMo!imento Q public ListaMo!imento$) Q S public ListaMo!imento$ long 7d+ long ?roduto7d+ long Tipoemo!imentoid+ "ateTime "ata+ "ecimal Kuantidade+ "ecimal Ealor+ string "escricaoeMo!imento+ string "escricaoe?roduto) Q S pri!ate pri!ate pri!ate pri!ate pri!ate pri!ate pri!ate pri!ate long eidP long eproduto7dP long etipoemo!imentoidP "ecimal e,uantidadeP "ateTime edataP "ecimal e!alorP string e"escricaoeMo!imentoP string e"escricaoe?rodutoP

public long 7d Q get Q return eidP S set Q eid Z !alueP S S public long ?roduto7d Q get Q return eproduto7dP S set Q eproduto7d Z !alueP S S public long Tipoemo!imentoid Q get Q return etipoemo!imentoidP S set Q etipoemo!imentoid Z !alueP S S

Apostila de C# e ASP.Net
public "ateTime "ata Q get Q return edataP S set Q edata Z !alueP S S public "ecimal Kuantidade Q get Q return e,uantidadeP S set Q e,uantidade Z !alueP S S public "ecimal Ealor Q get Q return e!alorP S set Q e!alor Z !alueP S S public string "escricaoeMo!imento Q get Q return e"escricaoeMo!imentoP S set Q e"escricaoeMo!imento Z !alueP S S public string "escricaoe?roduto Q get Q return e"escricaoe?rodutoP S set Q e"escricaoe?roduto Z !alueP S S S S

95 de 168

Apostila de C# e ASP.Net
Cdi#o Fo"te da Classe ClasseErro
using using using using SystemP System.Collections.DenericP System.Lin,P System.Te.tP

96 de 168

namespace NameSpaceSKL Q class ClasseErro Q public string TrataErro$String MsgErro) Q if $MsgErro.7nde.#f$FEiolationF) RZ 6W) Q return FErro por !iola/0o de cha!e -nica.FP S else if $MsgErro.7nde.#f$FCannot insert duplicate 'ey ro& in ob8ectF) RZ 6W) Q return FErro por !iola/0o de cha!e primGria.FP S else if $MsgErro.7nde.#f$Fconflicted &ith the RE%ERENCE constraintF) RZ 6W) Q return FE.iste registro tem relacionamentos+ logo n0o pode ser e.cluido.FP S else Q return FErro #corrido> F A MsgErro A F \\\ Consulte o suporte [[[.FP S S S S

Apostila de C# e ASP.Net
Camada 6iew e Co"troller

97 de 168

Teremos a,ui um pro8eto eb baseado em Asp.Net ,ue representarG a camda Eie&+ nela+ teremos uma classe ,ue ser!irG como camada Controller+ ob8eti!ando a liga/0o entre as pGginas Asp.Net $Camada Eie&) e os m*todos de neg2cio na camada Model. A hist2ria basica do proposto *> 7mplementar interfaces para cadastramento de produtos $Classe ?roduto)+ apresnetar uma conulta para pes,uisa de produtos+ e por fim uma listagem contendo mo!imentos.

Cria"do a Camada 6iew


>Q Com o ambiente do EisualStudio em e.ecu/a+ no menu %ile conforme figura =W. eb Site+ fa/a a op/0o AS?.Net eb Site

Fi#$ra ?>

@Q 7nicialmente a 8anela Soluction E.plore de!erG ficar como o e.ibido na figura =<.

Fi#$ra ?@

AQ "( um duplo cli,ue sobre "efault.asp. na Gr!ore da Soluction E.plore !isuali;ando a pGgina no modo "esign. A Grea de ader(ncia agora pode receber controles para compor a pGgina. Cli,ue na aba ,ue define o modo Source obser!ando o c2digo resltante.

Apostila de C# e ASP.Net

98 de 168

Fi#$ra ?A BQ Eisando ter um modelo ,ue sir!a de base para todas as pGginas de nosso pro8eto+ !amos adicionar agora uma Master ?age. Cli,ue sob o n2 rai; do pro8eto escolhendo Add Ne& 7tem escolhedo o Template Master ?age. A figura =c nos orienta neste sentido. #bser!e ainda o c2digo fonte $aba Source) resultante.

Fi#$ra ?B [`_ Master LanguageZFC@F AutoE!ent ireupZFtrueF Code%ileZF?agina?adrao.master.csF 7nheritsZF?agina?adraoF `\ [R"#CTo?E html ?:9L7C F6CC TCCC"T" HBTML W.= TransitionalCCENF Fhttp>CC&&&.&T.orgCTRC.htmlWC"T"C.htmlW6transitional.dtdF\ [html .mlnsZFhttp>CC&&&.&T.orgCWgggC.htmlF\ [head runatZFser!erF\ [title\:ntitled ?age[Ctitle\ [asp>Content?laceBolder idZFheadF runatZFser!erF\ [Casp>Content?laceBolder\ [Chead\ [body\ [form idZFformWF runatZFser!erF\ [di!\ [asp>Content?laceBolder idZFContent?laceBolderWF runatZFser!erF\ [Casp>Content?laceBolder\ [Cdi!\ [Cform\ [Cbody\ [Chtml\

Apostila de C# e ASP.Net

99 de 168

FQ Adicione os diret2rios Css+ 7mg e 4s contendo respecti!amente o ar,ui!o de folha de estilo+ as imagens a serem aplicadas ao pro8eto+ e por fim+ o ar,ui!o contendo as intru/1es 4a!aScript. Conforme demonstrado na figura =d cli,ue em Refresh %older para ,ue a 8anela Soluction E.plore possa refletir a no!a estrutura de diret2rios.

Fi#$ra ?F

Fi#$ra ?I

IQ Apli,ue sob a pGgina Master ?age um controle 7mage oriundo da 8anela Tool 9o.+ configurando a propriedade 7mage:RL conforme figuras =i e =f.

Fi#$ra ?J

Apostila de C# e ASP.Net

100 de 168

Fi#$ra ?E

JQ #bser!e+ clicando na aba source da pGgina+ o c2digo fonte resultante. Especial aten/0o a tag 7mage e suas propriedades descita no c2digo fonte da pGgina. Atente tamb*m para o resultado !isual da pGgina Master ?age. [`_ Master LanguageZFC@F AutoE!ent ireupZFtrueF Code%ileZF?agina?adrao.master.csF 7nheritsZF?agina?adraoF `\ ,,. . . Cdi#o omitido aU$i [asp>Content?laceBolder idZFheadF runatZFser!erF\ [Casp>Content?laceBolder\ [Chead\ [body\ [form idZFformWF runatZFser!erF\ Vdi2 ali#"CWce"terWX [di! styleZFposition> relati!eP &idth> f==p.P height>W==p.F\ Vasp:'ma#e ';CW'ma#eTopoW r$"atCWser2erW Nei#/tCWE?p+W Oidt/CWE??p+W 'ma#e9rlCWK,'m#,Ca(ecaC$rsoCS/arp.#ifW st&leCWYQi"de+: >H left: ?p+H top: ?p+H positio": relati2eH (order: >p+ solid #E?E?E?HW ,X [asp>Content?laceBolder idZFContent?laceBolderWF runatZFser!erF\ [Casp>Content?laceBolder\ [Cdi!\ [Cdi!\ [Cform\ [Cbody\ [Chtml\

Apostila de C# e ASP.Net

101 de 168

Fi#$ra ?D

EQ Adicione uma no!a pGgina ao pro8eto definindo seu nome como 7nde..aps.. ?ara tanto+ clicando no bot0o direito do mouse sob o n2 rai; do pro8eto escolhendo Add Ne& 7tem. Repare neste caso+ o chec'bo. Select master page assinulado+ gerando a cai.a de dialogo representada pela figura WW. Nesta+ selecione uma Master ?age para ser!ir de Template para a pGgina 7nde..

Fi#$ra >?

Figura 11

Apostila de C# e ASP.Net

102 de 168

DQ Adicione um controle Menu oriundo da cai.a de dialogo Tool9o. Na!igation. :tili;e o Munu Tas's locali;ado na parte superior es,uerda na forma de uma seta+ selecionando a op/0o Edit Menu 7tems...+ representada pela figura W<. Adicione menus e itens de menu conforme ilustrado na se,u(ncia representada pelas figuras W<+ WT+ Wc+ Wd+ Wh e Wi.

Figura 12

Figura 13

Figura 14

Apostila de C# e ASP.Net

103 de 168

Figura 15

Figura 16

Figura 17

Apostila de C# e ASP.Net

104 de 168

>?Q Agora acresscente a tag "i! antes da tag Menu+ conforme listagem parcial do c2digo fonte da pGgina 7nde. pro!endo a configura/0o ,ue colocarG o ob8eto Menu centrali;ado na pGgina.

Vdi2 ali#"CWce"terW st&leCW(order: >p+ solid #E?E?E?H widt/: E??p+H /ei#/t:F??p+WX


[asp>Menu 7"ZFMenuSistemaF runatZFser!erF 9ac'ColorZF@9dCi"EF "ynamicBori;ontal#ffsetZF<F %ont6NamesZFEerdanaF %ont6Si;eZF=.femF %oreColorZF@<fcEgfF #rientationZFBori;ontalF StaticSubMenu7ndentZFW=p.F styleZFmargin6left> =p.F idthZFf==p.F\ [StaticSelectedStyle 9ac'ColorZF@d=iC"WF C\ [StaticMenu7temStyle Bori;ontal?addingZFdp.F Eertical?addingZF<p.F C\ ["ynamicBo!erStyle 9ac'ColorZF@<fcEgfF %oreColorZF hiteF C\ ["ynamicMenuStyle 9ac'ColorZF@9dCi"EF C\ ["ynamicSelectedStyle 9ac'ColorZF@d=iC"WF C\ ["ynamicMenu7temStyle Bori;ontal?addingZFdp.F Eertical?addingZF<p.F C\ [StaticBo!erStyle 9ac'ColorZF@<fcEgfF %oreColorZF hiteF C\ [7tems\ [asp>Menu7tem Te.tZFCadastroF EalueZFCadastroF\ [asp>Menu7tem Te.tZF?rodutosF EalueZF?rodutosF\[Casp>Menu7tem\ [asp>Menu7tem Te.tZF?edidosF EalueZF?edidosF\[Casp>Menu7tem\ [asp>Menu7tem Te.tZFClientesF EalueZFClientesF\[Casp>Menu7tem\ [Casp>Menu7tem\ [asp>Menu7tem Te.tZFRelat2riosF EalueZFRelat2riosF\ [asp>Menu7tem Te.tZFLista de ?rodutosF EalueZFLista de ?rodutosF\ [Casp>Menu7tem\ [asp>Menu7tem Te.tZFMo!imentosF EalueZFMo!imentosF\ [Casp>Menu7tem\ [Casp>Menu7tem\ [asp>Menu7tem Te.tZF:tilitGriosF EalueZF:tilitGriosF\ [asp>Menu7tem Te.tZFEn!io de EmailF EalueZFEn!io de EmailF\ [Casp>Menu7tem\ [Casp>Menu7tem\ [C7tems\ [Casp>Menu\

11Q E.ecute o pro8eto neste momento+ acionando o menu "ebug Start "ebugging+ obser!ando seu funcionamento conforme imagem da figura Wf.

Figura 18

Apostila de C# e ASP.Net

105 de 168

12Q Conforme 8G orientado em passos anteriores+ adicione mais uma pGgina asp.+ tendo como Template a pGgina Master ?age denominada ?agina?adrao. Se orientando pelo design representado pela figura Wg e pela listagem abai.o apli,ue e configure propriedades para os controles definidos na listagem do c2digo fonte da pGgina Cadastro?roduto.asp..

Figura 19 [`_ ?age LanguageZFC@F Master?age%ileZFjC?agina?adrao.masterF AutoE!ent ireupZFtrueF Code%ileZFCadastro?roduto.asp..csF 7nheritsZFCadastro?rodutoF TitleZF:ntitled ?ageF `\ [asp>Content 7"ZFContentWF Content?laceBolder7"ZFheadF RunatZFSer!erF\ [Casp>Content\ [asp>Content 7"ZFContent<F Content?laceBolder7"ZFContent?laceBolderWF RunatZFSer!erF\ Vdi2 ali#"CWce"terW st&leCW(order: >p+ solid #E?E?E?H widt/: E??p+H /ei#/t:BJ?p+WX [asp>Label 7"ZFLabelTitulo?aginaF runatZFser!erF Te.tZFCA"ASTR# "E ?R#":T#SF styleZF;6inde.> WP left> =p.P top> f=p.P position> absoluteP &idth> f==p.P te.t6align> centerF [Casp>Label\ [asp>Label 7"ZFLabel"escricaoF runatZFser!erF Te.tZF"escri/0o do ?rodutoF styleZF;6inde.> WP left> d=p.P top> Wf=p.P position> absoluteP &idth> <==p.P te.t6align> leftF [Casp>Label\ [asp>Te.t9o. 7"ZFTe.t9o."escricaoF runatZFser!erF styleZF;6inde.> WP left> d=p.P top> <==p.P position> absoluteP &idth> Td=p.PF [Casp>Te.t9o.\ [asp>Label 7"ZFLabel?recoF runatZFser!erF Te.tZF?re/o do ?rodutoF styleZF;6inde.> WP left> d=p.P top> <h=p.P position> absoluteP &idth> <==p.P te.t6align> leftF [Casp>Label\ [asp>Te.t9o. 7"ZFTe.t9o.?recoF runatZFser!erF styleZF;6inde.> WP left> d=p.P top> <f=p.P position> absoluteP &idth> Wd=p.PF [Casp>Te.t9o.\ [asp>9utton 7"ZF9uttonCancelarF runatZFser!erF styleZF;6inde.> WP left> d=p.P top> Ti=p.P position> absoluteP &idth> W==P height> <dp.F Te.tZFCancelarF C\ [asp>9utton 7"ZF9uttonConfirmarF runatZFser!erF styleZF;6inde.> WP left> Wd=p.P top> Ti=p.P position> absoluteP &idth> W==P height> <dp.F Te.tZFConfirmarF C\ [asp>Label 7"ZFLabelErroF runatZFser!erF styleZF;6inde.> WP left> =p.P top> dT=p.P position> absoluteP &idth> f==p.P te.t6align> centerF \ [Casp>Label\ V,di2X [Casp>Content\

Apostila de C# e ASP.Net

106 de 168

Nota: Eale ressaltar a tag "i!+ no!amente a,ui sendo configurada para centrali;ar os controles nela acomodada. Note tamb*m a propriedade position> absolute definida como propriedade de style para todos os componentes internos a Tag "i!. 7sso proporciona ,ue todos os controles obedecer0o suas posi/1es definidas pelas propriedades top e left+ mas com rela/0o a margem es,uerda da Tag "i!i e n0o do bro&ser ,ue hora irG e.ibi6los. 13Q Crie agora respecti!amente as pGginas Consulta?roduto.asp. e ConsultaMo!imento.asp.. Tomo por base as imagens das figuras <= e <W. #s detalhes sobre a configura/0o dos controles destas pGginas podem ser obser!ados nas listagens de c2digo fonte ,ue seguem as imagens. As notas referentes a pGgina asp. anterior !alem para essas.

Figura 20 Vdi2 ali#"CWce"terW st&leCW(order: >p+ solid #E?E?E?H widt/: E??p+H /ei#/t:BF?p+WX [asp>Label 7"ZFLabelTitulo?aginaF runatZFser!erF Te.tZFC#NS:LTA "E M#E7MENT#SF styleZF;6inde.> WP left> =p.P top> f=p.P position> absoluteP &idth> f==p.P te.t6align> centerF \ [Casp>Label\ [asp>Label 7"ZFLabel"escricao?rodutoF runatZFser!erF Te.tZF"escri/0oF styleZF;6inde.> WP left> <=p.P top> Wd=p.P position> absoluteP &idth> i=p.PF \ [Casp>Label\ [asp>Label 7"ZFLabel?eriodoF runatZFser!erF Te.tZF?er5odoF styleZF;6inde.> WP left> T==p.P top> Wd=p.P position> absoluteF \ [Casp>Label\ [asp>Label 7"ZFLabelEntre"ataF runatZFser!erF Te.tZFOF styleZF;6inde.> WP left> cW=p.P top> Wi=p.P position> absoluteP &idth> WWp.PF \ [Casp>Label\ [asp>Te.t9o. 7"ZFTe.t9o."escricao?rodutoF runatZFser!erF styleZF;6inde.> WP left> <=p.P top> Wi=p.P position> absoluteP &idth> <d=p.PF \ [Casp>Te.t9o.\ [asp>Te.t9o. 7"ZFTe.t9o."ata7niF runatZFser!erF styleZF;6inde.> WP left> T==p.P top> Wi=p.P position> absoluteP &idth> W==p.PF \ [Casp>Te.t9o.\

Apostila de C# e ASP.Net
[asp>Te.t9o. 7"ZFTe.t9o."ata%inF runatZFser!erF styleZF;6inde.> WP left> cT=p.P top> Wi=p.P position> absoluteP &idth> W==p.PF\ [Casp>Te.t9o.\

107 de 168

[asp>9utton 7"ZF9utton?es,uisarF runatZFser!erF styleZF;6inde.> WP left> dh=p.P top> Whdp.P position> absoluteP &idth> idp.P height> <dp.F Te.tZF?es,uisarF CssClassZF9otaoF C\ [asp>9utton 7"ZF9uttonEoltarF runatZFser!erF styleZF;6inde.> WP left> hc=p.P top> Whdp.P position> absoluteP &idth> idp.P height> <dp.F Te.tZFEotarF C\ [asp>9utton 7"ZF9utton7mprimirF runatZFser!erF styleZF;6inde.> WP left> i<=p.P top> Whdp.P position> absoluteP &idth> idp.P height> <dp.F Te.tZF7mprimirF C\ [asp>DridEie& 7"ZFDridEie&ListaMo!imentoF runatZFser!erF styleZF;6inde.> WP left> =p.P top> <<=p.P position> absoluteP height> g=p.P &idth> f==p.F \ [Columns\ [asp>9ound%ield "ata%ieldZF7dF BeaderTe.tZF7dF SortE.pressionZF7dF C\ [asp>9ound%ield "ata%ieldZF?roduto7dF BeaderTe.tZF?roduto7dF SortE.pressionZF?roduto7dF C\ [asp>9ound%ield "ata%ieldZFTipoemo!imentoidF BeaderTe.tZFTipoemo!imentoidF SortE.pressionZFTipoemo!imentoidF C\ [asp>9ound%ield "ata%ieldZF"ataF BeaderTe.tZF"ataF SortE.pressionZF"ataF C\ [asp>9ound%ield "ata%ieldZFKuantidadeF BeaderTe.tZFKuantidadeF SortE.pressionZFKuantidadeF C\ [asp>9ound%ield "ata%ieldZFEalorF BeaderTe.tZFEalorF SortE.pressionZFEalorF C\ [asp>9ound%ield "ata%ieldZF"escricaoeMo!imentoF BeaderTe.tZF"escricaoeMo!imentoF SortE.pressionZF"escricaoeMo!imentoF C\ [asp>9ound%ield "ata%ieldZF"escricaoe?rodutoF BeaderTe.tZF"escricaoe?rodutoF SortE.pressionZF"escricaoe?rodutoF C\ [CColumns\ [Casp>DridEie&\ [Cdi!\ [Casp>Content\

Apostila de C# e ASP.Net

108 de 168

Figura 21 Vdi2 ali#"CWce"terW st&leCW(order: >p+ solid #E?E?E?H widt/: E??p+H /ei#/t:BF?p+WX [asp>Label 7"ZFLabelTitulo?aginaF runatZFser!erF Te.tZFC#NS:LTA "E M#E7MENT#SF styleZF;6inde.> WP left> =p.P top> W==p.P position> absoluteP &idth> f==p.P te.t6align> centerF\ [Casp>Label\ [asp>Label 7"ZFLabel"escricao?rodutoF runatZFser!erF Te.tZF"escri/0oF styleZF;6inde.> WP left> c=p.P top> Wd=p.P position> absoluteF\ [Casp>Label\ [asp>Label 7"ZFLabel?eriodoF runatZFser!erF Te.tZF?er5odoF styleZF;6inde.> WP left> T<=p.P top> Wd=p.P position> absoluteF\ [Casp>Label\ [asp>Label 7"ZFLabelEntre"ataF runatZFser!erF Te.tZFOF styleZF;6inde.> WP left> cT=p.P top> Wi=p.P position> absoluteF\ [Casp>Label\ [asp>Te.t9o. 7"ZFTe.t9o."escricao?rodutoF runatZFser!erF styleZF;6inde.> WP left> c=p.P top> Wi=p.P position> absoluteP &idth> <d=p.PF\ [Casp>Te.t9o.\ [asp>Te.t9o. 7"ZFTe.t9o."ata7niF runatZFser!erF styleZF;6inde.> WP left> T<=p.P top> Wi=p.P position> absoluteP &idth> W==p.PF\ [Casp>Te.t9o.\ [asp>Te.t9o. 7"ZFTe.t9o."ata%inF runatZFser!erF styleZF;6inde.> WP left> cd=p.P top> Wi=p.P position> absoluteP &idth> W==p.PF\ [Casp>Te.t9o.\ [asp>9utton 7"ZF9utton?es,uisarF runatZFser!erF styleZF;6inde.> WP left> df=p.P top> Whdp.P position> absoluteP &idth> f=p.PF Te.tZF?es,uisarF C\ [asp>9utton 7"ZF9uttonEoltarF runatZFser!erF styleZF;6inde.> WP left> hf=p.P top> Whdp.P position> absoluteP &idth> f=p.PF Te.tZFEotarF C\ [asp>DridEie& 7"ZFDridEie&WF runatZFser!erF styleZF;6inde.> WP left> Wp.P top> <c=p.P position> absoluteP height> g=p.P &idth> igfp.F\ [Casp>DridEie&\ V,di2X

Apostila de C# e ASP.Net

109 de 168

14Q Neste ponto iremos retornar a pGgina 7nde.+ selecionando o Menu Tas' do controle Menu selecionando a op/0o Edit Menu 7tems...+ conforme imagem da figura <<.

Figura 22 15Q Conforme obser!ado na figura <T+ selecione o item de menu ?rodutos definindo sua propriedade Na!igate:rl para chamar a pGgina Consulta?roduto.asp..

Figura 23 16Q #b8eti!ando definir a prieira pGgina a ser e.ibida ,uando da e.ecu/0o do pro8eto+ com o bot0o direito do mouse sobre o diret2rio rai; do pro8eto+ selecione no menu de conte.to a op/0o Start #ptions...+ e em seguida proceda conforme obser!ado nas figuras <c+ <d e <h.

Figura 24

Apostila de C# e ASP.Net

110 de 168

Figura 25

Figura 26 17Q Teste a e.ecu/0o da pGgina Consulta?roduto.asp.+ a partir da e.ecu/0o do menu da pGgina 7nde.. Ee8a a figura <i ,ue ilustra este t2pico.

Figura 27 18Q # fraguimento de c2digo abai.o * o conte-do do ar,ui!o de %olha de Estilo denominado Estilo.css ,ue ser!irG para configurar os aspectos !isuais dos controles de nossa pGgina. Numa etapa a seguir aplicaremos esses estilos aos controles do pro8eto.
.Botao { font-family: verdana,helvetica; font-size: 11px; font-weight: bold; color: !!"!#!; bac$gro%nd-color: &'&()*; +

Apostila de C# e ASP.Net
.)aixa,exto { font-family: verdana,helvetica; font-size: 11px; font-weight: normal; color: !!!!!!; border: 1px solid !!!!!!; + .-abel,exto { font-family: verdana,helvetica; font-size: 11px; font-weight: bold; color: !!"!#!; + .-abel,it%lo { font-family: verdana,helvetica; font-size: 1.px; font-weight: bold; color: !!"!#!; bac$gro%nd-color: &'&()*; + .)omboBox { font-family: verdana,helvetica; font-size: 11px; color: !!!!!!; bac$gro%nd-color: ffffff; border: 1px solid !!!!!!; + .,exto)el%la/rid { font-family: verdana,helvetica; font-size: 11px; color: !!!!!!; + .,exto,it%lo/rid { font-family: verdana,helvetica; font-size: 11px; font-weight: bold; color: ffffff; bac$gro%nd-color: !!"!#!; +

111 de 168

19Q Acrescente a Tag Lin' ao c2digo fonte da Master ?age+ para ,ue os controles das pGginas deri!adas possam ser configurados com as Classes da folha de estilo. Esta tag de!e ser aplicata dentro da tag head. 0lin$ href123css3estilo.css2 type12text4css2 rel12stylesheet2 45

@?Q Apli,ue estilo aos controles Label+ Te.t9o. e 9utton da pGgina Cadastro?roduto+ em modo "esign+ procedendo da seguinte forma> @?.> Selecione o label com a propriedade te.t definida como "escri/0o do ?roduto+ e em sua propriedade $precione %c caso a cai.a de dialogo ?roperties n0o este8a sendo e.ibida) CssClass escolhendo a Classe LabelTe.t conforme ilustrado nas figuras <f e <g..

Apostila de C# e ASP.Net

112 de 168

Fi#$ra @E

Fi#$ra @D

@?.@ Apli,ue o mesmo para os controles Te.t9o. e 9utton+ escolhendo respecti!amente as Classes Cai.aTe.to e 9otao. ?or fim !e8a o resultado refletido na pGgina Cadastro?roduto.asp. conforme figura T=.

Fi#$ra A?

@?.A ?roceda assim para todos os formulGrio do pro8eto+ e apro!eite para alterar algumas Classes da %olha de Estilo para !er o efeito.

Apostila de C# e ASP.Net

113 de 168

@>Q Como a8uste final+ !isando corrigir incompatibilidade em algumas funcionalidades em alguns bro&sers+ apli,ue os trechos de c2digo abai.o conforme orienta/0o. @>.> A tag abai.o de!e ser aplicada dentro da Tag Bead da Master ?age. [style typeZFte.tCcssF\ .ad8ustedm7nde.Q;6inde.> WP S [Cstyle\ @>.@ "e!e ser aplicado como propriedade de Style do ob8eto Menu na pGgina Master ?age. "ynamicMenuStyle 9ac'ColorZF@9dCi"EF CssClassZFad8ustedm7nde.FC\ @>.A Aplicado ao e!ento ?agee?re7nit da Master ?age. protected !oid ?agee?re7nit$ob8ect sender+ E!entArgs e) Q if $?age.Re,uest.Ser!erEariablesUFhttpeusereagentFV.ToLo&er$).Contains$FsafariF)) Q ?age.ClientTarget Z Fuple!elFP S S @@Q Adicione o fraguimento de c2digo descrito abai.o dentro da Tag Bead da Master ?age+ para podermos utili;ar fun/1es de 4a!aScript em nossas pGginas. Ee8a no A"e+o > desta apostila uma abordagem mais prounda sobre 4a!aScript e sua aplica/0o em pGginas asp.. [script languageZF8a!ascriptF typeZFte.tC8a!ascriptF srcZF4SC%uncoes4a!aScript.8sF\ [Cscript\ @@Q Aplicando fun/1es 4a!aScript a controles do pro8eto @@.>Q ?rimeiro iremos criar um ar,ui!o contendo fun/qes 4a!aScript $!er listagem abai.o)+ na se,u(ncia referenciG6lo em nossas pGginas ou na pagina Mestre do pro8eto. "esta forma+ poderemos fa;er uso das referidas fun/1es em e!entos 4a!aScript dos controles Asp.Net contidos em nossas pGginas. Crie um ar,ui!o com formato te.to padr0o+ nomeando6o como %uncoes4a!aScript.4S+ sal!ando6o no diret2rio 4S do pro8eto &eb. # c2digo do conte-do do ar,ui!o em ,uest0o * e.ibido na listagem =W. function %ormata"ata$input) Q if $input.!alue.lengthZZW=) Q e!ent.'eyCodeZ=P S !ar tecla Z e!ent.'eyCodeP if $tecla \ ci aa tecla [ df)Q input.!alueZinput.!alueP S else Q e!ent.'eyCodeZ=P S

Apostila de C# e ASP.Net
if $$input.!alue.lengthZZ<)bb$input.!alue.lengthZZd)) Q input.!alueZinput.!alue A FCF P S S function SomenteNumeros$input) Q !ar tecla Z e!ent.'eyCodeP if $tecla \ ci aa tecla [ df)Q input.!alueZinput.!alueP S else Q e!ent.'eyCodeZ=P S S function %ormatar$src+ mas') Q !ar i Z src.!alue.lengthP !ar saida Z mas'.substring$=+W)P !ar te.to Z mas'.substring$i) if $te.to.substring$=+W) RZ saida) Q src.!alue AZ te.to.substring$=+W)P S S function %ormatarCnp8$src+ mas') Q if $src.!alue.lengthZZWf) Q e!ent.'eyCodeZ=P S !ar tecla Z e!ent.'eyCodeP if $tecla \ ci aa tecla [ df)Q src.!alueZsrc.!alueP S else Q e!ent.'eyCodeZ=P S !ar i Z src.!alue.lengthP !ar saida Z mas'.substring$=+W)P !ar te.to Z mas'.substring$i) if $te.to.substring$=+W) RZ saida) Q src.!alue AZ te.to.substring$=+W)P S S

114 de 168

Apostila de C# e ASP.Net

115 de 168

@@.@Q #utra maneira de in8etar refer(ncia a m*todos de 4a!aScript a controles de Asp.Net+ * utili;ando a propriedade Attributes de um controle+ usando o m*todo Add do mesmo para acrescentar chamada a uma fun/0o 4a!aScript. No e.emplo abai.o+ serG acrescentado ao controle no lado Client6Side o uso da fun/0o %ormata"ata ,uando ocorrer o e!ento onneypress de 8a!a e.cript para os controles Te.t9o."ata7ni e Te.t9o."ata%in. # e!ento da pGgina ideal para codificar o proposto no parGgrafo anterior * ?ageeLoad+ pois assim+ ao carregar da pGgina o fraguimento de c2digo * renderi;ado no lado Client6Side $9ro&ser). protected !oid ?ageeLoad$ob8ect sender+ E!entArgs e) Q Te.t9o."ata7ni.Attributes.Add$Fon'eypressF+ Freturn %ormata"ata$this)PF)P Te.t9o."ata%in.Attributes.Add$Fon'eypressF+ Freturn %ormata"ata$this)PF)P S @@.AQ No formulGrio $ou pGgina se preferir) 7nde..Asp.+ acione o Menu Tas' do controle Menu conforme %igura TW clicando em Edit Menu 7tems. Emseguida selecione o item Mo!imentos atribuindo a propriedade Na!igate:rl o formulGrio ConsultaMo!imento.Asp.. As %iguras T< e TT ilustram estes passos.

Fi#$ra A>

Fi#$ra A@

Apostila de C# e ASP.Net

116 de 168

Fi#$ra AA

@@.BQ E.ecute o site+ testando a fun/0o 4a!aScript conforme ilustrado na %igura Tc representando o formulGrio ConsultaMo!imento.Asp. em e.ecu/0o.

Fi#$ra AB

@@.FQ ?or fim+ estude tamb*m o conte-do do A"e+o @ desta apostila+ ,ue trata de uma outra forma de formatar controles de Asp. com a ado/0o de E+press<es e#$lares.

Apostila de C# e ASP.Net
Cria"do a Camada Co"troller
Come"ta"do os passos:

117 de 168

>Q Necessitamos nesnte momento adicionar uma classe ao pro8eto eb+ para ,ue implemente o c2digo necessGrio ao acesso aos m*todos da camada de neg2cio $Model). Cli,ue com o !ot0o direito do mouse sobre o n2 ,ue representa o pro8eto em Soluction E.plore+ selecione Add Ne& 7tem...+ tendo como resposta o e.posto na figura =W. Selecione o Template Class+ defina o nome como ?rodutoController e cli,ue no bot0o Add para finali;ar

Fi#$ra ?>

@Q Na se,u(ncia responda Sim para a cai.a de dialogo representada pela figura =<+ autori;ando acomodar a classe recem criada no diret2rio Appecode do pro8eto eb.

Fi#$ra ?@

AQ ?or fim+ repare a figura =T e.ibindo a classe no diret2rio AppeCode.

Fi#$ra ?A

Apostila de C# e ASP.Net

118 de 168

BQ Adicionemos agora refer(ncia para para os assemblyes ,ue representam a Camada de Neg2cio $Model)+ ob8eti!ando assim+ permitir a Classe ?rodutoController ter acesso aos m*todos de neg2cio. B.>Q Clicando com o bot0o direito do mouse sob o n2 do pro8eto $conforme figura =c)+ escolha Add Reference no menu de conte.to..

Fi#$ra ?B B.@Q Ap2s aguardar uns instantes+ a imagem da figura =d serG e.ibida+ permitindo ,ue pela cai.a de diGlogo Add Reference possamos escolher a biblioteca $aplicati!o) NameSpaceSKL.dll+ completando assim o processo de refer(ncia a camada de neg2cio.

Fi#$ra ?F FQ "eclara/1es $refer(ncias as NameSpaces necessGrias ao c2figo fonte do pro8eto.)

using using using using using using using using

SystemP System."ataP System.ConfigurationP System.Lin,P System. ebP System. eb.SecurityP System. eb.:7P System. eb.:7.BtmlControlsP

Apostila de C# e ASP.Net
using using using using using using System. eb.:7. ebControlsP System. eb.:7. ebControls. eb?artsP System.Hml.Lin,P System."ataP System.Collections.DenericP System.Collections.#b8ectModelP

119 de 168

FQ "efini/0o do nome da classe+ do escopo $?ublica ou ?ri!ada) da classe e do bloco inicial.

public class ?rodutoControllereSKL Q


IQ 7nstNncias para as classes ?roduto+ Mo!imento e ListaMo!imento contidas na NameSpaceSKL pr*!iamente referenciada.

NameSpaceSKL.?roduto ?roduto Z ne& NameSpaceSKL.?roduto$)P NameSpaceSKL.Mo!imento Mo!imento Z ne& NameSpaceSKL.Mo!imento$)P NameSpaceSKL.ListaMo!imento ListaMo!imento Z ne& NameSpaceSKL.ListaMo!imento$)P
JQ "efini/0o dos campos p-blicos ,ue arama;enar0o os !alores relati!o aos campos do modelo ?roduto. Ser0o -teis para arma;enar os !alores referentes a um ?roduto ,uando obtido+ e nas opera/1es de :pdate+ a s*rio #ld dos mesmos+ poder0o reter os !alores obtidos+ distinguindo6os dos !alores alterados pelo processo.

public public public public public public

long 7dP string "escricaoP decimal ?recoP long #ld7dP string #ld"escricaoP decimal #ld?recoP

EQ M*todo ,ue retorna um "ataTable $collection) contendo um registro da tabela ?roduo baseado na cha!e primGria passada como parNmetro. Tamb*m preenche os campos p-blicos ,ue representam o registro produto.

public "ataTable Det?roduto$long 7d) Q "ataTable dt Z ne& "ataTable$)P dt Z ?roduto.Retorna?roduto$7d)P this.7d Z $long)dt.Ro&sU=V.7temArrayU=VP this."escricao Z $string)dt.Ro&sU=V.7temArrayUWVP this.?reco Z $decimal)dt.Ro&sU=V.7temArrayU<VP return dtP S

DQ M*todo ,ue recebe como parNmetro um tipo "ataTable $em geral um registro de ?roduto)+ arma;enando os !alores em !ariG!eis ,ue representar0o no processo de :pdate os !alores antigos+ a,uele -teis para clGusula here da instru/0o :pdate sub8acente.

public !oid Set#ld?roduto$"ataTable #ld"T) Q this.#ld7d Z $long)#ld"T.Ro&sU=V.7temArrayU=VP this.#ld"escricao Z $string)#ld"T.Ro&sU=V.7temArrayUWVP this.#ld?reco Z $decimal)#ld"T.Ro&sU=V.7temArrayU<VP S

Apostila de C# e ASP.Net
public "ataTable #bter?roduto$string "escricao) Q return ?roduto.Retorna?roduto$"escricao)P S
>>Q # mesmo ,ue o item anterior+ mas para o m*todo RetornaMo!imento.

120 de 168

>?Q M*todo ,ue encapsula o m*todo Retorna?roduto da Classe ?roduto+ sobrecarregado pelo parNmetro string+ ,ue retorna um "ataTable contendo uma lista de registros da tabela ?roduto

public "ataTable #bterListaMo!imento$string "escricao+ "ateTime "ata7ni+ "ateTime "atafin) Q return ?roduto.RetornaMo!imento$"escricao+ "ata7ni+ "atafin)P S
>@Q M*todo ,ue encapsula o m*todo de inser/0o de ?roduto e Mo!imento+ implementado na Classe ?roduto+ retornando string. >@.> * "efine> # Nome do m*todo+ seus parNmetros de entrada e o bloco inicial do m*todo.

public string 7nserir?rodutoMo!imento$string "escricao+ decimal ?reco) Q


>@.@ * ?reenche o campo 7d da instNncia de ?roduto com o !alor retornado pelo m*todo gerador de cha!e -nica da Classe ?roduto.

?roduto.7d Z ?roduto.RetornaCha!e$F7"e?R#":T#F)P
>@.A * ?reenche os campos "escricao e ?reco+ da instNncia de ?roduto com os !alores obtidos pelos parNmetros do m*todo 7nserir?rodutoMo!imento.

?roduto."escricao Z "escricaoP ?roduto.?reco Z ?recoP


>@.B * 7dentico ao item WT.<+ mas para o campo 7d da instNncia de Mo!imento.

Mo!imento.7d Z ?roduto.RetornaCha!e$F7"eM#E7MENT#F)P
>@.F * ?reenche o restante dos campos da instNncia de Mo!imento. S0o !alores arbitrados para conclus0o do e.emplo.

Mo!imento.?roduto7d Z ?roduto.7dP Mo!imento.Tipoemo!imentoid Z WP Mo!imento.Kuantidade Z =P Mo!imento.Ealor Z =P Mo!imento."ata Z "ateTime.No&."ateP ?roduto.Mo!imento.Add$Mo!imento)P


>A.I * %inali;ado a l2gica do m*todo+ in!oca a e.ecu/0o do m*todo de neg2cio 7nserir?rodutoMo!imento+ ,ue retorna uma string contendo a mensagem de erro caso ocorram. ?or fim encerra o bloco de c2digo do m*todo.

return ?roduto.7nserir?rodutoMo!imento$)P S

Apostila de C# e ASP.Net

121 de 168

>FQ M*todo ,ue encapsula a chamda ao m*todo Alterar?roduto da Classe ?roduto. Repare os parNmetros #ld7d+ #ld"escricao e #ld?reco+ ,ue ser!em para serem referenciados na clGusula here da instru/0o :pdate. Assim+ temos garantia de e.ecu/0o da instru/0o :pdate na condi/0o de Concorr(ncia #timista. Este m*todo tamb*m retorna uma string com a mensagem de eero+ retornado pelo m*todo sub8acente caso e.ista. public string Alterar?roduto$ string "escricao+ decimal ?reco+ long #ld7d+ string #ld"escricao+ decimal #ld?reco ) Q ?roduto."escricao Z "escricaoP ?roduto.?reco Z ?recoP ?roduto.#ld7d Z #ld7dP ?roduto.#ld"escricao Z #ld"escricaoP ?roduto.#ld?reco Z #ld?recoP return ?roduto.Alterar?roduto$)P S >IQ # mesmo ,ue o item anterior sendo ,ue para a e.clus0o de ?roduto. public string E.cluir?roduto$ long #ld7d+ string #ld"escricao+ decimal #ld?reco ) Q bool Sucesso Z falseP ?roduto.#ld7d Z #ld7dP ?roduto.#ld"escricao Z #ld"escricaoP ?roduto.#ld?reco Z #ld?recoP return ?roduto.E.cluir?roduto$)P S

>JQ Encerra o bloco de c2digo da Classe ?rodutoController. S

Apostila de C# e ASP.Net
6i"c$la"do a Camada 6iew com a Camada Co"troller
Co"fi#$ra"do o Co"trole )rid6iew da P7#i"a Co"s$ltaProd$to

122 de 168

ResponsG!el por e.ibir o resultado de consultas+ neste caso+ a consulta de ?rodutos retornada pelo m*todo #bter?roduto+ ,ue retorna para a propriedade "ataSource do DridEie& um con8unto de dados na forma de um "ataTable+ !eremos na se,u(ncia os passos para ainda em tempo de pro8eto configurar as colunas ,ue sr0o e.ibidas. >Q Selecione o DridEie& $figura =W) clicando na seta $Menu Tas') locali;ada na canto superior es,uerdo do controle. Selecione no combo da op/0o Choose "ata Source $figura =<)+ Ne& "ata Source para !incularmos o DridEie& a um m*todo ,ue possa retornar a estrutura de uma consulta. :m "atasource * um ob8eto ,ue+ uma !e; !inculado a um m*todo+ pode ser usado para acesso a estrutura de retorno do m*todo+ como em tempo de e.ecu/0o acessar o pr2prio m*todo.

Fi#$ra ?>

Fi#$ra ?@ @Q Cumprido o passo anterior+ a cai.a de dialogo "ata Source Configuration figura =T serG e.ibida+ para a ,ual faremos op/0o para o ob8eto #b8ect. i;ard+ representada pela imagem da

Fi#$ra ?A

Apostila de C# e ASP.Net

123 de 168

AQ Cicando em #n na op/0o anterior somos condu;idos para cai.a de dialogo Configure "ata Source #b8ect"ataSourceW. Na op/0o Choose your business ob8ect+ selecione a classe ?rodutoControllereSKL clicando no bot0o Ne.t para prosseguir na configura/0o do ob8eto.

Fi#$ra ?B

BQ Nesta etapa+ na aba SELECT+ escolha no combo Choose a method o m*todo Modelo?roduto conforme ilustrado pela figura =d. Cli,ue no bot0o Ne.t+ proseguindo na configura/0o.

Fi#$ra ?F FQ ?assado a passo anterior+ serG e.ibido a imagem da figura =h 8anela DridEie& Tas's $Menu Tas' do controle) tendo agora na propriedade Choose "ata Source uma refer(ncia a #b8ect"ataSourceW+ ,ue * o "ataSource ,ue definirG+ em tempo de pro8eto+ as colunas do DridEie&. Confira a %igura =i para !isuali;ar o resultado no DridEie&. Repare ,ue a estrutura de colunas do DridEie& $figura =i) passou refletir naturalmente a estrutura de campos da Classe ?roduto. "e!emos agora a8ustar para nossa realidade+ e.cluindo colunas desnecessGrias.

Apostila de C# e ASP.Net

124 de 168

Fi#$ra ?I

Fi#$ra ?J

IQ Se orientando pela figura =h+ cli,ue em Edit Columns... para poder manipular e configurar as colunas do DridEie&. Conforme e.ibido na figura =f+ selecione os campos #ld7d+ #ld"escricao e #ld?reco+ indi!idualmente+ clicando no bot0o de e.clus0o. Estes campos est0o locali;ados na lista Selected %ields.

Fi#$ra ?E

Apostila de C# e ASP.Net

125 de 168

JQ Ainda na cai.a de dialogo %ields+ selecione em Selectd %ields a coluna 7d manipulando suas propriedades conforme se,u(ncia. J.> * ?ropriedade BeaderTe.t igual a 7d. Esta propriedade define o t5tulo da coluna no grid.

Fi#$ra ?D J.@ * ?ropriedade "ata%ield igual a 7d. # !alor atribuido a esta propriedade de!e ser igual ao nome de um campo retornado pelo "ataTable $collection) para ,ue ocorra a sincronia+ logo+ representar uma coluna da cole/0o resultante do m*todo sub8acente. Repare a figura WW+ e.ibida ,uando hou!e a sele/0o+ ,ue representa a estrutura resultante do m*todo retornado pelo #b8ect"ataSource ao ,ual o DridEie& estG selecionado. Na prGtica n0o necessitamos de um #b8ect"ataSource !inculado a um m*todo em tempo de pro8eto. 9astaria irmos adicionando colunas ao DirdEie&+ e em seguida+ configurar a propriedade "ata%ield com nomes de colunas ,ue antecipadamente sabemos ,ue retornarG do m*todo ,ue serG matribuido a propriedade "ataSource do DridEie&.

Fi#$ra >?

Apostila de C# e ASP.Net

126 de 168

Fi#$ra >> J.A * ?or fim+ poder5amos manipular as propriedades BeaderStyle e 7temStyle+ definindo a apar(ncia final dos t5tulos das colunas bem como das colunas+ ou melhor+ das c*lulas das colunas. N0o faremos isso+ optaremos a,ui por utili;ar a propriedade CssClass tanto de BeaderStyle ,uanto 7temStyle

Fi#$ra >@ J.B * Conforme sugerido no item i.T+ apli,ue a propriedade CssClass de BeaderStyle de todas as colunas+ o nome da Classe Te.toTituloDrid ,ue consta em nosso ar,ui!o de %olha de Estilo $Estilo.Css). 7sto funcionarG de!ido ao fato de nossa ?Ggina ?adr0o+ ,ue * a base da pGgina atual+ 8G referenciar o ar,ui!o de %olha de Estili citado. ?roceda o mesmo para a propriedade 7temStyle das colunas+ atribuindo a propriedade CssClass+ a Classe Te.toCelulaDrid da mesma %olha de Estilo. A imagem da figura WT reflete o efeito das classes de %olha de Estilo aplicado ao DridEie&.

Fi#$ra >A J.F * Como a8ustes final+ iremos adicionar uma coluna especial+ !isando criar um Lin' para ,ue o usuGrio possa selecionar uma linha no DridEie&+ e por conse,u(ncia obtermos associado a um e!ento do mesmo DridEie& o !alor da cha!e do registro selecionado. Neste caso o !alor da c*lula da priemira coluna para a linha selecionada. Se oriente ent0o pela figura Wc+ !endo o resultado na imagem da figura Wd. J.F.> * Conforme figura Wc+ obtida a partir do cli,ue na op/0o Edit Columns... do menu DridEie& Tas's+ na lista A!aleables fields+ selecione Select no n2 Command%ield clicando no bot0o Add.

Apostila de C# e ASP.Net

127 de 168

Em seguida configure a propriedade BeadTe.t da coluna recem criada para !a;io+ a propriedade 9uttonType para Lin' e a propriedade SelectTe.t como Selecionar. Manipule tambem a propriedade 7temStyle idth com o !alor de <=` $determina a largura da coluna em termos percentuais com rela/0o a largura do DridEie&). Se dese8ar+ apli,ue classes da %olha de Estilo a gosto. Tal!e; ,ueira esperimentar criar uma classe de %olha de Estililo espec5fica para este tipo de controle $coluna).

Fi#$ra >B

Fi#$ra >F J.F.@ * %inali;ando+ na propriedade "ataSource7"+ remo!a a refer(ncia ao #b8ect"ataSourceW+ ,ue a partir deste momento n0o mais tem importNncia+ 8G ,ue como informado+ s2 tem utilidade para configurarmos o DridEie& em tempo de pro8eto. Responda IN0oJ para cai.a de dialogo da figura Wh para n0o perder a configura/0o de colunas at* a,ui alcan/ada. Remo!a tamb*m a Tag #b8ect"ataSource no c2digo fonte da pGgina $listado a aprtir da imagem da figura Wh). ?ara tanto+ saia do modo "esign e cli,ue na aba Source da pGgina Consulta?roduto

Fi#$ra >I [asp>#b8ect"ataSource 7"ZF#b8ect"ataSourceWF runatZFser!erF SelectMethodZFModelo?rodutoF TypeNameZF?rodutoControllereSKLF\ [Casp>#b8ect"ataSource\

Apostila de C# e ASP.Net
Come"ta"do o cdi#o da P7#i"a Co"s$ltaProd$to

128 de 168

>Q Cria uma instNncia da Classe ?rodutoController $?rod) ao ser criado uma instNncia da Classe Consulta?roduto. A partir de ?rod temos acesso aos m*todos da Camada Controller. public partial class Consulta?roduto > System. eb.:7.?age Q ?rodutoControllereSKL ?rod Z ne& ?rodutoControllereSKL$)P

@Q ?rocedimento para o e!ento Clic' do ob8eto 9utton?es,uisar. ?rimeiro * preenchido a propriedade "ataSource do DridEie& com dados retornados do m*todo #bter?roduto da classe ?rodutoController. Repare o !alor da propriedade Te.t do controle Te.t9o."escricao?roduto passado com o parNmetro. ?or fim+ * aplicado o m*todo "ata9ind $funciona como um Refresh) para o controle DridEie&+ para ,ue os dados retornado pelo m*todo #bter?roduto possam ser e.ibidos. protected !oid 9utton?es,uisareClic'$ob8ect sender+ E!entArgs e) Q DridEie&?rodutos."ataSource Z ?rod.#bter?roduto$Te.t9o."escricao?roduto.Te.t)P DridEie&?rodutos."ata9ind$)P S AQ # c2digo acionado para o e!ento Clic' do ob8eto 9utton7ncluir implementa> protected !oid 9utton7ncluireClic'$ob8ect sender+ E!entArgs e) Q A.> Q Atribui para !ariG!el ?aginaRetorno+ do tipo Session+ o nome da pGgina asp. Consulta?roduto. Esta !ariG!el pode ser acessada por outra pGgina dentro da se/0o+ possibilitando a l2gica desta pGgina utili;a6la como parNmetro para um poss5!el m*todo de retorno $na!egabilidade) de pGgina. SessionUF?aginaRetornoFV Z FConsulta?roduto.asp.FP

A.@ * "efine o !alor da !ariG!el #pera/0o+ do tipo Session. Esta !ariG!el ser!irG de %lag para o processo de manuten/0o de ?roduto+ na pGgina asp. Cadastro?roduto. SessionUF#peracaoFV Z F7ncluirFP

A.A * :sando o ob8eto Response+ redireciona $m*todo Redirect) o flu.o para a pGgina asp. Cadastro?roduto. Response.Redirect$FCadastro?roduto.asp.F)P A.B * Encerra o bloco de c2digo do procedimento 9utton7ncluireClic'. S

Apostila de C# e ASP.Net
BQ C2digo para o e!ento Clic' do ob8eto 9uttonAlterar. 7dentico ao item T. protected !oid 9uttonAlterareClic'$ob8ect sender+ E!entArgs e) Q SessionUF?aginaRetornoFV Z FConsulta?roduto.asp.FP SessionUF#peracaoFV Z FAlterarFP Response.Redirect$FCadastro?roduto.asp.F)P S FQ C2digo para o e!ento Clic' do ob8eto 9uttonE.cluir. 7dentico ao item T. protected !oid 9uttonE.cluireClic'$ob8ect sender+ E!entArgs e) Q SessionUF?aginaRetornoFV Z FConsulta?roduto.asp.FP SessionUF#peracaoFV Z FE.cluirFP Response.Redirect$FCadastro?roduto.asp.F)P S

129 de 168

IQ C2digo para o e!ento Clic' do ob8eto 9uttonEoltar. :sa o m*todo Redirect de Response tendo como parNmetro a !ariG!el de se/0o ?aginaRetorno. Repare o m*todo ToString ,ue con!erte o !alor da !arG!el d tipo Session para string+ 8G ,ue o m*todo Redirect re,uer uma string. protected !oid 9uttonEoltareClic'$ob8ect sender+ E!entArgs e) Q Response.Redirect$SessionUF?aginaRetornoFV.ToString$))P S JQ # e!ento Selected7nde.Changing do ob8eto DridEie& * ideal para obter !alores da linha selecionadas $com a/0o do clic' do mouse). Neste caso atribuimos a !ariG!el de se/0o ?n?roduto+ o !alor da propriedade Te.t da primeira coluna $inde. ;ero). # !alor da !ariG!el ?n?roduto serG utili;ado na l2gica da pGgina Asp. Cadastro?roduto. protected !oid DridEie&?rodutoseSelected7nde.Changing$ob8ect sender+ DridEie&SelectE!entArgs e) Q SessionUF?n?rodutoFV Z DridEie&?rodutos.Ro&sUe.Ne&Selected7nde.V.CellsU=V.Te.tP S

EQ Encerra o bloco de c2digo da Classe Consulta?roduto. S

Apostila de C# e ASP.Net
Come"ta"do o cdi#o da P7#i"a CadastroProd$to
>Q Cria umainstNncia da Classe ?rodutoController e define uma !ariG!el local do tipo string.

130 de 168

public partial class Cadastro?roduto > System. eb.:7.?age Q ?rodutoControllereSKL ?roduto Z ne& ?rodutoControllereSKL$)P string MsgErroP
@Q "efine a l2gica para o e!ento Load da pGgina Asp. Cadastro?roduto+ detectando se a pGgina 8G foi carregada $pelo parNmetro de sistema 7s?ost9ac')+ se n0o+ e se a !ariG!el de se/0o * ?n?roduto * diferente de I7ncluirJ.

protected !oid ?ageeLoad$ob8ect sender+ E!entArgs e) Q if $$R7s?ost9ac') aa $RSessionUF#peracaoFV.E,uals$F7ncluirF)))


Q

@.> * ?reenche a !ariG!el de se/0o #ld?roduto com o "ataTable resultante do m*todo Det?roduto.

SessionUF#ld?rodutoFV Z ?roduto.Det?roduto$Con!ert.To7nthc$SessionUF?n?rodutoFV))P
@.@ * ?reenche a propriedade Te.t do ob8eto Te.t9o."escricao com o campo "escricao do ob8eto ?roduto. Este

ob8eto foi carregado com o registro obtido pelo m*todo Det?roduto 8unto ao m*todo sub8acente na Classe ?roduto da NameSpaceSKL. Te.t9o."escricao.Te.t Z ?roduto."escricaoP
@.A * # memso ,ue o item anterior+ mas para o ob8eto Te.t9o.?reco. Repare a fun/0o ToString da Classe Con!ert a8ustando o !alor do campo ?reco de ?roduto ,ue * do tipo "ecimal $ponto flutuante).

Te.t9o.?reco.Te.t Z Con!ert.ToString$?roduto.?reco)P
@.B * Encerram respecti!amente a fun/0o 7f e o bloco do procedimento ?ageeLoad.

S AQ ?rocedimento referente ao e!ento Clic' do ob8eto 9uttonConfirmar. Comentando> A.>Q "eclara/0o do procedimento e in5/io do bloco do procedimento. protected !oid 9uttonConfirmareClic'$ob8ect sender+ E!entArgs e) Q A.@Q Estrutura 7f !eificando se a !ariG!el de se/0o #peracao * igual a I7ncluirJ. Se for+ e.ecuta o m*todo 7nserir?rodutoMo!imento $,ue mapeia o mesmo m*todo na camada Model ?roduto) retornando a mensagem de erro $se hou!er) para !arG!el de classe MsgErro. if $SessionUF#peracaoFV.E,uals$F7ncluirF)) Q MsgErro Z ?roduto.7nserir?rodutoMo!imento$Te.t9o."escricao.Te.t+ decimal.?arse$Te.t9o.?reco.Te.t))P S

Apostila de C# e ASP.Net

131 de 168

A.AQ Eerifica em else if $primeira condi/0o else da estrutura 7f) se #peracao * igual a IAlterarJ. Sendo+ passa para o m*todo Set#ld $seu parNmetro tipo "ataTable) da instNncia de ?rodutoController o conte-do da !ariG!el de escopo Session+ con!ertendo6o para um tipo "ataTable. # m*todo Set#ld?roduto arma;ena nos campos p-blicos da Classe ?rodutoController relati!o aos campos ,ue ser0o utili;ados na chamada ao m*todo Alterar?roduto+ ,ue encapsulando o mesmo m*todo na Classe ?roduto+ utili;arG para os parNmetros da clGusula here do comando :pdate. Em seguida chama o M*todo Alterar?roduto passando os de!idos !alores para seus parNmetros. A,ui+ no!amente+ * atribuido para !ariG!el MsgErro+ a mensagem de erro resultante da e.ecu/0o do m*todo caso e.ista. else if $SessionUF#peracaoFV.E,uals$FAlterarF)) Q ?roduto.Set#ld?roduto$$"ataTable)SessionUF#ld?rodutoFV)P MsgErro Z ?roduto.Alterar?roduto$Te.t9o."escricao.Te.t+ decimal.?arse$Te.t9o.?reco.Te.t)+ ?roduto.#ld7d+ ?roduto.#ld"escricao+ ?roduto.#ld?reco)P S A.BQ # mesmo ,ue o item T.T+ mas para opera/0o de e.clus0o. else if $SessionUF#peracaoFV.E,uals$FE.cluirF)) Q ?roduto.Set#ld?roduto$$"ataTable)SessionUF#ld?rodutoFV)P MsgErro Z ?roduto.E.cluir?roduto$?roduto.#ld7d+ ?roduto.#ld"escricao+ ?roduto.#ld?reco)P S A.FQ Atribui a propriedade Te.t do controle LabelErro+ o !alor da !ariG!el MsgErro. Este controle e.ibe por interm*dio de sua propriedade Te.t+ na parte inferior da pGgina a mensagem de erro resultante da e.ecu/0o dos m*todos de neg2cio. LabelErro.Te.t Z MsgErroP MsgErro Z FFP S BQ :tili;ando como parNmetro o !alor da !ariG!el de se/0o ?aginaRetorno+ in!oca o m*todo Redirect do ob8eto Response para orientar o flu.o para o formulGrio Consulta?roduto+ neste caso. protected !oid 9uttonCancelareClic'$ob8ect sender+ E!entArgs e) Q Response.Redirect$SessionUF?aginaRetornoFV.ToString$))P S FQ Encerra o bloco de c2digo da Classe Cadastro?roduto. S

Apostila de C# e ASP.Net
Testa"do a Aplica.0o

132 de 168

>Q E.ecute a aplica/0o+ e pelo menu da pGgina de 7nde.+ selecione o item ?roduto fa;endo logo em seguida uma busca de produto iniciado pela letra ICJ. Confira esses passos obser!ando as figuras =W e =<.

Fi#$ra ?>

Fi#$ra ?@

Apostila de C# e ASP.Net

133 de 168

@Q Cli,ue sobre uma linha do DridEie&+ por e.emplo+ na linha do produto Celular Hing Ling+ e em seguida no bot0o Alterar. Como conse,u(ncia serG e.ibido a pGgina representada pela figura =T. ?romo!a alguma altera/0o+ confirme e !olte a pGgina de consulta.

Fi#$ra ?A

Apostila de C# e ASP.Net
Pro=eto Oe(Ser2ices em C#

134 de 168

Proposta: "esen!ol!er um ebSer!ice para controlar as !endas em nosso site. Oe( ser2ice * uma solu/0o utili;ada na integra/0o de sistemas e na comunica/0o entre aplica/1es diferentes. Com esta tecnologia * poss5!el ,ue no!as aplica/1es possam interagir com a,uelas ,ue 8G e.istem e ,ue sistemas desen!ol!idos em plataformas diferentes se8am compat5!eis. #s eb ser!ices s0o componentes ,ue permitem 3s aplica/1es en!iar e receber dados em formato HML. Cada aplica/0o pode ter a sua pr2pria FlinguagemF+ ,ue * tradu;ida para uma linguagem uni!ersal+ o formato HML. ?ara as empresas+ os eb ser!ices podem tra;er agilidade para os processos e efici(ncia na comunica/0o entre cadeias de produ/0o ou de log5stica. Toda e ,ual,uer comunica/0o entre sistemas passa a ser dinNmica e principalmente segura+ pois n0o hG inter!en/0o humana. Essencialmente+ o eb Ser!ice fa; com ,ue os recursos da aplica/0o do soft&are este8am dispon5!eis sobre a rede de uma forma normali;ada. #utras tecnologias fa;em a mesma coisa+ como por e.emplo+ os bro&sers da 7nternet acedem 3s pGginas eb dispon5!eis usando por norma as tecnologias da 7nternet+ BTT? e BTML. No entanto+ estas tecnologias n0o s0o bem sucedidas na comunica/0o e integra/0o de aplica/1es. E.iste uma grande moti!a/0o sobre a tecnologia eb Ser!ice pois possibilita ,ue diferentes aplica/1es comuni,uem entre si e utili;em recursos diferentes. :tili;ando a tecnologia eb Ser!ice+ uma aplica/0o pode in!ocar outra para efetuar tarefas simples ou comple.as mesmo ,ue as duas aplica/1es este8am em diferentes sistemas e escritas em linguagens diferentes. ?or outras pala!ras+ os eb Ser!ices fa;em com ,ue os seus recursos este8am dispon5!eis para ,ue ,ual,uer aplica/0o cliente possa operar e e.trair os recursos fornecidos pelo eb Ser!ice. #s eb Ser!ices s0o identificados por um :R7 $:ni,ue Resource 7dentifier)+ descritos e definidos usando HML $E.tensible Mar'up Language). :m dos moti!os ,ue tornam os eb Ser!ices atrati!os * o fato deste modelo ser baseado em tecnologias standards+ em particular HML e BTT? $Byperte.t Transfer ?rotocol). #s eb Ser!ices s0o utili;ados para disponibili;ar ser!i/os interati!os na eb+ podendo ser acessados por outras aplica/1es usando+ por e.emplo+ o protocolo S#A? $Simple #b8ect Access ?rotocol). # ob8eti!o dos eb Ser!ices como * a comunica/0o aplica/0o para aplica/0o atra!*s da 7nternet. Esta comunica/0o * reali;ada com intuito de facilitar EA7 $Enterprise Application 7ntegration) ,ue significa a integra/0o das aplica/1es de uma empresa+ ou se8a+ interoperabilidade entre a informa/0o ,ue circula numa organi;a/0o nas diferentes aplica/1es como+ por e.emplo+ o com*rcio eletr2nico com os seus clientes e seus fornecedores. Esta intera/0o constitui o sistema de informa/0o de uma empresa. E para al*m da interoperabilidade entre as aplica/1es+ a EA7 permite definir um &or'flo& entre as aplica/1es e pode constituir uma alternati!a aos ER? $Enterprise Resource ?lanning). Com um &or'flo& * poss5!el optimi;ar e controlar processos e tarefas de uma determinada organi;a/0o. Padr0o # TC+ #AS7S s0o as institui/1es responsG!eis pela padroni;a/0o dos eb Ser!ices. Empresas como 79M e Microsoft+ duas das maiores do setor de tecnologia+ ap2iam o desen!ol!imento deste padr0o. Segundo o TC $ orld ide eb Consortium) um eb Ser!ice define6se como> um sistema de soft&are pro8etado para suportar a interoperabilidade entre mG,uinas sobre rede. Tem uma rela/0o descriti!a num formato machine6processable+ especificamente S"L $ ebser!ice "escription Language). #utros sistemas interagem com o eb Ser!ice usando as mensagens S#A?+ tipicamente sobre BTT? com HML na 8un/0o com outros standards da eb. Tec"olo#ias As bases para a constru/0o de um eb ser!ice s0o os padr1es HML e S#A?. # transporte dos dados * reali;ado normalmente !ia protocolo BTT? ou BTT?S para cone.1es seguras $o padr0o n0o determina o protocolo de transporte). #s dados s0o transferidos no formato HML+ encapsulados pelo protocolo S#A?. Se#$ra".a Muitas empresas temiam+ no passado+ pro!er funcionalidades na 7nternet de!ido ao medo de e.por seus dados. Mas com ad!ento dos eb Ser!ices elas podem publicar ser!i/os de forma simples e ,ue s0o totalmente isolados da base de dados. A seguran/a dos eb Ser!ices * um dos pontos fracos desta tecnologia. # problema n0o * a falta de mecanismos de seguran/a mas sim a falta de consenso em ,ual de!e ser o mecanismo a ser adoptado pela tecnologia eb Ser!ice+ As ,uest1es mais rele!antes na seguran/a s0o as seguintes> 6 Autenticidade $ter a certe;a ,ue uma transac/0o do eb Ser!ice ocorreu entre o ser!idor e seu clienteP 6 ?ri!acidade $todas as mensagens trocadas entre o ser!idor e o cliente n0o s0o interceptadas por uma pessoa n0o autori;ada)P 6 7ntegridade $as mensagens en!iadas tanto pelo ser!idor ao cliente+ como o contrGrio+ de!em permanecer inalteradas). Em seguida descre!e6 se os principais mecanismos de seguran/a.

Apostila de C# e ASP.Net

135 de 168

SSL # SSL $Secure Soc'et Layer) UNetscape WgghV ,uando aplicado a pe,uenos dispositi!os oferece autentica/0o+ integridade de dados e pri!acidade de ser!i/os. Atualmente+ a solu/0o para en!iar informa/0o confidencial para eb Ser!ices * utili;ar um mecanismo de seguran/a SSL sobre BTT? tamb*m conhecido como BTT?S $Byperte.t Transfer ?rotocol Secure). Este mecanismo protege informa/1es confidenciais e * fGcil de ser configurado. Tem como des!antagem ser mais lento do ,ue as transac/1es BTT? n0o encriptadas pelo ,ue n0o * ade,uado para ta.as de transfer(ncias de dados ele!adas. ZML S')NAT9 E A HML Signature U7ET% e TC <===V * uma iniciati!a con8unta da 7ET% $7nternet Engineering Tas' %orce) e do TC para especificar uma sinta.e HML e regras de processamento para cria/0o e representa/0o digital de assinaturas. As !antagens na utili;a/0o da HML Signature+ ao contrGrio de outras normas de assinaturas digitais+ est0o baseadas na independ(ncia da linguagem de programa/0o+ fGcil interpreta/0o humana e independ(ncia do fabricante. Esta tecnologia tamb*m permite assinar digitalmente subcon8untos de um documento HML. ZML ENC [PT'-N A HML Encryption U7ET% e TC <==<V especifica um processo para encripta/0o de dados e sua representa/0o em formato HML. #s dados podem ser dados arbitrGrios $incluindo um documento HML)+ elementos HML ou conte-dos de elementos HML. :m documento HML ,ue utili;a a HML Encryption pode ser !isto por ,ual,uer utili;ador+ mas apenas o proprietGrio da cha!e de descodifica/0o conseguirG compreender o conte-do codificado. OSQSEC9 'T[ # S6Security $ eb Ser!ices Security) * uma iniciati!a con8unta de empresas como Microsoft+ 79M e Eerisign destinada ao uso da HML6Signature e da HML6Encryption para fornecer seguran/a 3s mensagens S#A?. # S6 Security * um esfor/o destinado a fa;er com ,ue os eb Ser!ices trabalhem melhor em um ambiente global. # S6Security tamb*m inclui alguns importantes componentes como encaminhamento+ confian/a e tratamento de transa/1es. SAML # SAML $Security Assertion Mar'up Language) U#AS7S <==WV * uma norma emergente para a troca de informa/0o sobre autentica/0o e autori;a/0o. # SAML soluciona um importante problema para as aplica/1es da pr2.ima gera/0o+ ,ue * a possibilidade de utili;adores transportarem seus direitos entre diferentes eb Ser!ices. 7sto * importante para aplica/1es ,ue tencionam integrar um n-mero de eb Ser!ices para formar uma aplica/0o unificada. Limita.<es associados aos Oe( Ser2ices Apesar da sua grande popularidade e relati!a simplicidade+ o S#A? tem !Grias limita/1es+ ,ue por sua !e; os eb Ser!ices tamb*m sofrem essas limita/1es pois utili;am o S#A?. As limita/1es s0o descritas em seguida> r Seguran/a e pri!acidade nenhuma das !ers1es do S#A? define ,ual,uer tipo de seguran/a. 7sto * de!ido ao S#A? utili;ar BTT?+ mas para implementar mecanismos de seguran/a ao n5!el da rede pode utili;ar o protocolo SSL no BTT? $tamb*m conhecido como BTT?S) para garantir a confidencialidade+ a integridade e a autentica/0o do cliente+ do ser!idor e da comunica/0o cifrada. Como n0o e.iste um suporte para seguran/a+ ,ue inclui a pri!acidade+ nas normas ,ue comp1em os eb Ser!ices+ tem le!ado cada pro8eto a procurar diferentes solu/1es para resol!er o problema da seguran/a o ,ue se torna incompat5!el com a promessa de implementar uma normali;a/0o a n5!el global. r Mensagens e encaminhamento para suportar as funcionalidades das mensagens ass5ncronas tradicionais r Kualidade de ser!i/o e fiabilidade para garantir tempos de resposta e detectar e.cep/1es r ?rocessamento transaccional para suportar comunica/0o transaccional+ para associar essa comunica/0o transaccional com as transac/1es locais e para participar em transac/1es distribu5das r Dest0o para controlar o estado e comportamento dos eb Ser!ices r "esempenho para optimi;ar a e.ecu/0o dos eb Ser!ices ,ue tem implica/1es ao n5!el do desenho das aplica/1es+ chamadas remotas+ caracter5sticas da rede e arma;enamentoCprocessamento dos documentos r 7nteroperabilidade suportar a interopera/0o sem problemas * o grande ob8eti!o dos eb Ser!ices e do S#A?+ ou se8a+ fornecerem uma plataforma de integra/0o entre aplica/1es e diferentes linguagens e implementados em ,ual,uer sistema operati!o. Assim esta tecnologia seria uma tecnologia normali;ada mas+ no entanto+ e.istem ri!alidades entre fornecedores. ?or e.emplo+ o AH7S $implementa/0o S#A? do pro8eto Apache) n0o * compat5!el com .Net da Microsoft+ por isso gera interfaces em dois formatos+ uma para consumo pr2prio e outra diferente para o .Net ser compat5!el com o A.is. ?ara resol!er este problema e.iste !Grias abordagens para resol!er este problema como o S#A?9uilders 7nteroperability Lab ,ue fornece uma plataforma para testar a interoperabilidade dos produtos.

Apostila de C# e ASP.Net

136 de 168

'"te#ra.0o de sistemas Muitos consideram ,ue os eb ser!ices corrigem um grande problema da informGtica> a falta de integra/0o de sistemas. #s eb ser!ices permitem ,ue a integra/0o de sistemas se8a reali;ada de maneira compreens5!el+ reutili;G!el e padroni;ada. L uma tentati!a de organi;ar um cenGrio cercado por uma grande !ariedade de diferentes aplicati!os+ fornecedores e plataformas. - f$t$ro dos Oe( Ser2ices Acredita6se ,ue no futuro as empresas ir0o listar seus eb ser!ices em diret2rios p-blicos $:""7)+ de onde poder0o ser !endidos como ser!i/os para outras empresas+ institui/1es ou usuGrios comuns... Tec"olo#ias 9tiliYadas ?ara a representa/0o e estrutura/0o dos dados nas mensagens recebidasCen!iadas * utili;ado o HML $eHtensible Mar'up Language). As chamadas 3s opera/1es+ incluindo os parNmetros de entradaCsa5da+ s0o codificadas no protocolo S#A? $Simple #b8ect Access ?rotocol+ baseado em HML). #s ser!i/os $opera/1es+ mensagens+ parNmetros+ etc.) s0o descritos usando a linguagem S"L $ eb Ser!ices "escription Language). # processo de publica/0oCpes,uisaCdescoberta de eb Ser!ices utili;a o protocolo :""7 $:ni!ersal "escription+ "isco!ery and 7ntegration). ZML E.tensible Mar'up Language $HML) * a base em ,ue os eb Ser!ices s0o constru5dos. # HML fornece a descri/0o+ o arma;enamento+ o formato da transmiss0o para trocar os dados atra!*s dos eb Ser!ices e tamb*m para criar tecnologias eb Ser!ices para a troca dos dados. A sinta.e de HML usada nas tecnologias dos eb Ser!ices especifica como os dados s0o representados genericamente+ define como e com ,ue ,ualidades de ser!i/o os dados s0o transmitidos+ pormenori;a como os ser!i/os s0o publicados e descobertos. #s eb Ser!ices descodificam as !Grias partes de HML para interagir com as !Grias aplica/1es. S-AP # S#A? $Simple #b8ect Access ?rotocol) baseia6se numa in!oca/0o remota de um m*todo e para tal necessita de especificar o endere/o do componente+ o nome do m*todo e os argumentos para esse m*todo. Estes dados s0o formatados em HML com determinadas regras e en!iados normalmente por BTT? para esse componente. N0o define ou imp1e ,ual,uer semNntica+ ,uer se8a o modelo de programa/0o+ ,uer se8a a semNntica espec5fica da implementa/0o. Este aspecto * e.tremamente importante+ pois permite ,ue ,uer o ser!i/o+ ,uer o cliente ,ue in!oca o ser!i/o se8am aplica/1es desen!ol!idas sobre diferentes linguagens de programa/0o. ?or esta ra;0o+ o S#A? tornou6se uma norma aceite para se utili;ar com eb Ser!ices+ uma tecnologia constru5da com base em HML e BTT?. "esta forma+ pretende6se garantir a interoperabilidade e intercomunica/0o entre diferentes sistemas+ atra!*s da utili;a/0o da linguagem HML e do mecanismo de transporte BTT? ou outro como+ por e.emplo+ SMT?. # S#A? permite ,ue os documentos HML de en!io e de recep/0o sobre a eb suportem um protocolo comum de transfer(ncia de dados para uma comunica/0o de rede efica;+ ou se8a+ o S#A? pro!idencia o transporte de dados para os eb Ser!ices. Em rela/0o a eb+ o S#A? * um protocolo de R?C ,ue funciona sobre BTT? $ou SMT?+ ou outro) de forma a ultrapassar as restri/1es de seguran/aCfire&alls normalmente impostas aos sistemas clGssicos de R?C $RM7+ "C#M+ C#R9AC77#?) suportando mensagens HML. Em !e; de usar BTT? para pedir uma pGgina BTML para ser !isuali;ada num bro&ser+ o S#A? en!ia uma mensagem de HML atra!*s do pedido BTT? e recebe uma resposta+ se e.istir+ atra!*s da resposta do BTT?. ?ara assegurar corretamente a transmiss0o da mensagem de HML+ o ser!idor de BTT?+ tais como Apache ou 77S $Microsoft 7nternet 7nformation Ser!er)+ recebe mensagens S#A? e de!e !alidar e compreender o formato do documento HML definido na especifica/0o S#A? !W.W. OS;L
L a sigla de eb Ser!ices "escription Language+ padr0o baseado em HML para descre!er o ser!i/o como no C#M+ onde ele tra; os m*todos do eb Ser!ice. %unciona como uma esp*cie de ITypeLibraryJ do eb Ser!ice+ al*m de ser usado para a !alida/0o das chamadas dos m*todos. # S"L $ eb Ser!ices "escription Language) * uma especifica/0o desen!ol!ida pelo TC ,ue permite descre!er os eb Ser!ices segundo um formato HML. # S"L * e.tens5!el para permitir a descri/0o dos ser!i/os e suas mensagens+ independentemente dos formatos de mensagem e dos protocolos de rede ,ue se8am usados. No entanto+ * comum usar6 se o M7ME $Multipurpose 7nternet Mail E.tensions) e o BTT?CS#A?. # S"L descre!e os ser!i/os disponibili;ados 3 rede atra!*s de uma semNntica HML+ este pro!idencia a documenta/0o necessGria para se chamar um sistema distribu5do e o procedimento necessGrio para ,ue esta comunica/0o se estabele/a. En,uanto ,ue o S#A? especifica a comunica/0o entre um cliente e um ser!idor+ o S"L descre!e os ser!i/os oferecidos.

Apostila de C# e ASP.Net

137 de 168

9;;' ?rotocolo desen!ol!ido para a organi;a/0o e registro de eb Ser!ices. # :""7 $:ni!ersal "escription "isco!ery and 7ntegration) * uma iniciati!a em desen!ol!imento no Nmbito do cons2rcio industrial :""7 promo!ido originalmente pela 79M+ Microsoft e Arriba+ com ob8eti!o de acelerar a interoperabilidade e utili;a/0o dos eb Ser!ices+ pela proposta de um ser!i/o de registo de nomes de organi;a/1es e de descri/0o do ser!i/o. :m registro :""7 cont*m tr(s tipos de informa/0o> r informa/1es gerais de cada organi;a/0o+ tais como o nome+ morada+ telefone e contatosP r informa/1es de organi;a/1es e ser!i/os por categorias de neg2ciosP r informa/1es t*cnicas sobre os ser!i/os pro!idenciados pelas organi;a/1es. # :""7 pro!idencia tr(s fun/1es principais+ conhecidas como publica/0o+ descoberta e liga/0o> W) publica/0o> permite ,ue uma organi;a/0o di!ulgue o$s) seu$s) ser!i/o$s)P <) descoberta> permite ,ue o cliente do ser!i/o+ procure e encontre um determinado ser!i/oP T) liga/0o $bind)> permite ,ue o cliente do ser!i/o+ possa estabelecer a liga/0o e interagir com o ser!i/o. OSQ' L o cons2rcio ,ue garante a integra/0o entre os Icon!ersar entre6siJ. eb Ser!ices para garantir sempre ,ue os eb Ser!ices possam

'"iciati2as em c$rso # sucesso ,ue os eb Ser!ices possam !ir a apresentar passa necessariamente pela !ontade da ind-stria+ pela partilha e abertura dos processos de normali;a/0o e das pr2prias especifica/1es da5 resultantes. ?arte significati!a desse processo tem sido desen!ol!ida no Nmbito do TC. No entanto+ de!er6se6G tamb*m referir outros esfor/os e cons2rcios ,ue t(m !indo a ser desen!ol!idos+ designadamente o :""7+ o ebHML+ ou o HMLCE"7. ?or e.emplo+ o ebHML * um esfor/o patrocinado pela :NCCE%ACT e pela #AS7S+ cu8o ob8eti!o * a produ/0o de um con8unto de especifica/1es para permitir colabora/1es de neg2cio eletr2nico. # standard ebHML pode ser !isto como uma e.tens0o 3s funcionalidades de descri/0o+ publica/0o e descoberta de ser!i/os $definidas no Nmbito do :""7)+ ao tratar os seguintes aspectos> como especificar os processos de neg2cioP como identificar os eb Ser!ices participantes e respecti!as colabora/1esP ou+ ,ue padr1es de negocia/0o e.istem na colabora/0o entre os participantes. Estes aspectos+ s0o tratados nomeadamente nas seguintes especifica/1es> W) es,uemas para especifica/0o de processos de neg2cio+ 9?SS $business process specification schema)P <) acordos de protocolos de colabora/0o+ C?A $collaboration protocol agreement)P T) ou perfis de protocolos de colabora/0o+ C?? $collaboration protocol profile). Co"tri($i.0o das empresas As principais empresas+ para al*m de promo!erem e participarem ati!amente nos !Grios cons2rcios de normali;a/0o+ t(m !indo a incorporar nas suas pr2prias infra6estruturas de desen!ol!imento e suporte de aplica/1es implementa/1es das normas ligadas aos eb Ser!ices. Entre outras+ merece refer(ncia a plataforma da Microsoft+ I.NetJ + da Sun+ I4a!a #NE $#pen Net En!ironment)J+ da Be&lett6?ac'ard+ Ie6spea'J e da 79M+ I79M eb Ser!icesJ . No2os Modelos de Ne#cio S2 o futuro dirG ,uem tem ra;0o> se os c*pticos ou conser!adores+ se os ,ue arriscam e concreti;am a sua !is0o. Com o conceito dos eb Ser!ices tal!e; o mais importante nem se8a a tecnologia em si+ mas toda uma discuss0o 3 !olta dos fatores econ2mico6pol5ticos ,ue este paradigma poderG suscitar+ bem como os modelos de neg2cio ,ue poder0o emergir. ?arece natural a emers0o de no!os portais+ n0o para as pessoas consultarem e usarem+ mas para as aplica/1es+ i.e.+ para os ser!i/os se registaremCpublicarem de modo a tornarem6se conhecidos+ descobertos e usados. Esses portais de ser!i/os $tecnicamente consiste em ser!i/os de registos :""7 eCou ebHML) poder0o ser definidos a n5!el global+ regional+ para dom5nios de neg2cio hori;ontais ou !erticais. No2os eU$isitos Tec"ol#icos No entanto e naturalmente+ no!os problemas e re,uisitos tecnol2gicos s0o colocados com o conceito dos eb Ser!ices. "esde logo+ ao n5!el da modela/0o destes ser!i/os e dos processos de neg2cio em ,ue a,ueles participam. Aspectos como a composi/0o de ser!i/os+ coordena/0o de flu.os de trabalho+ identifica/0o e pri!acidade+ seguran/a+ negocia/0o+ contratos e pagamentos+ tratamento de e.cep/1es+ categori;a/0o e ta.onomias de ser!i/os+ etc.+ de!er0o ser ade,uadamente in!estigados e tratados de forma ,ue este paradigma possa !ir a apresentar um largo consenso e sucesso.

Apostila de C# e ASP.Net

138 de 168

6a"ta#e"s e ;es2a"ta#e"s #s eb Ser!ices s0o modelos ,ue surgiram para o desen!ol!imento de aplica/1es t5picas de neg2cio eletr2nico+ en!ol!endo e suportando o estabelecimento da colabora/0o e negocia/0o de forma aberta+ distribu5da e dinNmica entre distintos parceiros. #s eb Ser!ices podem no futuro representar um sucesso significati!o por causa de e.istir um esfor/o significati!o+ por parte da maioria dos parceiros industriais+ na normali;a/0o das tecnologias en!ol!idas. As tecnologias sub8acentes aos eb Ser!ices $tais como BTT?+ S#A?+ S"L+ :""7+ HML) s0o abertas+ amplamente di!ulgadas e consensuais. ?or outro lado+ e.iste potencial para ha!er uma real independ(ncia das linguagens de programa/0o $4a!a+ CAA+ E9+ "elphi+ C@)+ das ar,uiteturas de computadores e sistemas operati!os+ o ,ue permite uma e!olu/0o mais sua!e e econ2mica para este modelo computacional. No entanto+ e.iste cr5ticas ,ue demonstram medos ou falsas e.pectati!as ,ue os in!estimentos em eb Ser!ices podem suscitar. :ma dessas cr5ticas di; respeito ao fato do S#A? * menos eficiente do ,ue os sistemas de R?C e.istentes. ?or e.emplo+ as mensagens $com os respecti!os en!elopes e descri/0o de tipos) trocadas entre as partes s0o descritas em formato de te.toCHML en,uanto ,ue nos sistemas clGssicos de R?C s0o trocadas em formato binGrio. No entanto+ esta des!antagem * compensada significati!amente pela facilidade de interopera/0o entre os ser!i/os+ sem os problemas conhecidos de seguran/aCfire&alls+ e pela facilidade de se esconder os detalhes proprietGrios das infra6estruturas de suporte.

Apostila de C# e ASP.Net
Cria"do Oe(Ser2ice

139 de 168

# ob8eti!o deste e.erc5cio+ * e.emplificar a cria/0o de um ebSer!ice para ser!ir de 7nterface Remota $pelo protocolo http) das classes de neg2cio do e.erc5cio NameSpaceSKL+ acessadas pela camada Eie&& e Controller. Com essa abordagem+ poderemos facilmente estender as funcionalidades da camada de neg2cio $Model) a aplicati!os+ se8am baseado em Asp.Net ou in%orm+ para acesso remoto. ?ara tanto+ necessitamos apenas construir o ebSer!ice com m*todos ,ue e.ponham as funcionalidades da camada Model permitindo acesso !ia http $ eb Reference no EisualStdio). Com essa atitude+ podemos classificar nosso pro8eto $Model+ ebSer!ice+ Controller e Eie&) n0o somente ade,uada ao paradigma MEC+ mas tamb*m agora+ como um aplicati!o baseado em #b8etos "istribu5dos. Passo ?> Conforme e.ibido na figura =W+ com o seu ambiente EisualStudio em e.ecu/0o+ crie um pro8eto AS?.NET Ser!ice+ definindo o local conforme definido. Repare ,ue optamos pela linguagem Eisual C@. eb

Fi#$ra ?>

Passo ?@ #bser!e o c2digo da Listagem =W+ gerado automaticamente+ representando a classe nomeada Ser!ice. Repare ainda o m*todo p-blico do tipo string+ denominado Bello orld+ criado automaticamente para pro8eto. Lista#em ?> using SystemP using System.Lin,P using System. ebP using System. eb.Ser!icesP using System. eb.Ser!ices.?rotocolsP using System.Hml.Lin,P U ebSer!ice$Namespace Z Fhttp>CCtempuri.orgCF)V U ebSer!ice9inding$ConformsTo Z si?rofiles.9asic?rofileWeW)V CC To allo& this eb Ser!ice to be called from script+ using AS?.NET A4AH+ uncomment the follo&ing line. CC USystem. eb.Script.Ser!ices.ScriptSer!iceV public class Ser!ice > System. eb.Ser!ices. ebSer!ice Q public Ser!ice $) Q CC:ncomment the follo&ing line if using designed components CC7nitiali;eComponent$)P S

Apostila de C# e ASP.Net
U ebMethodV public string Bello orld$) Q return FBello orldFP S S

140 de 168

Nota: Eale obser!ar o m*todo Bello ord+ ,ue * precedido de uma anota/0o IU ebMethodVJ garantido ao mesmo e.posi/0o para os aplicati!os consumidores do ebSer!ice. #utros m*todos podem e.istir+ mas n0o necessariamente sendo e.postos aos aplicati!os consumidores+ bastando apenas n0o serem precedido da referida anota/0o. Naturalmente m*todos n0o anotados com U emMethodV+ s2 podem ser acessados por outros m*todos da classe+ anotados ou n0o. Passo ?A E.ecute o pro8eto e tenha uma surpresa+ pois sem nenhum esfor/o temos uma aplica/0o de teste e.pondo um lin' para o m*todo Bello ord. Cinfira na %igura =T. Este precedimento+ e.ecutar o ebSer!ice e termos uma resposto na 9ro&se * uma facilidade ,ue temos no ambiente do EisualStudio+ mas ,ue * limitado para testes preliminares e principalmente para debug. Nota: Conforme demonstrado na %igura =<+ * e.ibido a cai.a de dialogo "ebuggging Not Enabled solicitando permiss0o ou n0o para configura/0o do ar,ui!o eb.Config+ ,ue se positi!o+ habilitarG o recurso de IdebugJ pra nosso ebSer!ice.

Fi#$ra ?@

Fi#$ra ?A "ando continuidade ao ?asso =T+ se orientando pelas %iguras =c e =d+ finali;e o teste conferindo o resultado.

Apostila de C# e ASP.Net

141 de 168

Fi#$ra ?B

Fi#$ra ?F Passo ?B Eisando alinhar os nomes das classes de nosso ebSer!ice com os ob8etos de neg2cio da camada Modelo+ renomeie tanto o nome da classe ,uanto o m*todo construtor para S?roduto reflitindo o definido nas Listagem =<. A %igura =h e.ibe a cai.a de dialogo Soluction E.plore do pro8eto ap2s as altera/1es promo!idas. Lista#em ?@ public class OSProd$to > System. eb.Ser!ices. ebSer!ice Q public OSProd$to$) Q S \ Cdi#o omitido aU$i.

Fi#$ra ?I

Apostila de C# e ASP.Net

142 de 168

Passo ?F Acrescente o m*todo Retorna?roduto+ preocupando6se em anotG6lo com U ebMethodV para ,ue tenha !isiblidade para os clientes consumidores do ebSer!ice. A Listagem =T contem todo o c2digo fonte da classe S?roduto+ incluindo * claro as modifica/1es e acr*scimos relati!os ?assos =c e =d+ em negrito para facilitar. Lista#em ?A 1. using SystemP 2. using System.Lin,P 3. using System. ebP 4. using System. eb.Ser!icesP 5. using System. eb.Ser!ices.?rotocolsP 6. using System.Hml.Lin,P 7. using System."ataP f. 9. U ebSer!ice$Namespace Z Fhttp>CCtempuri.orgCF)V 10. U ebSer!ice9inding$ConformsTo Z si?rofiles.9asic?rofileWeW)V WW. 12. public class OSProd$to > System. eb.Ser!ices. ebSer!ice WT. Q 14. public OSProd$to$) 15. Q 16. S Wi. 18. U ebMethodV 19. public string Bello orld$) Q 20. return FBello orldFP 21. S <<. 23. ]Oe(Met/od^ 24. p$(lic ;ataTa(le etor"aProd$to!Stri"# ;escricao% 25. L 26. NameSpaceSTL.Prod$to Prod$to C NameSpaceSTL.Prod$to!%H 27. ret$r" Prod$to. etor"aProd$to!;escricao%H 28. M <g. T=. S Come"ta"do a Lista#em oA Li"/a Wc <T <c <h <i Come"t7rio M*todo construtor da classe. Anota/0o ,ue torna o m*todo acess5!el aos clientes $consumidores do ebSer!ice).

"efine um m*todo p-blico ,ue implementa um parNmetro do tipo String+ retornando um tipo "ataTable $Collection). Cria uma instNncia do ob8eto $classe) ?roduto da NameSpaceSKL anteriormente referenciada. E.ecuta o m*todo da Classe produto+ retornando uma lista $"ataTable) de produtos.

Apostila de C# e ASP.Net

143 de 168

Passo ?I %inali;ando a implementa/0o+ altere o c2digo do ar,ui!o S?roduto.asm. + definindo o no!o nome da Classe. #riginalmente o nome era Ser!ice+ a,ui estamos renomeando para S?roduto conforme linhas de c2digo abai.o. 6ers0o -ri#i"al [`_ ebSer!ice LanguageZFC@F Code9ehindZFjCAppeCodeCSer!ice.csF ClassZFSer!iceF `\ 6ers0o Modificada [`_ ebSer!ice LanguageZFC@F Code9ehindZFjCAppeCodeCSer!ice.csF ClassZWOSProd$toW `\

Passo ?J %a;endo !aler o benef5cio fornecido pela ferramente+ em implementar um aplicati!o de teste de consumo de m*todos de nosso ebSer!ice+ utili;e a op/0o de menu "ebug b Start "ebuggin para e.ecutar o teste. 9aseado na imagem da %iguras =i+ cli,ue no lin' Retorna?roduto+ e em seguida+ agora se orientando pela imagem da %igura =f+ preencha o campo I"escricaoJ com a letra ICJ clicando no bot0o I7n!o'eJ para ,ue o m*todo se8a e.ecutado no ebSer!ice. A Listagem =c e.ibe em formato HML o pacote de dados retornado pelo m*todo+ e.ibindo os registros da tabela ?roduto ,ue tem descri/0o iniciada com a letra ICJ passado como parNmetro. Nota: Apesar da afirma/0o anterior+ na prGtica+ nosso ebSer!ice n0o acessa a tabela ?roduto no banco de dados. Na !erdade ela submete uma chamado ao m*todo relati!o na Camada de Neg2cio+ e esse sim interge com a base de dados.

Fi#$ra ?J

Fi#$ra ?E

Apostila de C# e ASP.Net
Lista#em ?B V;ataTa(leX [.s>schema idZFNe&"ataSetF\ [.s>element nameZFNe&"ataSetF msdata>7s"ataSetZFtrueF msdata>Main"ataTableZFTableF msdata>:seCurrentLocaleZFtrueF\ [.s>comple.Type\ [.s>choice min#ccursZF=F ma.#ccursZFunboundedF\ [.s>element nameZFTableF\ [.s>comple.Type\ [.s>se,uence\ V+s:eleme"t "ameCW'dW t&peCW+s:lo"#W mi"-cc$rsCW?W,X V+s:eleme"t "ameCW;escricaoW t&peCW+s:stri"#W mi"-cc$rsCW?W,X V+s:eleme"t "ameCWPrecoW t&peCW+s:decimalW mi"-cc$rsCW?W,X [C.s>se,uence\ [C.s>comple.Type\ [C.s>element\ [C.s>choice\ [C.s>comple.Type\ [C.s>element\ [C.s>schema\ Vdiff#r:diff#ramX VNew;ataSetX VTa(le diff#r:idCWTa(le>W msdata:row-rderCW?WX [7d\W[C7d\ ["escricao\Celular Sony <<TT[C"escricao\ [?reco\<<T.==[C?reco\ V,Ta(leX [Table diffgr>idZFTable<F msdata>ro&#rderZFWF\ [7d\T[C7d\ ["escricao\CNmera %u8i T.i[C"escricao\ [?reco\Td=.==[C?reco\ V,Ta(leX VTa(le diff#r:idCWTa(leAW msdata:row-rderCW@WX [7d\g[C7d\ ["escricao\Caneta La;er[C"escricao\ [?reco\W=g.==[C?reco\ V,Ta(leX VTa(le diff#r:idCWTa(leBW msdata:row-rderCWAWX [7d\Wd[C7d\ ["escricao\Celular Hing Ling[C"escricao\ [?reco\WWT.==[C?reco\ V,Ta(leX VTa(le diff#r:idCWTa(leFW msdata:row-rderCWBWX [7d\WW<[C7d\ ["escricao\Cadeira Sem 9ra/o para Micro[C"escricao\ [?reco\cc.==[C?reco\ V,Ta(leX VTa(le diff#r:idCWTa(leIW msdata:row-rderCWFWX [7d\WWT[C7d\ ["escricao\Cadeira Com9ra/o para Micro[C"escricao\ [?reco\W==.==[C?reco\ V,Ta(leX V,New;ataSetX V,diff#r:diff#ramX V,;ataTa(leX

144 de 168

Apostila de C# e ASP.Net
Co"fi#$ra"do o ''S !'"ter"et '"formatio" Ser2ices%

145 de 168

?ara ,ue possamos fa;er uso do ebSer!ice S?roduto+ referenciando6o em nosso pro8eto Asp.Net $Camada Eie&) e consumir seus m*todos siga os passos a seguir. Eale ressaltar+ ,ue apesar de podermos testar nosso ebSer!ice diretamente no ambiente do EisualStudio+ * necessGrio disponibili;armos o ser!i/o em um Ser!idor eb+ em nosso caso * claro o 77S da Microsoft. Passo ?> E.ecute o utilitGrio 77S+ tendo como refer(ncia a %igura =W+ cli,ue com o bot0o direito do mouse sobre o n2 ISite da eb ?adr0oJ+ escolhendo a op/0o INo!o b "iret2rio Eirtual...J. Com isso iniciamos o passo6a6passo para cria/0o de um diret2rio !irtual ,ue ser!irG de refer(ncia de acesso ao nosso ebSer!ice por interm*dio de uma :RL. ?ara tanto+ os clientes consumidores do ebSer!ice implementar0o uma :RL por interm*dio do protocolo BTT? conforme e.emplo a seguir. E+emplo de 9 L com Protocolo NTTP http>YYMeuSer!idorYNome"iretorioEirtualY S?roduto.asm.

Fi#$ra ?>

Ainda neste passo+ cli,ue no bot0o IA!an/arJ na cai.a de dialogo apresentada em fun/0o da a/0o anterior para prosseguir na cria/0o do "iret2rio Eirtual para acesso ao pro8eto ebSer!ice. A %igura =< resume isso.

Fi#$ra ?@

Apostila de C# e ASP.Net

146 de 168

Passo ?@ "ando continuidade+ defina o nome I S?rodutoJ na propriedade IAliasJ da cai.a de dialogo representada pela %igura =T. Esse naturlmente serG o nome do "iret2rio Eirtual+ o melhor resumindo+ o nome de refer(ncia na :RL para acesso ao pro8eto ebSer!ice.

Fi#$ra ?A

Passo ?A Conforme demonstrado na imagem da %igura =c aponte para o diret2rio ,ue contem o pro8eto ebSer!ice+ indicando ao 77S onde encontrar os ser!i/os solicitados pela :RL ,ue in!ocarG classes de S?roduto. Cli,ue no bot0o IA!an/arJ para prosseguir no processo.

Fi#$ra ?B

Passo ?B A Cai.a de dialogo e.ibida ap2s o passo anterior+ %igura =d+ permite configurar caracter5sticas ,ue ir0o autori;ar ou n0o $dar permiss0o) ao 7SS de e.ecu/0o aos scripts Asp.Net. ?roceda como e.ibida na imagem da %igura =d+ clicando no bot0o IA!an/arJ.

Apostila de C# e ASP.Net

147 de 168

Fi#$ra ?F Passo ?F 9asta clicar no bot0o IConcluirJ da %igura =h+ assim+ encerrando os passos necessGrios para di!ulgarmos nosso ebSer!ice. A %igura =i demonstra nosso "iret2rio Eirtual $Alias de acesso ao ebSer!ice) de!idamente configurado.

Fi#$ra ?I

Fi#$ra ?J

Apostila de C# e ASP.Net
Co"s$mi"do o Oe(Ser2ice "a Aplica.0o Oe(

148 de 168

Passo ?> 9asicamnete fa;emos uma refer(ncia ao ebSer!ice al!o+ clicando com o bot0o direito do mouse no n2 do pro8eto eb e selecionando a op/0o do menu de conte.to IAdd eb Reference...J. Eoc( pode acionar esta op/0o orientando6se pela imagem da %igura =W.

Fi#$ra ?>

Passo ?@ #rientando6se pela %igura =<+ complete a a/0o anterior preenchendo a :RL de acesso ao Naturalmente de!emos montar a referida :RL coonforme es,uema a seguir> 6 6 6 6 BTT?>CC N-mero 7? do Ser!idor ou Nome do Ser!idorC Nome do Alias criado no 77SC Nome do ar,ui!o ASMH ,ue representa o ebSer!ice

ebSer!ice.

Em nosso e.emplo ficaria ent0o assim> /ttp:,,OS@@@,OSProd$to,OSProd$to.asp+

Fi#$ra ?@ "efina um nome para o ?ro. no campo I eb reference nameJJclicando em seguida no bot0o IAdd ReferenceJ. Asiim procedendo+ conforme obser!ado na Soluction E.plore do pro8eto $%igura =T) #bti!emos uma classe $?ro.i) mapeando os m*todos e o endere/o dos mesmos para acesso ao ebSer!ice.

Apostila de C# e ASP.Net

149 de 168

Fi#$ra ?A

Passo ?A %inali;ando esta etapa+ obser!e a o c2digo da Listagem =W onde+ em negrito+ procedemos as altera/1es necessGrias para utili;a/0o do m*todo Retorna?roduto do ebSer!ice. 9asicamente criamos um ob8eto denominado S?roduto ,ue herda da classe $?ro.i) S?roduto+ e em seguida fi;emos uso do m*todo referido+ atribuindo o tipo de retorno $"ataTable) a propriedade "ataSource do DridEie&. public partial class Consulta?roduto > System. eb.:7.?age Q CC?rodutoControllereSKL ?rod Z ne& ?rodutoControllereSKL$)P OSProd$to.OSProd$to OSProd$to C "ew OSProd$to.OSProd$to!%H protected !oid 9utton?es,uisareClic'$ob8ect sender+ E!entArgs e) Q CCDridEie&?rodutos."ataSource Z ?rod.#bter?roduto$Te.t9o."escricao?roduto.Te.t)P )rid6iewProd$tos.;ataSo$rce C OSProd$to. etor"aProd$to!Te+t8o+;escricaoProd$to.Te+t%H DridEie&?rodutos."ata9ind$)P S . . . C2digo restante da classe omitido a,ui.

Apostila de C# e ASP.Net
)era"do elatrios com Cr&stal eport

150 de 168

# gerador de relat2rios CrystalReport ,ue utili;aremos a,ui+ * parte integrante do EisualStudio. Na prGtica+ o produto+ * distribu5do $comerciali;ado) em separado pela proprietGria do produto+ e nada impede ,ue utili;amos o mesmo para desen!ol!er nossos modelos de relat2rios. :ma prGtica comum no desen!ol!imento de relat2rios com CrystalReport+ * in8etar instru/0o SKL para obter os dados 8unto a uma fonte de dados+ e a partir desta instru/0o+ em tempo de desen!ol!imento+ utili;ar o 7"E do produto para modelar os dados do relat2rio. 7sto n0o faremos+ pois desde o in5cio de nosso pro8eto temos tido a de!ida aten/0o para n0o fugir ao padr0o MEC+ logo+ neste caso+ em se tratando o relat2rio de um componente da camada Eie&+ n0o poder5amos cometer o engando de tornarmos o mesmo dependente e acoplado a fonte de dados $9anco de "ados). # ,ue faremos a,ui ent0oM Eamos desen!ol!er o Lay6#ut de nossos relat2rios a partir dos atributos de nossa classes+ e em seguida+ utili;armos os mesmos na camada Eie&+ atribuindo aos mesmos o resultado retornado pelos m*todos de neg2cio ,ue retornam cole/1es de dados por interm*dio de um "ataTable. 7gualmente aos controles de dadosde cole/0o como DridEie&+ List9o. entre outros+ os relat2rios gerados a partir do CrystalReport implementam a propriedade "ataSource para ,ual atribuiremos os tais "ataTable retornados pelos m*todos de obten/0o de registros. Passo ?> 9aseado no e.posto na %igura =W+ adicione um diret2rio na estrutura de diret2rios do nosso pro8eto CamadaeModeleSK nomeando6o como R?T. Este diret2rio acomodarG nossos modelos de relat2rios gerados pelo CrystalReport. # resultado ficarG semelhante ao representado na %igura =<.

Fi#$ra ?>

Apostila de C# e ASP.Net

151 de 168

Fi#$ra ?@ Passo ?@ #rientando6se pela %igura =T+ =c e =d+ adicione um no!o item ao pro8eto+ a saber+ um relat2rio CrystalReport. Repare ,ue optamos nesta fase por um relat2rio em branco+ abrindo m0o do a8udador do ambiente CrystsalReport.

Fi#$ra ?A

Apostila de C# e ASP.Net

152 de 168

Fi#$ra ?B

Fi#$ra ?F Passo ?A As %iguras =h e =i+ respecti!amente e.ibem a Grea de Lay6#ut do relat2rio e a paleta de componentes $Tollbo.) onde podemos buscar controles !isuais para te.to e forma a ser aplicado a Grea de design. A Grea de Lay6#ut como podemos obser!ar+ * di!idia em Sessions ,ue representam as bandas de um relat2rio.

Apostila de C# e ASP.Net

153 de 168

Fi#$ra ?I

Fi#$ra ?J Passo ?B 7niciando o desenho de nosso relat2rio+ no tocante a modelagem de dados a ser e.ibido+ acesse a cai.a de dialogo %ield E.plores+ precisamente no n2 "atabase %ields+ cli,ue com o bot0o direito do mouse sobre este n2 selecionando "atabase E.pert entre as op/1es.

Fi#$ra ?E

Passo ?F Na cai.a de dialogo representada pela %igura =g+ acesse o n2 Net #b8ects dentro da estrutura de n2s de ?ro8ect "ata. Assim+ teremos acesso a todas as classes $modelos) do pro8eto+ sendo ,ue para nosso e.emplo optaremos por ListaMo!imento da NameSpaceSKL. ?or fim cli,ue na seta $\) para selecionar o modelo ,ue !ai fornecer os campos do nosso relat2rio. Cli,ue no bot0o #n para finali;ar.

Apostila de C# e ASP.Net

154 de 168

Fi#$ra ?D Passo ?I Agora em %ield E.plorer no n2 "atabase %ields $%igura W=) temos acesso aos campos da classe selecionada+ bastando arrastar+ por e.emplo os campos "ata+ "escricaoeMo!imento+ "escricaoe?roduto e Kuantidade para a banda "etail $SessionT "etail) para definir ,uais campos dese8amos e.ibir no relat2rio. #bser!e ,ue ,uando arrastamos um campo para SessionT "etail+ na banda superior+ para cada campo adicionado+ e colocado tamb*m um componente ,ue ser!e de t5tulo para a coluna. As figuras WW e W< e.ibem o retratado.

Fi#$ra >?

Fi#$ra >>

Apostila de C# e ASP.Net

155 de 168

Fi#$ra >@

Passo ?J Eamos agora aplicaremos um controle Te.t #b8ect oriundo da Tool 9o. $%igura Wc)+ ser!indo o mesmo como t5tulo do relat2rio. Naturalmente aplicaremos tal controle na banda de cabe/alho $Session< ?age Beader). "( um duplo cli,ue no controle para editG6lo+ digitando o te.to conforme imagem da %igura Wd. Ainda nesta etapa+ apli,ue na banda cabe/alho um controle ?rint "ate e um ?rint Time+ dispon5!eis no n2 Special %ields em %ield E.plore $%igura Wc). Repare ,ue nesta cole/0o temos !Grias !ariG!eis -teis para o relat2rio.

Fi#$ra >A ?ara finali;ar o design+ apli,ue conforme ilustrado na %igura Wd+ duas linhas hori;ontais para !isualmente separar os t5tulos das colunas dos dados da mesma. Apli,ue tamb*m o controle ?age Number a banda rodap*+ obtendo6o da cole/0o Special %ields em %ield E.plore $%igura WT).

Apostila de C# e ASP.Net

156 de 168

Fi#$ra >B

Fi#$ra >F

Passo ?E Clicando com o bot0o direito do mouse sobre a Grea de desig+ selecione no menu de conte.to $%igura Wh) a op/0o ?re!ie& Report para antes mesmo de atribuirmos dados ao relat2rio termos uma !is0o realista do design final. # resultado pode ser obser!ado na %igura Wi.

Fi#$ra >I

Apostila de C# e ASP.Net

157 de 168

Fi#$ra >J

Passo ?D Agora daremos uma guinada e.trema+ saindo do pro8eto ,ue estamos+ e abrindo o pro8eto eb. Mas antes+ temos ,ue copiar o diret2rio R?T do pro8eto atual todos os ar,ui!os do CrystalReport e incluirmos no pro8eto eb+ pois assim+ no conte.to do pro8eto eb $Camada Eie&)+ poderemos utili;G6los. ?roceda como sugerido na %igura Wf para !isuali;armos o diret2rio R?T rec*m copiado para o pro8eto eb.

Fi#$ra >E

Apostila de C# e ASP.Net

158 de 168

Passo >? Adicione uma no!a pGgina Asp. ao pro8eto+ nomeando6a como E.ibeRelatorio.Asp.. 7mediatamente ap2s sal!ar este ar,ui!o+ apli,ue a ele um componente CrystalReportSource e um componente CrystalReportEie&er. # primeiro controle+ naturalmente+ ser!irG para atribuirmos um cole/0o de dados retornada por e.emplo por um m*todo de neg2cio ,ue retorne um tipo "ataTable. Selecione o controle CrystalReportEie&er+ e no menu Tas' $canto superior direito do componente) e em Choose Report Source !incule6o ao controle CrystalReportSource+ definindo o mesmo como fonte de dados do controle CrystalReportEie&er. N0o * dif5cil concluir ,ue o controle CrystalReportEie&er ser!irG para pro!er o design final $,uando em e.ecu/0o) dos relat2rios no bro&ser+ acrescentando funcionalidades como> sal!ar em !Grios formatos+ imprimir e ;oom.

Fi#$ra >D

Fi#$ra @? Passo >> Acrescente+ conforme Listagem =W+ o procedimento para o e!ento ?ageeLoad da pGgina E.ibeRelatorio.Asp.. Lista#em ?>

1. protected !oid ?ageeLoad$ob8ect sender+ E!entArgs e)


<. Q

3. 4. 5.
h. S

CrystalReportSource.Report.%ileName Z $String) SessionUFNomeRelatorioFVP CrystalReportSource.Report"ocument.Set"ataSource$$"ataTable)SessionUF"ataTableRelatorioFV)P CrystalReportSource."ata9ind$)P

Come"ta"do o cdi#o fo"te da Lista#em ?> Li"/a T c d ;escri.0o "efine o nome do relat2rio oriundo pr*!iamente atribuido a !ariG!el de se/0o $Session). Atribui ao m*todo a cole/0o de dados $"ataTable) pr*!iamente atribuido a !ariG!el de se/0o. 7n!oca o m*todo "ata9ind do controle CrystalReportSource para renderi;ar o conte-do do relat2rio.

Apostila de C# e ASP.Net

159 de 168

Passo >@ %inali;ando a codifica/0o+ obser!ando a Listagem =<+ apli,ue o c2digo constante ao e!ento Clic' do bot0o 7mprimir da ?age ConsultaMo!imento.Asp.. Caso n0o e.ista este bot0o em sua pGgina+ acrescente. Lista#em ?@

1. protected !oid 9utton7mprimireClic'$ob8ect sender+ E!entArgs e)


<. Q

3.
c.

SessionUFNomeRelatorioFV Z FCrystalReportListaMo!imento.rptFP SessionUF"ataTableRelatorioFV Z ?rod.#bterListaMo!imento$Te.t9o."escricao?roduto.Te.t+ "ateTime.?arse$Te.t9o."ata7ni.Te.t)+ "ateTime.?arse$Te.t9o."ata%in.Te.t) )P Response.Redirect$FE.ibirRelatorio.asp.F)P

5. 6. 7. 8.
g.

10.
WW. S

Come"ta"do o cdi#o fo"te da Lista#em ?@ Li"/a T d W= ;escri.0o Atribui a !ariG!el de se/0o $Session) o nome do relat2rio ,ue dese8amos e.ibir.. Atribui a !ariG!el de se/0o $Session) o "ataTable $cole/0o de registros) retornado pelo m*todo. Redireciona para a pGgina E.ibirRelat2rio.Asp.+ naturalmente dese8ando !er os dados no bro&ser.

Passo >A E.ecute o pro8eto e !erifi,ue o resultado.

Apostila de C# e ASP.Net
A"e+o ?> Q Pa2aScript Aplicado a Asp.Net

160 de 168

# AS?.NET foi uma grande re!olu/0o no desen!ol!imento &eb+ trou.e uma grande produti!idade para todo o processo de desen!ol!imento. Mas o AS?.NET n0o mudou a ar,uitetura de desen!ol!imento &eb. Assim como o AS? T+ o AS?.NET * uma tecnologia para desen!ol!imento no lado do ser!idor+ reali;ando acesso a dados e gerando o conte-do a ser en!iado para o client. Mas em um sistema serG necessGria tamb*m a interati!idade com o usuGrio+ programando o lado client. Tarefas como e.ibir uma mensagem popup ou definir o foco de uma cai.a apenas podem ser feitas com programa/0o no lado client+ o ,ue continua sendo feito com 8a!ascript. A programa/0o 8a!ascript n0o mudou em nada. # ,ue mudou foi a forma como o 8a!ascript * gerado em con8unto com a tecnologia do ser!idor. Torna6se necessGrio entender ade,uadamente a rela/0o de e.ecu/0o entre o ,ue estG no ser!idor e o ,ue estG no lado client para ser poss5!el gerar o 8a!ascript corretamente. Ent0o !amos analisar em detalhes situa/1es em ,ue o 8a!ascript se8a necessGrio e como ele pode ser gerado. 7nserindo e!entos em &ebControls # 8a!aScript permite ,ue fa/amos a programa/0o de e!entos no lado client. E!entos como clic'+ onmouseo!er+ onmouseout+ e outros+ podem ser programados em di!ersos ob8etos da interface &eb+ tal como bot1es+ imagens+ lin's e outros ob8etos. #s e!entos no 8a!ascript s0o inseridos na forma de atributos das tags. Atra!*s da propriedade Atributes podemos ter controle sobre os atributos de tags ,ue ser0o renderi;ados no lado client+ assim podemos adicionar e!entos client aos ob8etos. ?or e.emplo+ se dese8armos adicionar um e!ento onclic' em um bot0o podemos utili;ar o seguinte c2digo> buttonW.attributes.add$Fonclic'F+Falert$^Esse botao foi clicado^)F) Neste e.emplo ao clicarmos no bot0o !eremos uma mensagem popup antes ,ue o post9ac' tipico do bot0o ocorra+ para finalmente rodar o e!ento clic' deste bot0o no ser!idor.

Ca"celame"to de $m post8ack
Conforme caracter5stica do pr2prio 8a!ascript+ podemos utili;ar o e!ento onclic' para cancelar a ocorr(ncia de um post9ac'+ bastando retornar do e!ento um !alor boolean. Assim podemos+ ao in!*s de fa;er uso da fun/0o alert+ utili;ar a fun/0o confirm do 8a!ascript para gerar uma mensagem de confirma/0o em bot1es+ por e.emplo. Ee8a> 9uttonW.attributes.add$Fonclic'F+Freturn confirm$^Tem certe;a M^)F)

)era"do e2e"tos "o NTML


?ara alguns e!entos+ podemos inseri6los diretamente na tag ao in!*s de fa;er a inser/0o atra!*s do Attributes. Mas apenas para alguns e!entos. A regra * a seguinte > Se e.iste um e!ento de ser!idor com o mesmo nome ent0o !oc( n0o pode inserir o e!ento direto no BTML+ pois serG interpretado errado+ serG confundido com o e!ento do ser!idor. ?or e.emplo+ o onclic' do bot0o+ ,ue no ser!idor tem o mesmo nome.

Apostila de C# e ASP.Net

161 de 168

Mas se n0o e.iste nenhum e!ento de ser!idor com o mesmo nome+ fi,ue a !ontade+ insira o e!ento na tag normalmente+ o &ebcontrol+ ao n0o reconhecer o atributo+ renderi;arG o atributo no client e.atamente como esti!er e desta forma irG gerar o e!ento no 8a!ascript. :m e.emplo disso s0o os e!entos omouseo!er e onmouseout no ob8eto 7mage+ !e8a como fica+ neste e.emplo preenchendo a linha de status do bro&ser > [asp>7mage idZF7mageWF runatZFser!erF 7mage:rlZFSNAD6===<.8pgF onmouseo!erZF8a!ascript>&indo&.statusZ^testando W+<+T^F onmouseoutZF8a!ascript>&indo&.statusZ^^F\ [Casp>7mage\

9tiliYa"do f$".<es Pa2aScript


Seria por demais desagradG!el ter ,ue inserir rotinas mais longas em e!entos 8a!aScript utili;ando apenas a propriedade attributes. As regras e l2gicas de programa/0o 8a!ascript+ por*m+ continuam !alendo. Assim sendo+ ao in!*s de inserir todo o c2digo atra!*s do attributes podemos apenas inserir uma chamada de fun/0o atra!*s do attributes. Assim sendo podemos criar fun/1es diretamente no ar,ui!o .AS?H e atra!*s do Attributes inserir apenas as chamadas dessas fun/1es. [script languageZ8a!ascript\ function Confirmar$)Q return$&indo&.confirm$FTem certe;a MF))S [Cscript\ E "o Code8e/i"d: 9uttonW.attributes.add$Fonclic'F+Freturn Confirmar$)F) )era"do =a2ascript para o clie"t E.istem alguns casos em ,ue o c2digo 8a!ascript de!e ser e.ecutado imediatamente no load da pGgina e n0o em um e!ento de um ob8eto espec5fico. #s dois casos mais comuns s0o a e.ibi/0o de uma mensagem popup no client e a defini/0o do foco para um determinado ob8eto. E+istem @ m1todos "a classe pa#e para a #era.0o de cdi#o Pa2aScriptR s0o os se#$i"tes: e#isterClie"tScript8lock: Dera o script imediatamente ap2s a tag form e#isterStart9pScript: Dera o script imediatamente antes do fechamento da tag form $[Cform\) Essa sutil diferen/a tem impacto na gera/0o do c2digo client > com o RegisterClientScript9loc' garantimos ,ue o script se8a e.ecutado t0o logo poss5!el+ mas de!eremos ter cuidado para ,ue o script n0o fa/a refer(ncia a ob8etos ,ue ainda nem ti!eram suas tags recebidas pelo bro&ser+ do contrGrio o script irG gerar erro. 4G com o RegisterStart:pScript o script serG e.ecutado apenas depois de todos os ob8etos terem chegado ao client+ 8ustamente de!ido a posi/0o ,ue o script * inserido na pGgina. Ambos os m*todos recebem < parNmetros+ o script a ser inserido dentro da pGgina e um parNmetro chamado F'eyF. # parNmetro 'ey tem por ob8eti!o impedir ,ue um script se8a duplicado dentro da pGgina+ o ,ue *

Apostila de C# e ASP.Net
especialmente importante durante o processo de cria/0o de custom &eb controls.

162 de 168

Neste parNmetro+ 'ey+ criamos uma esp*cie de nome para o script. Assim sendo se por algum moti!o a instru/0o de gera/0o do script for e.ecutada mais de uma !e;+ o AS?.NET se encarrega de ignorar as e.ecu/1es duplicadas. S0o casos incomuns ,uando o script * gerado diretamente na pGgina+ mas um recurso fundamental para para a cria/0o de custom &eb controls. E+i(i"do $ma me"sa#em de co"cl$s0o: Me.RegisterClientScript9loc'$F.F+ F[script\alert$^#pera/0o concluida R^)[Cscript\F) ;efi"i"do o foco para $ma cai+a: Me.RegisterStartupScript$F;F+ F[script\document.all.Te.t9o.W.focus$)[Cscript\F) C$idados com os "omes dos o(=etos No e.emplo acima utili;amos o nome do ob8eto 6 Te.t9o.W 6 para poder definir o foco para o ob8eto. Mas nem sempre o nome ,ue o ob8eto possui no ser!idor serG o mesmo nome ,ue o ob8eto possui no client+ os nomes poder0o ser diferentes especialmente ,uando o ob8eto esti!er dentro de algum container+ tal como uma "ataDrid+ um Repeater ou outro ob8eto do g(nero. ?ara resol!er este problema os ob8etos possuem uma propriedade chamada client7". Esta propriedade guarda o nome ,ue o ob8eto terG ,uando esti!er no client. Assim sendo+ mudando o c2digo acima+ para termos maior seguran/a com rela/0o ao nome do ob8eto+ o c2digo fica da seguinte forma > Me.RegisterStartupScript$F;F+ F[script\document.all.F a Te.t9o.W.Client7" a F.focus$)[Cscript\F) Tamb*m * poss5!el ter e.press1es de binding dentro de blocos de 8a!ascript+ ,uer se8a para a tradu/0o do nome de um ob8eto ou para algum outro ob8eti!o. Ee8a > [script languageZF8a!ascriptF\ function "efinir%oco$)Q document.all.[`@ Te.tbo.W.clientid `\.focus$)S [Cscript\ ?ode6se ent0o utili;ar a instru/0o ?age."ata9ind para pro!ocar o processamento da e.press0o e desta forma gerar o id do ob8eto na posi/0o correta. Ma"ip$la"do =a"elas com Pa2aScript Manipular 8anelas popup * outro recurso para o ,ual precisamos utili;ar amplamente o 8a!ascript. Em um sistema * fre,uente a necessidade de criarmos 8anelas popup modais para perguntarmos informa/1es adicionais ao usuGrio. Mais uma !e; precisamos de 8a!aScript para isso. L importante destacar ,ue n0o podemos utili;ar response.redirect ou ser!er.transfer e indicar em ,ual 8anela ou frame a pGgina serG aberta. #s dois primeiros s0o instru/1es do ser!idor e portanto n0o tem como controlar a ati!idade no client. A(ri"do $m pop$p Essa primeira parte * simples. ?odemos utili;ar o &indo&.open do 8a!ascript normalmente. ?odemos inseri6lo diretamente no AS?H ou utili;ar uma das instru/1es Register para fa;er a gera/0o do script com o &indo&.open

Apostila de C# e ASP.Net
9tiliYa"do $ma =a"ela modal

163 de 168

Neste caso a tarefa complica um pouco mais+ pois em geral ,uando utili;amos uma 8anela modal dese8amos uma resposta+ um resultado. Assim sendo precisamos reali;ar uma comunica/0o entre as 8anelas utili;ando 8a!ascript Eamos supor um eb%ormW.asp. chamando em uma 8anela modal um ebform<.asp..

[script languageZF8a!ascriptF\ function abrir8anela$) Q !ar retP retZ&indo&.sho&Modal"ialog$F&ebform<.asp.F+FF+FF)P document.all.Te.t9o.W.!alueZretP S [Cscript\ Neste e.emplo temos uma fun/0o abrir8anela ,ue de!erG estar no &eb%ormW.asp.. Esta fun/0o fa; a abertura de uma 8anela modal+ obtem um !alor de resposta e atribui esse !alor de resposta na Te.t9o.W. Esta fun/0o pode ser disparada de di!ersas formas diferentes > utili;ando um hyperlin'+ o clic' de uma imagem+ um bot0o html+ enfim+ ob8etos client. ?or*m s2 * 8ustificG!el usar um ob8eto de ser!idor para fa;er esse disparo se for necessGrio reali;ar algum processamento adicional antes da 8anela popup. Nesse caso podemos fa;er o disparo da fun/0o no clic' de um bot0o no ser!idor $n0o Ffa;er o disparoF+ mas sim gerar o 8a!ascript para isso). Me.RegisterStartupScript$F.F+ F[script\abrir8anela$)[Cscript\F) No eb%orm< precisaremos definir o !alor de retorno atra!*s da propriedade returnEalue do ob8eto &indo& e fechar o form. [script languageZF8a!ascriptF\ function terminou$) Q &indo&.returnEalueZdocument.all.Te.t9o.W.!alueP &indo&.close$)P S [Cscript\ Mais uma !e; temos a mesma ,uest0o > S2 * 8ustificG!el usar ob8etos de ser!idor se hou!er algum processamento adicional a ser reali;ado antes do fechamento. A forma de fa;er o disparo+ neste caso+ fica identica a anterior > Me.RegisterStartupScript$F.F+ F[script\terminou$)[Cscript\F) "etalhes adicionais > %un/1es 8a!aScript podem ser inseridas em ar,ui!os .4S e estes !inculados a pGgina atra!*s da pr2pria tagm[script\. # trabalho entre frames tamb*m precisa ser feito em 8a!ascript. "e!e6se ter cuidado com o auto?ostbac'+ ,ue insere c2digo 8a!ascript em alguns e!entos do ob8eto. Se ao mesmo tempo !oc( tentar inserir seu pr2prio c2digo 8a!ascript para o mesmo e!ento+ gerarG erro. # e!ento onSubmit do form * um e!ento especial+ pois todos os &ebControls podem manipula6lo. ?or isso !oc( n0o de!e tentar lidar diretamente com esse e!ento. ?ara isso e.iste um m*todo chamado Register#nSubmitStatement ,ue irG controlar o uso do e!ento #nSubmit por todos os &ebControls.

Apostila de C# e ASP.Net
A"e+o @ Q E+press<es
- U$e 1 E+press0o e#$lar_

164 de 168

e#$lares

Em ci(ncia da computa/0o+ uma e.press0o regular $ou o estrangeirismo rege.+ abre!ia/0o do ingl(s regular e.pression) pro!( uma forma concisa e fle.5!el de identificar cadeias de caracteres de interesse+ como caracteres particulares+ pala!ras ou padr1es de caracteres. E.press1es regulares s0o escritas numa linguagem formal ,ue pode ser interpretada por um processador de e.press0o regular+ um programa ,ue ou ser!e um gerador de analisador sintGtico ou e.amina o te.to e identifica partes ,ue casam com a especifica/0o dada. # termo deri!a do trabalho do matemGtico norte6americano Stephen Cole nleene+ ,ue desen!ol!eu as e.press1es regulares como uma nota/0o ao ,ue ele chama!a de Glgebra de con8untos regulares. Seu trabalho ser!iu de base para os primeiros algoritmos computacionais de busca+ e depois para algumas das mais antigas ferramentas de tratamento de te.to da plataforma :ni.. # uso atual de e.press1es regulares inclui procura e substitui/0o de te.to em editores de te.to e linguagens de programa/0o+ !alida/0o de formatos de te.to $!alida/0o de protocolos ou formatos digitais)+ realce de sinta.e e filtragem de informa/0o.

E+press<es

e#$lares em Pa2aScript

E.press0o Regular $ou Regular E.pression+ ,ue * o nome original) * uma forma de efetuar a !alida/0o sobre um te.to atra!*s de um determinado padr0o+ eliminando um longo trecho de c2digo para fa;er esta fun/0o. :ma Regular E.pression * composta de uma se,](ncia de s5mbolos e caracteres especiais ,ue * interpretada como uma regra+ ,ue indicarG se um te.to posterior segue todas as condi/1es nela impostas. Mas e como isso funcionaM Eamos a um e.emplo prGtico> !alida/0o de e6mail. function !alidaEmail$mail)Q !ar er Z RegE.p$CsUA6ma6;=6geY6Y.VA_UA6ma6;=6geY6Y.VQ<+SY.UA6ma6;=6gVQ<+S$Y.UA6ma6;=6gV)MC)P if$mail ZZ IJ)Q &indo&.alert$I7nforme seu e6mailRJ)P Selse if$er.test$mail) ZZ false)Q &indo&.alert$IE6mail in!GlidoRJ)P S S Lista#em ?> * %un/0o contendo um e.emplo de E.press0o Regular $linha <) Eamos entender o c2digo. Na segunda linha temos a declara/0o da Regular E.pression escrita em uma das duas formas poss5!eis. ?ode6se utili;ar o m*todo construtor RegE.p+ assim como no e.emplo+ ou atribuir diretamente a e.press0o $,uadro =<). !ar er Z CsUA6ma6;=6geY6Y.VA_UA6ma6;=6geY6Y.VQ<+SY.UA6ma6;=6gVQ<+S$Y.UA6ma6;=6gV)MCP Lista#em ?@ * E.press0o regular sem RegE.p Mas ,ual * a diferen/aM "a primeira forma !oc( pode6se atribuir a e.press0o regular dinamicamente+ passando uma string por parNmetro+ por e.emplo. Na segunda forma+ o conte-do da e.press0o * estGtico+ sendo definido no c2digo somente. E o ,ue significa a,uela sopa de letrinhasM Eamos por partes> ?rimeira parte> sUA6ma6;=6geY6Y.VA> os caracteres de!em estar entre A e m $apenas mai-sculo)+ entre a e ; Segunda parte> _> ap2s a primeira se,](ncia de caracteres de!e encontrar uma arroba $_). Terceira parte> UA6ma6;=6geY6Y.VQ<+S> de!e encontrar duas ou mais se,](ncias de caracteres ,ue satisfa/am a condi/0o de ser alfanum*rico+ underline+ tra/o ou ponto.

Apostila de C# e ASP.Net
Kuarta parte> Y.UA6ma6;=6gVQ<+S> de!e encontrar duas ou mais se,](ncias de antecedidos por ponto.

165 de 168

caracteres alfanum*ricos

Kuinta parte> $Y.UA6ma6;=6gV)M> pode encontrar ou n0o uma se,](ncia contendo os caracteres ,ue est0o entre os par(nteses. ?or fim+ a fun/0o test irG !alidar a e.press0o+ retornando um booleano ,ue irG indicar se a string passada por parNmetro estG !alidada dentro da e.press0o. ?ara entender melhor+ a Tabela =W tra; os sinali;adores utili;ados nas e.press1es regulares e seus respecti!os significados. Ta(ela ?>: Sinali;adores de e.press1es regulares
Si"aliYador ;escri.0o Si"aliYadores E+emplo

i g gi

N0o fa; distin/0o e min-sculas ?es,uisa global de de um padr0o

entre letras mai-sculas C4a!aCi encontrarG F4AEAF

tanto F8a!aF ,uanto F4a!aF e

todas as ocorr(ncias CcaCg encontrarG as duas ocorr(ncias de FcaF na frase FL cada macaco no seu galhoF CcaCg encontrarG as duas ocorr(ncias de FcaF na frase FCada macaco no seu galhoF

?es,uisa global+ sem distin/0o entre letras mai-sculas e min-sculas Encontra um linha. Encontra um carro. Encontra um hori;ontal. Encontra um !ertical. Encontra um pGgina. caractere de ,uebra de caractere de retorno de caractere de tabula/0o caractere de tabula/0o indicador de ,uebra de ASC77 e.presso

Caracteres literais

Yn Yr Yt Y! Yf Y... Y.dd Yu....

Encontra o caractere pelo !alor octal ....

FYd=F encontra o caractere de abertura de parenteses F$F FY.<fF encontra o caractere de abertura de parenteses F$F FYu==ATF encontraFtF

Encontra o caractere ASC77 e.presso pelo !alor he.adecimal dd. Encontra o caractere ASC77 e.presso pelo !alor :N7C#"E .....

Posi.<es dos ite"s de pesU$isa

s u

Encontra somente no Encontra somente no

in5cio da string final da string.

CsTheC encontra FTheF in FThe encontra em F7n The NightF CanduC encontra FandF encontra em FlandingF

nightF mas n0o

em FLandF mas n0o

Yb

Encontra nos e.tremos de uma pala!ra $os caracteres de teste de!em e.istir no ClyYbC encontra FlyF em FThis is in5cio ou fim de uma pala!ra pertencente 3 string). Encontra no meio de uma pala!ra da string+ ou se8a+ o in!erso de Yb.

really cool.F

Y9

CY9orC encontra ForF em FnormalF mas n0o encontra em Forigami.F

Classes de caracteres

Apostila de C# e ASP.Net
U.y;V

166 de 168

Encontra ,ual,uer caractere pertencente ao grupo de caracteres dentro dos CUANV9CC encontra FA9CF eFN9CF mas n0o colchetes. Eoc( pode usar o h5fen para encontra F99CF uma !e; ,ue o F9F fora dos definir uma fai.a. ?or e.emplo> CUa6;VC colchetes n0o fa; parte do con8unto. encontra ,ual,uer letra do alfabeto+ CU=6 gVC encontra ,ual,uer digito de = a g. Encontra ,ual,uer caractere ,ue n0o este8a no con8unto entre colchetes. # s5mbolo s nos colchetes indica nega/0o.

Us.y;V

-(s: N0o confunda o s5mbolo s CUsANV9CC encontra $nega/0o) dentro dos colchetes com o FA9CF ou FN9CF. s5mbolo s ,ue indica ,ue o padr0o de!e ser encontrado no in5cio da string. A nega/0o de!e ser usada somente dentro de colchetes. $ponto). Encontra ,ual,uer caractere Cb.tC encontra e.ceto ,uebras de linha ou outro caractere diante. :N7C#"E ,ue significa t*rmino de linha. Encontra ,ual,uer caractere alfanum*rico incluindo o sublinhdo. E,ui!ale 3 Ua6;A6m=6geV. CY&C encontra

F99CF mas n0o encontra

FbatF+ FbitF+ FbetF e assim por

Y&

F<==F em F<==`F

Y Yd Y" Ys YS

Encontra ,ual,uer caractere ,ue n0o este8a no con8unto Ua6;A6m=6geV. E,ui!ale CY C encontra F`F 3 Usa6;A6m=6geV. Encontra ,ual,uer E,ui!ale a U=6gV. d5gito de = a g. CY"C encontra

em F<==`F

Encontra ,ual,uer caractere ,ue n0o se8a um d5gito. E,ui!ale 3 Us=6gV. Encontra um caractere ,ue pro!oca um espa/o. E,ui!ale 3 U YtYrYnY!YfV. Encontra ,ual,uer caractere ,ue n0o pro!o,ue um espa/o. E,ui!ale 3 Us YtYrYnY!YfV.

FNoF em FNo Tc<<<<F

Padr<es de repeti.<es

Q.S Q.+S Q.+yS M X A

Encontra e.atamente um padr0o. Encontra . ou mais padr0o. Encontra de . at* y padr0o. Encontra ;ero ou uma E,ui!ale 3 Q=+WS. Encontra ;ero ou E,ui!ale 3 Q=+S.

. ocorr(ncias de ocorr(ncias de um ocorr(ncias de um ocorr(ncia.

CYdQdSC encontra d CYsQ<+SC encontra no espa/o. CYdQ<+cSC encontra c d5gitos. CaYsMbC encontra Fa bF.

d5gitos. m5nimo < caracteres de no m5nimo < mas n0o mais ,ue FabF ou

mais ocorr(ncias. ocorr(ncias.

C&eXC encontra F&F em F&hyF e F&eeF em Fbet&eenF+ mas n0o encontra em FbadF. CfeAdC encontra tanto FfedF ,uanto FfeedF

Encontra uma ou mais E,ui!ale 3 QW+S.

A#r$pame"to de padr<es

$) b

Agrupa caracteres para criar uma clGusula. ?ode ser aninhado. #ferece alternati!a para o padr0o. L similar a uma instru/0o F#:F.

C$abc)A$def)C encontra uma ou mais ocorr(ncias de FabcF seguida$s) por uma ocorr(ncia de FdefF. C$ab)b$cd)b$ef)C encontra FabF ou FcdF ou FefF.

Apostila de C# e ASP.Net

167 de 168

E.istem alguns m*todos para efetuar a !alida/0o e outras opera/1es tendo como base a e.press0o regular constru5da+ os ,uais est0o descritos na Tabela =<. Ta(ela ?@: M*todos de !alida/0o em e.press1es regulares M1todo e.ec test match search replace split last7nde. E.ecuta pes,uisas em 7ndica se a string ;escri.0o uma string e retorna um array das informa/1es obtidas.

satisfa; os parNmetros da e.press0o regular.

E.ecuta uma pes,uisa em uma string e retorna um array das informa/1es obtidas ou nulo se nada for encontrado. %a; uma pes,uisa na E.ecuta uma pes,uisa substring. Kuebra uma string em string e retorna o 5ndice do resultado+ ou 6W se n0o for encontrado. em uma string e substitui o resultado encontrado por uma um array de substrings.

Arma;ena a posi/0o da -ltima pes,uisa bem sucessida reali;ada na string. Se nada for encontrado+ a propriedade last7nde. serG colocada como W. n representa o numero de W a g Arma;ena os no!e mais recentes pes,uisa dentro de par(nteses encontradas. ?or e.emplo+ se o padr0o usado por uma regular e.pression para a -ltima pes,uisa foi C $Bello)$YsA)$&orld)C e a string pes,uisada foi IBello &orldJ o conte-do de RegE.p.u< poderia ser ,ual,uer caractere entro IBelloJ e I&orldJ. Arma;ena a copia do padr0o da regular e.pression.

un

source

Sabendo utili;ar os caracteres especiais nas e.press1es regulares 8G * d=`+ os outros d=` ficam por conta da l2gica para montar a e.press0o. ?ara fi.ar bem o assunto !amos a mais um e.emplo> !alida/0o de datas. Eoc( 8G de!e ter !isto pela 7nternet alguns scripts ImedonhosJ+ com algumas de;enas ou centenas de linhas de c2digo para !alidar datas+ a,ueles ,ue !oc( olha e nem sabe direito como funciona. Eamos simplificar um pouco isso+ seguindo o c2digo do ,uadro =T. function !alida"ata$data)Q !ar er Z RegE.p$F$=UW6gVbU=W<VU=6gVbTU=WV)C$=UW6gVbWU=W<V)CUW<VU=6gVQTSF)P if$er.test$data))Q !ar barras Z data.split$FCF)P !ar dia Z barrasU=VP !ar mes Z barrasUWVP !ar ano Z barrasU<VP !ar d Z ne& "ate$ano+ mes6W+ dia)P if$dia RZ d.get"ate$))Q return falseP else if$mes RZ $d.getMonth$) A W))Q return falseP Selse if$ano RZ d.get%ulloear$))Q return falseP SelseQ return trueP S SelseQ return falseP S S Lista#em ?A * Ealida/0o de datas com E.press0o Regular.

Apostila de C# e ASP.Net

168 de 168

Na segunda linha temos a declara/0o da nossa e.press0o regular+ !amos entender como ela funciona. ?rimeira parte> $=UW6gVbU=W<VU=6gVbTU=WV)> !alida os dias indicando ,ue e.press0o irG considerar como !Glido tudo o ,ue se iniciar com = e !ier seguido de um d5gito entre W e g+ ou $pipe $b) * o operador l2gico or) iniciar com < ou T e !ier seguido de um d5gito entre = e g+ ou ent0o iniciar com T e !ier seguido por = ou W. 7sto irG !alidar os dias entre W e TW. Segunda parte> $=UW6gVbWU=W<V)> agora a !alida/0o dos meses+ ,ue de!e ser considerado os ,ue iniciarem com ;ero+ seguidos por um d5gito entre W e g+ ou iniciar com W+ seguido de =+ W ou <. Terceira parte> UW<VU=6gVQTS> a,ui irG !alidar o ano+ ,ue de!erG iniciar com W ou < e ap2s isso ter uma se,](ncia de T d5gitos entre W e g+ desta forma+ !alida os anos entre W=== e <ggg. As barras indicam o formato da data+ ,ue de!e estar como ddCMMCaaaa. Mas n0o se pode !alidar tudo apenas com e.press0o regular+ pois temos os anos bisse.tos e os meses com T= ou TW dias. ?or isso temos a segunda parte+ ,ue irG criar uma !ariG!el do tipo data passando os parNmetros de dia+ m(s e ano e depois !erificar se cada parte da data criada confere com a data informada. A ,uest0o de informar mes6W e depois comparar o m(s com d.getMonth$) A W se dG pelo moti!o do 4a!aScript tratar o m(s iniciando de =+ e n0o por W+ ou se8a+ o 4a!aScript conta os meses de = a WW. Enfim+ E.press1es Regulares se resume basicamente a isto+ n0o * muito complicado+ basta dar uma olhada mais atentamente para entender.

Вам также может понравиться