Anda di halaman 1dari 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 Web Services ADO.NET

2 de 168

Microsoft .NET
Microsoft .NET (comumente conhecido por .NET Framework em ingls dotNet) uma iniciativa da empresa Microsoft, que visa uma plataforma nica para desenvolvimento e execuo de sistemas e aplicaes. Todo e qualquer cdigo gerado para .NET, pode ser executado em qualquer dispositivo que possua um framework de tal plataforma. Com idia semelhante plataforma Java, o programador deixa de escrever cdigo para um sistema ou dispositivo especfico, e passa a escrever para a plataforma .NET. A plataforma .NET executada sobre uma Common Language Runtime - CLR (Ambiente de Execuo Independente de Linguagem) interagindo com um Conjunto de Bibliotecas Unificadas (framework). Esta CLR capaz de executar, atualmente, mais de 20 diferentes linguagens de programao, interagindo entre si como se fossem uma nica linguagem. Estas so: APL Boo Clarion COBOL Component Pascal C# C++ Delphi Eiffel Forth Fortran Haskell Java JScript J# Lua Mercury Mondrian Oberon Object Pascal / Delphi Language Oz Pascal Perl PowerBuilder PowerShell Python RPG Ruby Scheme SmallTalk Standard ML Visual Basic

Esta plataforma permite a execuo, construo e desenvolvimento de Web Services (Aplicaes Web) de forma integrada e unificada. A plataforma .NET baseia-se em um dos princpios utilizados na tecnologia Java ((Just In Time Compiler - JIT), os programas desenvolvidos para ela so duplo-compilados (compilados duas vezes), uma na distribuio (gerando um cdigo que conhecido como "bytecodes") e outra na execuo. Um programa escrito em qualquer das mais de vinte linguagens de programao disponveis para a plataforma, o cdigo fonte gerado pelo programador ento compilado pela linguagem escolhida gerando um cdigo intermedirio em uma linguagem chamada MSIL (Microsoft Intermediate Language). Este novo cdigo fonte gera um arquivo na linguagem de baixo nvel Assembly, de acordo com o tipo de projeto: EXE - Arquivos Executveis, Programas DLL - Biblioteca de Classes ASPX - Pgina Web ASMX - Web Service

Apostila de C# e ASP.Net

3 de 168

No momento da execuo do programa ele novamente compilado, desta vez pelo compilador JIT, de acordo com a utilizao do programa, por exemplo: Temos um Web Site desenvolvido em ASP.NET, ao entrar pela primeira vez em uma pgina o JIT ir compila-la, nas outras vezes que algum outro usurio acessar esta pgina, ele usar esta compilao. Tambm possvel, atravs de ferramentas especficas, "pr-compilar" o cdigo para que no se tenha o custo da compilao JIT durante a execuo. O fato desta arquitetura utilizar a MSIL gera uma possibilidade pouco desejada entre os criadores de software que a de fazer a "engenharia reversa", ou seja, a partir de um cdigo compilado, recuperar o cdigo original. Isto no uma ideia agradvel para as empresas que sobrevivem da venda de softwares produzidos nesta plataforma. Por causa disso, existem ferramentas que "ofuscam" o cdigo MSIL, trocando nomes de variveis, mtodos, interfaces e etc para dificultar o trabalho de quem tentar uma engenharia reversa no mesmo.

CLR(Common Language Runtime)


O CLR um ambiente de execuo, e poderamos at dizer que o Corao do .NET, o qual d suporte a todas as linguagens de programao habilitadas para o .NET. O Runtime (ambiente de execuo) o ambiente que d suporte execuo das aplicaes .NET. Quando um programa .NET executado, todo o controle do mesmo feito atravs do CLR. Para aplicaes anteriores, desenvolvidas utilizando COM/COM+, o programador era responsvel por inserir no cdigo do programa uma srie de funes necessrias ao correto funcionamento do mesmo, como por exemplo o Gerenciamento de memria, criao e destruio de objetos. A codificao destas funes no era uma tarefa fcil, o que exigia muito tempo do programador, alm de conhecimentos avanados. Com aplicaes .NET, todas estas funes so executadas pelo CLR, ou seja, o programador no precisa preocupar-se com as mesmas. Desta forma somente precisamos nos preocupar com a funcionalidade do nosso programa, o que poupa tempo e agiliza o processo de desenvolvimento. As aplicaes criadas em uma das linguagens habilitadas para o .NET (como VB.NET, C# ou ASP.NET), ao serem compiladas, geram um cdigo intermedirio conhecido como MSIL Microsoft Intermediate Language, o qual abreviado simplesmente como IL Intermediate Language. Este cdigo que executado pelo CRL. Vamos analisar o diagrama apresentado na abaixo:

CTS(Common Type System)


O Framework .NET disponibiliza, na forma de objetos, um conjunto de tipos de dados comuns, os quais podem ser utilizados por todas as linguagens habilitadas ao .NET. Isso significa que uma varivel do tipo Int ter a mesma estrutura e ocupar o mesmo nmero de bytes, quer seja no C#, no VB.NET, no C++ ou em qualquer outra linguagem habilitada ao .NET. Este conjunto de tipos comuns, que pode ser utilizado por qualquer linguagem, chamado de Common Type System, que a partir de agora abreviaremos por CTS. Dentre outras coisas, o CTS que facilita a integrao entre os programas e servios criados, utilizando-se de diferentes linguagens do .NET. No modelo antigo, uma das dificuldades de fazer com que um Componente COM+ criado com o Visual C++ pudesse ser utilizado por um programa escrito em Visual Basic que as linguagens possuam um diferente conjunto de tipos bsicos. Para que os componentes, escritos em diferentes linguagens, pudessem se comunicar, o programador tinha que mapear os tipos de uma linguagem, para os tipos correspondentes em outra linguagem, fazendo as converses necessrias.

Apostila de C# e ASP.Net

4 de 168

Vejam o quanto este procedimento trabalhoso. Com o CTS do .NET simplesmente esta preocupao no existe, uma vez que todas as linguagens tm acesso a um conjunto de tipos comum a todas elas. Conforme descrito na documentao do Framework .NET, so as seguintes as principais funes do CTS: Fornece uma estrutura que possibilita a integrao entre diferentes linguagens habilitadas ao .NET, com uma execuo mais rpida, uma vez que a sobrecarga para a converso entre os diferentes tipos de diferentes linguagens deixa de existir. Fornece uma estrutura de tipos com base em um modelo orientado a objetos, o que facilita a criao de novas linguagens habilitadas ao .NET, favorecendo a utilizao de boas prticas de programao, como por exemplo a herana. Uma vez que os tipos so objetos, podemos criar tipos derivados dos objetos bsicos, os quais herdam todas as caractersticas dos objetos bsicos. O CTS define algumas regras que toda linguagem deve seguir, para ser habilitada ao .NET. Por seguirem um conjunto de regras comum, a interao entre programas escritos em diferentes linguagens fica bem mais fcil.

CLS (Common Language Specification)


O CLS, ou Especificao Comum da Linguagem, um subconjunto do CTS, e de-fine um conjunto de regras que qualquer linguagem que implemente a .NET deve seguir a fim de que o cdigo gerado resultante da compilao de qualquer pea de software escrita na referida linguagem seja perfeitamente entendido pelo runtime .NET. Seguir essas regras um imperativo porque, caso contrrio, um dos grandes ganhos do .NET, que a independncia da linguagem de programao e a sua interoperabilidade, fica comprometido. A grosso modo, dizer que uma linguagem compatvel com o CLS significa dizer que mesmo quando esta sintaticamente diferente de qualquer outra que implemente .NET, semanticamente ela igual, porque na hora da compilao ser gerado um cdigo intermedirio (e no cdigo assembly dependente da arquitetura do processador) equivalente para duas peas de cdigo iguais, porm escritas em linguagens diferentes. importante entender esse conceito para no pensar que o cdigo desenvolvido em C# no pode interagir com cdigo desenvolvido em VB ou outras linguagens, porque mesmo estas sendo diferentes, to-das so compatveis com o CLS.

MSIL (Microsoft Intermediate Language)


A MSIL ou simplesmente IL a linguagem intermediria para qual interpretado qualquer programa .NET, independente da linguagem em que este for escrito. Essa traduo feita para cdigo intermedirio (como em JAVA com os byte codes) sintaticamente expresso na IL. Por sua vez,qualquer linguagem .NET compatvel, na hora da compilao, gerar cdigo IL e no cdigo assembly especfico da arquitetura do processador onde a compilao do programa efetua- da, conforme aconteceria em C++ ou Delphi, por exemplo. E por que isso? Isso acontece para garantir duas coisas: a independncia da linguagem e a independncia da plataforma (arquitetura do processador). Arquitetura .NET A MSIL a linguagem intermediria para qual interpretado qualquer programa .NET na hora da compilao, independente da linguagem em que este for escrito.

Metadata
Ao registrarmos um componente COM/COM+, uma srie de informaes sobre o mesmo so gravadas na Registry do sistema. Estas informaes so utilizadas pelos programas que precisam acessar o componente. Se alguma destas informaes estiver errada ou tiver sido alterada, o componente no poder ser acessado e os programas que utilizam o componente deixaro de funcionar corretamente. No Framework .NET, para utilizarmos os componentes .NET (.NET Componentes), no necessrio que os mesmos sejam registrados. O prprio componente .NET possui todas as informaes necessrias ao seu funcionamento, bem como as informaes necessrias para que outros aplicativos possam utiliz-los. Estas informaes, que fazem parte do prprio componente .NET ficam gravadas no arquivo que compe componente, na forma de Metadata. Uma traduo popularmente conhecida para Metadata seria: dados sobre dados. No nosso caso, Metadata seriam as informaes que o componente .NET possui a respeito de si mesmo, informaes estas que podem ser utilizadas por outros componentes e servios, para acessar o componente em questo. Alm de fazer com que no seja necessrio o registro do componente, as informaes de Metadata facilitam a interoperabilidade entre diferentes componentes, mesmo entre componentes escritos em diferentes linguagens. Estas informaes so geradas, automaticamente, no momento da compilao do componente e so gravadas no arquivo .DLL ou .EXE do componente. So muitas as informaes que podem ser inseridas no componente, na forma de Metadata, tais como:

Apostila de C# e ASP.Net

5 de 168

Nome e verso do componente. Uma chave pblica para verificao da origem e da autenticidade do componente. Informaes sobre todas as classes ou componentes, dos quais o componente depende para funcionar. Tipos disponibilizados (exportados) pelo componente. Permisses de segurana para o acesso ao componente, seus mtodos e propriedades. Classes bsicas e interfaces do Framework .NET, utilizadas pelo componente. Atributos personalizados, implementados no componente. Membros do componente (mtodos, campos, propriedades, eventos, etc).

Quando o componente acessado, o CLR carrega os metadados do componente na memria e faz referncia a estes metadados, para obter informaes sobre as classes, membros, herana e dependncias do componente. So diversos os benefcios do uso de metadados, dentre os quais podemos destacar os seguintes: Mdulos de cdigo auto descritivos: O prprio componente contm toda a informao necessria para interagir com outros componentes. Desta forma o componente pode ser implementado como um nico arquivo, o qual contm a sua definio (na forma de metadados) e a sua implementao, o cdigo do componente. Nunca demais repetir: A utilizao de metadados facilita, enormemente, a interoperabilidade entre componentes criados usando diferentes linguagens.

Assemblies
Uma aplicao .NET constituda de um conjunto de blocos chamados Assembly. Atravs dos Assemblies que podemos controlar a distribuio de uma aplicao, fazer o controle de verses, alm de definir as configuraes de segurana. Um assembly uma coleo de tipos e recursos que foram construdos para trabalharem juntos, formando, com isso, uma unidade com funcionalidade e escopos bem definidos. Um assembly fornece ao CLR importantes informaes sobre a implementao de tipos da aplicao. Para o CLR, um tipo somente existe no contexto de um assembly. De uma maneira mais simples, poderamos dizer que um assembly o mecanismo utilizado pelo .NET, para empacotar todos os elementos e informaes necessrias ao funcionamento de uma aplicao ou componente. Vamos simplificar mais ainda: o assembly uma maneira de juntar e organizar os diversos elementos que formam uma aplicao ou componente. Os assemblies foram criados para simplificar a distribuio de aplicaes e resolver o problema de verses, existentes em aplicaes baseadas em componentes. Com este termo estvamos nos referindo ao problema de um programa, ao ser instalado, substituir uma DLL por uma verso mais nova ou mais antiga, fazendo com que programas que dependiam da verso anterior da DLL deixassem de funcionar. Atravs do uso de assemblies e dos metadados contidos em cada componente, possvel que diferentes verses, do mesmo componente, estejam disponveis, ao mesmo tempo, em um computador. Desta forma, cada programa utiliza a verso do componente para o qual o programa foi criado. Ao instalarmos uma nova verso do componente, o qual vem embutido em um assembly, as verses anteriores sero mantidas, se as mesmas estiverem sendo utilizados por outros programas. Isso faz com que o inferno das DLLs (DLL Hell) seja coisa do passado. Para resolver o problema de verses e evitar o inferno das DLLs, o CLR utiliza assemblies da seguinte maneira: Permite que o desenvolvedor defina regras sobre o uso de diferentes verses entre diferentes componentes .NET. Fornece a infraestrutura necessria para que as regras de verso definidas pelo desenvolvedor sejam respeitadas. Fornece a infraestrutura necessria, para que diferentes verses de um mesmo componente de software possam rodar, simultaneamente. Esta execuo simultnea conhecida como syde-by-syde execution. Um assembly composto de dois elementos bsicos: Manifesto. Um conjunto de mdulos.

Apostila de C# e ASP.Net
GC (Garbage Collector) Coletor de Lixo / Gerenciamento da Memria

6 de 168

O gerenciamento da memria efetuado pelo runtime, permitindo que o desenvolvedor se concentre na resoluo do seu problema especfico. O que diz respeito ao sistema operacional, como o gerenciamento da memria, feito pelo runtime. Como isso efetuado? medida que uma rea de memria necessria para alocar um objeto, o GC ou coletor de lixo (Garbage Collector) realizar essa tarefa, assim como a liberao de espaos de memria que no estiverem mais em uso. Para os que no trabalham com linguagens de programao como C ou C++, que permitem o acesso direto memria heap via ponteiros, essa uma das maiores dores de cabea que os programadores sofrem, ora por fazer referncia a espaos de memria que no foram alocados, ora porque estes espaos j foram liberados anteriormente; exatamente esse tipo de erro que o coletor de lixo nos ajuda a evitar. O gerenciamento da memria, quando efetuado diretamente pelo programador, torna os programas mais eficientes em termos de desempenho, mas ao mesmo tempo o penaliza, obrigando-o a alocar e desalocar memria quando assim requerido. A .NET permite que o programador faa esse gerenciamento tambm, o que chamado de unsafe code (cdigo no seguro); entretanto, por default, o GC o encarregado dessa tarefa, e o contrrio no recomendado.

Apostila de C# e ASP.Net
A linguagem C#
A estrutura bsica de uma aplicao C# O pequeno trecho de cdigo a seguir implementa o clssico programa Ol mundo: using System; class HelloWorld { static void Main( ) { // escrevendo no console Console.WriteLine("Hello World !!!"); Console.ReadLine( ); } } O Cabealho do programa

7 de 168

A primeira linha do nosso programa, que escreve no console Ol mundo em C#, contm a informao do namespace System, que contm as classes primitivas necessrias para ter acesso ao console do ambiente .NET. Para incluir um namespace em C#, utilizamos a clusula using seguida do nome do namespace. A declarao de uma classe O C# requer que toda a lgica do programa esteja contida em classes. Aps a declarao da classe usando a palavra reservada class, temos o seu respectivo identificador. Para quem no est familiarizado com o conceito de classe, apenas adiantamos que uma classe um tipo abstrato de dados que no paradigma de programao orientada a objetos usado para representar objetos do mundo real. No exemplo acima, temos uma classe que contm apenas o mtodo Main( ) e no recebe nenhum parmetro. O Mtodo Main( ) Todo programa C# deve ter uma classe que defina o mtodo Main( ), que deve ser declarado como esttico usando o modificador static, que diz ao runtime que o mtodo pode ser chamado sem que a classe seja instanciada. atravs desse modificador que o runtime sabe qual ser o ponto de entrada do programa no ambiente Win32, para poder passar o controle ao runtime .NET. O M maisculo do mtodo Main obrigatrio, e seu valor de retorno void significa que o mtodo no retorna nenhum valor quando chamado. Algumas variantes do mtodo Main( ) // Main recebe parmetros na linha de comando via o array // args static void Main(string[ ] args) { // corpo do mtodo } // Main tem como valor de retorno um tipo int static int Main( ) { // corpo do mtodo } A forma do mtodo Main( ) a ser usada vai depender dos seguintes fatores: O programa vai receber parmetros na linha de comando? Ento esses parmetros sero armazenados no array args. Quando o programa finalizado, necessrio retornar algum valor ao sistema? Ento o valor de retorno ser do tipo int.

Apostila de C# e ASP.Net

8 de 168

Um programa escrito em C# pode ter mais de uma classe que implementa o mtodo Main( ). Nesse caso, dever ser especificado em tempo de compilao em qual classe se encontra o mtodo Main( ), que dever ser chamado pelo runtime quando a aplicao for executada. Exemplo: using System; class class1 { static void Main( ) { Console.WriteLine("Mtodo Main( ) da classe 1"); } } class class2 { static void Main( ) { Console.WriteLine("Mtodo Main( ) da classe 2"); } } Alguns ltimos detalhes adicionais Blocos de cdigo so agrupados entre chaves { }. Cada linha de cdigo separada por ponto-e-vrgula. Os comentrios de linha simples comeam com duas barras//. Comentrios em bloco so feitos usando os terminadores /* (de incio) e */ (de fim). /* Este um comentrio de bloco Segue o mesmo estilo de C/C++ */ O C# sensvel ao contexto, portanto int e INT so duas coisas diferentes. int uma palavra reservada que um alias do tipo System.Int32. INT poderia ser um identificador, entretanto no recomendado usar como identificadores de variveis o nome de um tipo ou palavra reservada como no exemplo citado. Sempre declare uma classe onde todos os aspectos inerentes inicializao da aplicao sero implementados, e obviamente, que conter o mtodo Main( ) tambm. No decorrer deste livro seguiremos fielmente essa regra nos nossos exemplos.

Apostila de C# e ASP.Net
Palavras reservadas em C#
abstract as base bool break byte case catch char checked class const continue decimal default delegate do double else enum event explicit extern false finally fixed float for foreach goto if implicit in int interface internal is lock long namespace new null object operator out override params private protected public readonly ref return sbyte sealed short sizeof stackalloc static string struct switch this throw true try typeof uint ulong unchecked unsafe ushort using virtual volatile void while

9 de 168

Formatando a sada padro


A formatao da sada padro feita usando os chamados caracteres de escape (veja a tabela abaixo). Vejamos um exemplo: // \t = TAB // \n = quebra de linha e retorno de carro (CR LF) Console.WriteLine( "var1: {0} \t var2: {1}\t var3: {2}\n", var1, var2, var3); Caractere de Escape Significado \n Insere uma nova linha \t TAB \a Dispara o som de um alarme sonoro simples \b Apaga o caractere anterior da string que est sendo escrita no \r Insere um retorno de carro \0 Caractere NULL (nulo)

console(backspace)

Recebendo parmetros na linha de comando


Para receber parmetros na linha de comando, ou seja, na chamada de um programa quando digitamos o nome do executvel no prompt da linha de comando do DOS (como ScanDisk /All /AutoFix, por exemplo), o mtodo Main( ) precisa ser declarado da seguinte forma: // no retorna nenhum valor ao sistema static void Main(string[ ] args) ou, // retorna um valor do tipo int ao sistema static int Main(string[ ] args)

Apostila de C# e ASP.Net

10 de 168

O parmetro args um array de strings que recebe os parmetros passados quando a aplicao chamada na linha de comando. A seguir mostramos uma das formas da varrer os parmetros recebidos: foreach (string cmd in args) { int i = 0; Console.WriteLine("Par {0}: {1}", i, cmd); i++; } Para saber o nmero de argumentos que foram passados, usamos o mtodo Length( ) do array args da seguinte forma: numArgs = args.Length( ); Quando na linha de comando so recebidos parmetros numricos, estes devem ser convertidos de string para o tipo numrico respectivo usando a classe Convert. Exemplo: Convert.ToInt32(varString)

Variveis
So utilizadas para armazenar dados na memria do computador. Em C#, todas as variveis so declaradas dentro do escopo de uma classe e podem ser dos seguintes tipos: Locais: so declaradas no escopo de um mtodo, indexador ou evento e no possuem modificadores de acesso. A sua declarao se limita ao tipo seguido do identificador da varivel. Atributos de uma classe ou campos da classe: a varivel declarada como membro de uma classe. A declarao deve ser efetuada como se segue: [Modificador de acesso] [tipo atributo] <tipo da varivel> <identificador> Exemplo: public class App { public int varInt; static void Main( ) { int varLocal; } }

O Sistema de Tipos em C#
Em C#, todo tipo derivado da classe System.Object, que constitui o ncleo do sistema de tipos de C#. Entretanto, os projetistas da linguagem, e no apenas da linguagem, mas de .NET como um todo, sabem perfeitamente das implicaes de ter um sistema de tipos onde tudo um objeto: queda de desempenho. Para resolver este problema, eles organizaram o sistema de tipos de duas formas: Tipos Valor: variveis deste tipo so alocadas na pilha e tm como classe base System.ValueType, que por sua vez deriva de System.Object. Tipos Referncia: variveis deste tipo so alocadas na memria heap e tm a classe System.Object como classe base.

Apostila de C# e ASP.Net

11 de 168

Apostila de C# e ASP.Net
Boxing e UnBoxing

12 de 168

A razo de se criar uma origem comum de tipos para facilitar a interao entre tipos valor e referncia. O processo de converso explcita de um tipo valor para um tipo referncia conhecido em C# como Boxing (encaixotar). O processo contrrio a Boxing conhecido como Unboxing. Nesse caso, o compilador verifica se o tipo valor a receber o contedo do tipo referncia equivalente a este ltimo. No processo de Boxing, o que de fato est ocorrendo que um novo objeto est sendo alocado na memria heap e o contedo da varivel de tipo valor copiado para a rea de memria referenciada por esse objeto. Exemplo: int intNumero = 10; // Faz o boxing para o tipo referencia. Object objNumero = intNumero; // Faz o unboxing para o tipo valor int intValor = (int)objNumero; Quando essa operao efetuada entre tipos que no so equivalentes, uma exceo gerada pelo runtime.

Tipos Valor
Tipos valor no podem ser usados como classes base para criar novos tipos por que estes so implementados usando classes chamadas seladas, a partir das quais no possvel implementar o mecanismo de herana. Antes de serem usados, os tipos valor devem ser inicializados, caso contrrio o compilador acusar um erro. Os tipos valor so subdivididos em duas categorias: 1. Estruturas 2. Enumerados

Estruturas
Estruturas so usadas para implementar tipos simples chamados de primitivos em outras linguagens de programao, so criadas na pilha e ainda oferecem muito do potencial de uma classe a um custo menor. Os seguintes tipos so implementados usando estruturas:

Tipos primitivos
Numricos: inteiros, ponto flutuante e decimal Booleanos: verdadeiro e falso Tipos definidos pelo usurio: estruturas propriamente ditas que permitem que o usurio crie seus prprios tipos.

Enumerados
So usados para implementar listas de valores constantes, os quais podem ser de qualquer tipo inteiro (long, int etc.); porm no podem ser do tipo char. Cada constante tem um valor inteiro associado, o qual pode ser sobrescrito quando assim definido na lista enumerada. Os valores inteiros associados a cada constante da lista enumerada comeam a partir de zero.

Tipos Referncia
Os seguintes tipos referncia fazem parte do namespace System e derivam diretamente do System.Object: class object string delegate interface

Apostila de C# e ASP.Net
Strings

13 de 168

O tipo string representa uma seqncia de caracteres Unicode. string um alias para System.String no. NET Framework. string a = "hello"; string b = "h"; O operador + concatena strings: string a = "Bom " + "dia"; O [] operador acessa caracteres individuais de uma string: char x = "teste"[2]; // x = 's'; O arroba (@) evita que seqncia de escape sejam processadas: @"c:\Docs\Source\a.txt" // o mesmo que "c:\\Docs\\Source\\a.txt"

Operadores
Operadores aritmticos Em C# temos os seguintes operadores aritmticos: Operador Descrio + * / % (Adio) (Subtrao) (Multiplicao) (Diviso) (Resto/Mdulo)

Operadores de atribuio Em C# temos os seguintes operadores de atribuio: Operador Descrio = += -= *= /= %= (Atribuio simples) (Atribuio aditiva) (Atribuio Subtrativa) (Atribuio Multiplicativa) (Atribuio de diviso) (Atribuio de mdulo)

Operadores relacionais Em C# temos os seguintes operadores relacionais:

Apostila de C# e ASP.Net
Operador Descrio == > < <= >= != (Igualdade) (Maior) (Menor) (Menor igual) (Maior igual) (Diferente)

14 de 168

Operadores lgicos Em C# temos os seguintes operadores lgicos: Operador Descrio && || (E) (OU)

Apostila de C# e ASP.Net
Instrues de Controle

15 de 168

Uma instruo de controle usada para controlar o fluxo de execuo do programa baseando-se em uma condio verdadeira ou falsa. Instruo if A declarao if seleciona uma declarao para a execuo com base no valor de uma expresso Booleana. No exemplo a seguir um flag flagCheck Booleano definido como verdadeiro e, em seguida, verificado no caso declarao. bool flagCheck = true; if (flagCheck == true) { Console.WriteLine("O flag verdadeiro."); } else { Console.WriteLine("O flag falso."); } Exerccio: using System; class TesteIfElse { static void Main() { Console.WriteLine("Digite um dos seguintes nmeros: 1, 2, 3, 4"); int a = Int32.Parse(Console.ReadLine()); string mensagem = "Varivel a igual: "; if (a==1) { Console.WriteLine(mensagem + a); } else if (a == 2) { Console.WriteLine(mensagem + a); } else if (a == 3) { Console.WriteLine(mensagem + a); } else { Console.WriteLine(mensagem + a); } Console.Read(); } }

Apostila de C# e ASP.Net
Instruo switch

16 de 168

O switch uma declarao de controle que trata mltiplas selees e enumeraes passando por um controle para um dos casos dentro do seu corpo como o seguinte exemplo: int caseSwitch = 1; switch (caseSwitch) { case 1: Console.WriteLine("Case 1"); break; case 2: Console.WriteLine("Case 2"); break; default: Console.WriteLine("Default case"); break; } Exerccio using System; class Testeswitch { static void Main() { Console.WriteLine("Digite um dos seguintes nmeros: 1, 2, 3, 4, 5"); int a = Int32.Parse(Console.ReadLine()); string mensagem = "Varivel a igual: "; switch (a) { case 1: Console.WriteLine(mensagem + "1"); break; case 2: Console.WriteLine(mensagem + "2"); break; case 3: goto case 1; case 4: case 5: Console.WriteLine(mensagem + a); break; default: Console.WriteLine(mensagem + a); break; } Console.Read(); } }

Apostila de C# e ASP.Net
Instrues de Iterao

17 de 168

As instrues de iterao permitem repetir um determino trecho do algoritmo de acordo com uma condio (iterao condicional) ou de acordo com um nmero de vezes fixo (iterao definida). Instruo for O loop for executa uma instruo ou um bloco de instrues repetidamente at que uma expresso especificada avaliada como false. O loop for til para iterar em matrizes e para processamento seqencial. Exemplo: class ForLoopTest { static void Main() { for (int i = 1; i <= 5; i++) { Console.WriteLine(i); } } } /* Output: 1 2 ... 5 */

Exerccio using System; class foraninhado { static void Main() { for (int i = 1; i <= 10;i++ ) { for (int j = 1; j <= 10;j++ ) { Console.WriteLine(j.ToString()); } Console.WriteLine(i.ToString()); } Console.Read(); } }

Apostila de C# e ASP.Net
Instruo while

18 de 168

A instruo while executa uma instruo ou um Bloquear de instrues at que uma expresso especificada avaliada como false. class WhileTest { static void Main() { int n = 1; while (n < 5) { Console.WriteLine("Current value of n is {0}", n); n++; } } } /* Output: Current value Current value Current value Current value */ Instruo do .. while O lao do..while (faa..enquanto) usado quando queremos repetir uma instruo ou bloco de instrues ENQUANTO uma condio for satisfatria. A nica diferena entre este lao e o lao while, que, no lao do..while a condio de parada testada aps a iterao, o que garante que o lao do..while ser executado no mnimo uma vez. No lao while a condio testada antes da iterao. public class TestDoWhile { public static void Main () { int x = 0; do { Console.WriteLine(x); x++; } while (x < 5); } } /* Output: 0 1 2 3 4 */ of of of of n n n n is is is is 1 2 3 4

Apostila de C# e ASP.Net
Instruo for each

19 de 168

Esta instruo fornece uma maneira simples e limpa para iterar Atravs os elementos de uma matriz. Atravs exemplo, o cdigo a seguir cria uma matriz chamada numbers e itera-lo com a instruo foreach: // cs_foreach.cs class ForEachTest { static void Main(string[] args) { int[] fibarray = new int[] { 0, 1, 2, 3, 5, 8, 13 }; foreach (int i in fibarray) { System.Console.WriteLine(i); } } } 0 1 2 3 5 8 13

break O comando break usado para a sada de laos ( while, for , switch, etc..) . Exemplo: using System; class BreakTest { public static void Main() { for (int i = 1; i <= 100; i++) { if (i == 5) break; Console.WriteLine(i); } } } Sada 1 2 3 4

Apostila de C# e ASP.Net
Continue

20 de 168

O comando continue tambm usado em laos(while, for, etc.) quando em execuo o comando continue ir mover a execuo para o prxima iterao no lao sem executar as linhas de cdigo depois de continue. Exemplo: using System; class ContinueTest { public static void Main() { for (int i = 1; i <= 10; i++) { if (i < 9) continue; Console.WriteLine(i); } } } Sada 9 10

Apostila de C# e ASP.Net
Programao Orientada a Objetos

21 de 168

Uma vez que o Framework .NET fortemente baseado em conceitos de orientao a objetos, tambm a linguagem C# que utilizaremos nesta apostila para a criao de pginas ASP.NET baseada nos conceitos de orientao a objetos; bastante oportuno que revisemos os seguintes conceitos:

O que um objeto? O que so Classes? Mtodos e propriedades Herana Polimorfismo e Funes Virtuais Encapsulamento e Visibilidade

Todo o Framework .NET foi criado com base nos conceitos de Orientao a Objetos. A linguagem C# totalmente orientada a objetos, onde tudo so classes. Claro que alguns puristas poderiam dizer que o C# no completamente orientado a objetos porque no suporta herana mltipla. Na verdade veremos que o C# foi projetado para conciliar os benefcios da orientao a objetos e ao mesmo tempo ser simples e prtico. Para isso foram eliminadas algumas caractersticas da orientao a objetos, caractersticas estas que mais causavam problemas do que propriamente forneciam solues.

Objeto
Um objeto uma entidade que contm, alm dos dados, todas as funes (mtodos) que atuam sobre estes dados. Ou seja, um objeto composto dos dados que descrevem o objeto (propriedades) e das operaes que podem ser realizadas sobre estes dados (mtodos). Esta abordagem j um pouco mais prxima da abordagem entendida pelos usurios finais do sistema. Vamos imaginar um sistema para uma Escola de Nvel Mdio. Os usurios falam em termos de alunos, sries, etc. Poderamos ter um objeto chamado Alunos. Este objeto poderia conter diversas propriedades, tais como: Matrcula. Nome. Endereo. Data de Entrada. Nome do Pai. Nome da Me. Nmero da Identidade. Nmero do CPF. Com isso podemos observar que as propriedades descrevem as caractersticas de um determinado objeto. O conjunto de valores contidos nas propriedades de um determinado objeto define o seu estado atual. Alm das propriedades o objeto pode conter mtodos. Os mtodos descrevem aes que podem ser realizadas pelo objeto ou no objeto. Por exemplo, o nosso objeto Alunos poderia ter um mtodo chamado Recebimento, outro chamado transferncia, mais um chamado Promoo e assim por diante. Um mtodo, na prtica, uma funo ou procedimento que realiza uma srie de aes. Os mtodos de um objeto podem receber parmetros e ter o seu comportamento alterado, dependendo do valor dos parmetros. Por exemplo, o mtodo Promoo de um objeto Alunos pode receber, como parmetros, a Matrcula do Aluno, a data da promoo e o cdigo do novo curso em que aluno estar cursando. Dentro do mtodo Promoo pode ser chamado um mtodo AtualizaPagamento, o qual atualiza o valor das mensalidades dos alunos, de acordo com a nova srie que o mesmo ir cursar.

Apostila de C# e ASP.Net
Classes

22 de 168

Se pesquisarmos a bibliografia sobre orientao a objetos encontraremos um mundo de definies para classes. Vamos inicialmente apresentar algumas das definies formais encontradas na bibliografia. Depois vamos a uma, digamos, explicao mais fcil: 1) Classes constituem modelos que so utilizados para a criao de objetos. Nas classes so descritas a estrutura de dados (atravs das propriedades) e o comportamento (atravs de seus mtodos) de um ou mais objetos similares que possuem seus dados estruturados da mesma forma e so manipulados pelos mesmos mtodos. 2) Um objeto uma instncia de uma classe que criada em tempo de execuo. Classes so puramente uma descrio esttica de um conjunto de possveis objetos. Na prtica, o que significa, por exemplo, termos uma classe chamada Alunos? Esta classe serve como modelo para a criao de objetos do tipo Aluno. Na classe Alunos esto as definies das propriedades e dos mtodos para um objeto Aluno. Ou seja, sempre que criarmos um objeto do tipo Aluno, o mesmo ser criado com todas as propriedades e mtodos da classe Alunos. Classe uma forma para fazer objetos. (Pensamento de um Programador Google.) Grande parte da funcionalidade do Framework .NET fornecida por um grande nmero de classes, as quais fazem parte de .NET Framework Class Library, j descrita anteriormente. O Framework .NET agrupa as classes de acordo com suas funcionalidades. Um agrupamento de classes criadas para um determinado fim tambm conhecido como um namespace (espao de nomes). Por exemplo, temos o namespace System.Data. Dentro deste namespace existem vrias classes que fornecem os mtodos necessrios para a conexo e manipulao de fontes variadas de dados. Existem classes para a conexo com o SQL Server 2000, outras para a conexo com fontes ODBC e assim por diante. A biblioteca de classes do Framework .NET organizada de uma forma hierrquica, onde as classes de nveis inferiores herdam todas as caractersticas da classe me. Falaremos mais sobre herana no prximo item.

Exemplo: Declarando classes


class ClasseTeste { // Mtodos, propriedades, campos e eventos } Para criar uma instncia: Tipo Referncia = new Tipo(); No nosso exemplo: ClasseTeste teste = new ClasseTeste(); Podemos criar uma referncia sem criar um objeto: Tipo Referncia; ClasseTeste teste;

Apostila de C# e ASP.Net
Modificadores Para os Membros de uma Classe

23 de 168

Conforme descrito anteriormente existem modificadores que definem a visibilidade dos membros de uma classe. Por exemplo, o modificador public torna o membro acessvel de fora da classe; j o modificador private torna o membro disponvel somente dentro da prpria classe. A seguir uma descrio dos principais modificadores.

public: Torna o membro acessvel de fora da definio da classe. protected: O membro no pode ser acessado fora da classe, porm o membro est disponvel para outras classes derivadas da classe base. private: O membro no pode ser acessado fora da classe, nem mesmo por outras classes derivadas da classe base. internal: O membro somente visvel na unidade de cdigo onde o mesmo est definido. um meiotermo entre public e protected, uma vez que o membro pode ser acessado por todas as classes definidas na mesma unidade (pblico para as classes da mesma unidade), porm no pode ser acessado por classes definidas em outras unidades (protected para unidades definidas em outras unidades).

Estruturas (Structs)
Um tipo struct um tipo de valor normalmente usado para encapsular pequenos grupos de variveis relacionadas, como as coordenadas de um retngulo ou as caractersticas de um item em um inventrio. O exemplo a seguir mostra uma declarao de struct simples: public struct Livro { public decimal preco; public string titulo; public string autor; } As estruturas tambm podem conter de construtores constantes de campos , de mtodos de , propriedades, indexadores, de operadores , eventos e aninhados tipos, embora se vrios membros forem necessrios, voc deve considerar tornar o tipo de uma classe em vez disso. As estruturas podem implementar uma interface, mas elas no herdam de outra estrutura. Por esse motivo, struct membros no podem ser declarados como protegido.

Apostila de C# e ASP.Net
Criando Uma Classe em C# no Visual Studio

24 de 168

Visando exemplificar a criao de Classes na linguagem C#, esteja com o ambiente do VisualStudio em execuo, procedendo da seguinte forma: Passo 1 Acessando o Menu File | New | Project, selecione em Templates Class Library. Desta maneira estamos iniciando um projeto para acomodar nosso exemplo de uso de Classes, na forma de um Assembly, ou seja um aplicativo .Net (byte Code). Preencha na caixa de dialogo representada pela Figura 01 os campos Name, Location e Soluction Name conforme indicado. O campo Name representa o nome da NameSpace que acomodara as Classes do projeto de exemplo, Location refere-se ao diretrio onde os fontes do projeto sero guardados e Soluction Name o nome do projeto em si. Por fim clique no boto Ok.

Figura 01

Passo 2 Como resultado do passo anterior, teremos na janela Soluction Explorer representada plea Figura 02 exibindo as Classes do nosso projeto, at o momento somente a Classe inicial Calss1, representada pelo arquivo Class1.cs.

Figura 02

Apostila de C# e ASP.Net

25 de 168

Outra observao, se refere ao nome da Classe, aqui Class1, que conforme exibido na Listagem 01, promoveremos imediatamente uma alterao para Produto. Proceda como exibido nas Figura 03 e Figura 04, pois desta forma, no s o nome da Classe ser alterada, como o nome do arquivo que a representa na Soluction Explore tambm. Listagem 01 using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Projeto_OOP { public class Class1 { } }

Figura 03

Figura 04

Apostila de C# e ASP.Net
Listagem 02 using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Projeto_OOP { public class Produto { } }

26 de 168

O resultado fina pode ser observado na Listagem 02 com o nome da Classe j alterado para Produto.

Aqui vamos nos deter somente no desenvolvimento da Classe e seus aspectos, deixando as explicaes mais aprofundadas sobre o conceito de NameSpace para o tpico na sequncia que trata do assunto. Mas para no ficarmos no vazio, consideremos NameSpace como um agrupamento (lgico) de Classes. Para este exemplo, uma referncia para nossa Classe Produto, seria algo como: Projeto_OOP.Produto. Com referncia as quatro declaraes using no incio da Listagem 02, so referncias as NameSpaces do FrameWork .Net, que o ambiente do VisualStudio acrescentou julgando teis no desenvolvimento do cdigo que se seguir. Essas e outras NameSpace do FrameWork sero necessrias para que possamos fazer uso pleno da linguagem C#.

Apostila de C# e ASP.Net
Campos (Fields)

27 de 168

Um campo uma varivel de qualquer tipo que declarado diretamente em uma Classe ou Struct. Campos so membros da Classe compondo um modelo. [modificador] tipo nome; Exemplo: public class Calendario { public string dia = "Domingo"; //... }

Propriedades (Properties)
Em C#, uma propriedade um membro nomeado de uma classe, struct ou interface oferecendo uma maneira sistemtica de acessar campos particulares atravs do que chamado o get e set, ou seja, mtodos acessores. Exemplo: class Pessoa { private string nome; public string Nome { get { return nome; } set { nome = value; } } private int idade; public int Idade { get { return idade; } set { idade = value; } } }

Constantes (Constants)
A palavra-chave const usada para modificar uma declarao de um campo ou varivel local. Ela especifica que o valor do campo ou a varivel local constante, o que significa que ele no pode ser modificado. Exemplo: public class TesteConstante { static void Main() { const int c = 1984; Console.WriteLine("Minha constante = {0}", c); } } // Sada: Minha constante = 1984

Apostila de C# e ASP.Net
Acrescentando Membros (Fields e Properties) a Classe de Exemplo

28 de 168

Visando exemplificar a criao de Classes na linguagem C#, esteja com o ambiente do VisualStudio em execuo, procedendo da seguinte forma: Passo 1 Sobre a janela Soluction Explorer do projeto Projeto_OOP, clique no n Produto.cs com o boto direito do mouse, selecionando View Class Diagram conforme Figura 01. Este procedimento cria um mdulo diagrama permitindo no s visualizar a Classe Produto em forma de componente, mas acrescentar Membros sem que seja necessrio implenta-los manualmente no cdigo fonte.

Figura 01 O resultado a representao grfica da Classe Produto conforme imagem da Figura 02.

Figura 02

Apostila de C# e ASP.Net
Passo 2

29 de 168

Vamos agora definir os campos privados e seus mtodos set get, pblicos, possibilitando leitura e atribuio de valores. Se baseie na Figura 03 para acrescentar os campos privados na Classe Produto, clicando com o boto direito do mouse sobre a representao da Classe Produto no Diagrama.

Figura 03 Em seguida proceda como observado na Figura 04, definindo na janela Class Details o tipo long (inteiro longo) para o campo _id.

Figura 04

Apostila de C# e ASP.Net

30 de 168

Encerre esta etapa repetindo os passos anteriores para criar os campos _descricao de tipo string e _preco de tipo decimal. A representao grfica da Classe Produto dever estar semelhante a Figura 05.

Figura 05 Perceba como ficou o cdigo fonte aps adicionarmos campos privados em nossa Classe Produto, representado a seguir pela Liatagem 01. Listagem 01 using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Projeto_OOP { public class Produto { private long _id; private string _descricao; private decimal _preco; } }

Apostila de C# e ASP.Net
Passo 3

31 de 168

Objetivando criar os mtodos acessores aos campos privados, orientando-se pela Figura 06, selecione individualmente cada membro Field no Diagrama da Classe Produto. Para tanto clique com o boto direito do mouse sobre o campo _descricao, escolhendo no menu de contexto Rafactor | Encapsulate Field..., confirmando as etapas na sequncia da Figura 06, 07 e 08.

Figura 06

Figura 07

Apostila de C# e ASP.Net

32 de 168

Figura 08 Complete o processo repetindo a etapa para os campos _id e _preco. Por consequncia, teremos a representao grfica da Classe conforme a imagem da Figura 09 e o cdigo fonte implementando os mtodos set e get conforme demonstrado na Listagem 02.

Figura 09

Apostila de C# e ASP.Net
Listagem 02 public class Produto { private long _id; public long Id { get { return _id; } set { _id = value; } } private string _descricao; public string Descricao { get { return _descricao; } set { _descricao = value; } } private decimal _preco; public decimal Preco { get { return _preco; } set { _preco = value; } } }

33 de 168

Apostila de C# e ASP.Net
Construtores (Constructs) e Destrutores (Destructors)

34 de 168

Ao criarmos uma classe podemos definir um mtodo que ser executado toda vez que uma instncia da classe for criada. Este mtodo especial chamado de Construtor (Constructor) da classe. Colocamos neste mtodo todo o cdigo que deve ser executado na criao da classe. Por exemplo, se estamos criando uma classe que possui mtodos para fazer pesquisas em um banco de dados do SQL Server 2000. No mtodo Construtor podemos incluir o cdigo que estabelece a conexo com o banco de dados. Para que a classe seja de uso genrico, podemos definir parmetros a serem passados para o mtodo Construtor, de tal forma que a conexo seja estabelecida de acordo com o valor dos parmetros passados para o mtodo construtor. Se no definirmos um mtodo construtor explicitamente, o Framework .NET define e exige um mtodo construtor sem parmetros. Exemplo: public class Taxi { public bool isInitialized; public Taxi() { isInitialized = true; } } class TestTaxi { static void Main() { Taxi t = new Taxi(); Console.WriteLine(t.isInitialized); } } Exerccio using System; public class Livro { public string titulo; public string autor; public Livro() { titulo = "ASP.NET com C#"; autor = "Alfredo Lotar"; } public Livro(string tit,string aut) { titulo = tit; autor = aut; } }

Apostila de C# e ASP.Net
class TesteLivro { static void Main() { Livro lv = new Livro(); Console.WriteLine(lv.titulo); Console.WriteLine(lv.autor); Console.Read(); } }

35 de 168

Para chamar um destrutor, o C# usa um ~ (tio) antes do nome do construtor (sem parmetros). Ao atribuir null a um objeto, o garbage collector no executado no mesmo momento, o que significa que o objeto continua na memria e o mtodo destrutor no chamado na mesma hora. No possvel determinar quando o garbage collector chamado, portanto sempre aconselhvel evitar o uso de destrutores. Exemplo: class Car { ~Car() // destructor { // cleanup statements... } }

Apostila de C# e ASP.Net
Acrescentando Mtodos Construtores na Classe de Exemplo

36 de 168

Para tornarmos nossa Classe instancivel, ou seja ser axcecvel em um aplicativo cliente (inclusive por outras Classes dentro ou fora da NameSpace), devemos adicionar os mtodos abaixo em nossa Classe de exemplo. Particularmente este mtodo construtor no implementa nenhuma funcionalidade, e naturalmente no exige nenhum parmetro. public Produto() { }

Apostila de C# e ASP.Net
Namespaces

37 de 168

A palavra-chave namespace usada para declarar um escopo. Este escopo de namespace permite organizar o cdigo (Classes) e oferece uma maneira para criar tipos globalmente exclusivos. A palavra-chave using pode ser usada para que o nome completo no seja necessrio. Exemplo: using System; namespace NamespaceSamples { class ClassePrimeira { public void MetodoTeste() { Console.WriteLine(" MetodoTeste inside NamespaceSamples"); } } }

Partial
possvel dividir a definio de uma Classe ou uma Struct, interface ou mtodo em dois ou mais arquivos fonte. Cada arquivo contm uma seo para definio de tipo ou mtodo, e todas as partes so combinadas quando a aplicao compilada. Exemplo: public partial class Produto { private long _id private string _descricao private decimal _preco //Mtodos get e set omitidos } public partial class Produto { public void IncluirProduto() { //cdigo omitido } public DataTable ObterProduto(long id) { //cdigo omitido } }

Apostila de C# e ASP.Net
Alterando a Classe de Exemplo para Suportar Partial Class

38 de 168

Basicamente devemos adicionar um outro arquivo (Class)ao projeto, nomeando por exemplo como ProdutoBL.cs (caracterizando a funo de acomodar as Regras de Negcio Mtodos). Passo 1 Buscando adicionar a nova Classe, clique com o boto direito do mouse sobre o n que representa o projeto, em seguida, no menu de contexto selecione Add |New Item. Na sequncia, j com a caixa de dialogo Add New Item exibida (Figura 01), selecione o Template Class nomeando-o como ProdutoBL.cs.

Figura 01 Passo 2 Repare o resultado do cdigo gerado para a nova Classe, observando a Listagem 01. Listagem 01 using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Projeto_OOP { class ProdutoBL { } } Passo 3 Altere a assinatura da classe para que suporte Partial Class, conforme trecho em negrito na Listagem 02. Finalizando, promova tambm alterao na Classe Produto onde temos o modelo de dados (Membros), para que possa fazer parte de uma nica Classe Produto, ainda que assinada como Partial. A Listagem 03 exibe o cdigo em negrito que deve ser alterado na Classe.

Apostila de C# e ASP.Net
Listagem 02 using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Projeto_OOP { public partial class Produto { } } Listagem 03 using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Projeto_OOP { public partial class Produto { private long _id; public long Id { get { return _id; } set { _id = value; } } private string _descricao; public string Descricao { get { return _descricao; } set { _descricao = value; } } private decimal _preco; public decimal Preco { get { return _preco; } set { _preco = value; } } public Produto() { } } }

39 de 168

Apostila de C# e ASP.Net
Mtodos (Methods)

40 de 168

Um mtodo contm cdigo que atua sobre os dados do objeto. Os mtodos, falando em termos de Orientao a Objetos, descrevem as aes que podem ser realizadas pela classe. Na prtica, a funcionalidade de uma classe implementada atravs dos seus mtodos. Exemplo: [modificador] tipo_de_retorno nome (tipo parmetro) public class Operacoes { public int Soma(int n1, int n2) { return n1 + n2; } }

Modificadores de Acesso de Mtodos


Tipos e membros de tipo tm um nvel de acessibilidade, que controla se que possam ser usados no outro cdigo no seu Assembly ou outros assemblies. Voc especificar a acessibilidade de um tipo ou membro quando voc declar-lo usando um desses modificadores de acesso: Modificador public private protected internal protected internal Exemplo: // public class: public class Tricycle { // protected method: protected void Pedal() { } // private field: private int wheels = 3; // protected internal property: protected internal int Wheels { get { return wheels; } } } Descrio O tipo ou membro pode ser acessado por qualquer outro cdigo no mesmo assembly ou outro conjunto que faz referncia a ele. O tipo ou membro s pode ser acessado pelo cdigo na mesma classe ou struct. O tipo ou membro s pode ser acessado pelo cdigo no mesmo classe ou struct, ou em uma classe derivada. O tipo ou membro pode ser acessado por qualquer cdigo no mesmo assembly, mas no no outro conjunto. O tipo ou membro pode ser acessado por qualquer cdigo no mesmo assembly, ou por qualquer classe derivada em outro assembly.

Apostila de C# e ASP.Net
Implementando Mtodos de Negcio na Classe Produto

41 de 168

Implementaremos mtodos de negcio na Classe Produto, lanando mo da parte da Classe representada pelo arquivo ProdutoBL.cs, fazendo claramente uma diviso das funes de ao da Classe, com relao ao modelo e os mtodos construtores. Passo 1 Criar um mtodo para funcionalidade InserirProduto, sem parmetros e que retorne uma mensagem de sucesso ou no. Confira a Listagem 01. Listagem 01 public string InserirProduto() { //Cdigo omitido aqui return "Produto inserido com sucesso."; } Passo 2 Criar um mtodo para excluso de Produto, que implemente um parmetro do tipo long. Confira na Listagem 03 o cdigo. Listagem 02 public void ExcluirProduto(long id) { //Cdigo omitido aqui } Passo 3 Criar um mtodo que retorne um conjunto de registros (DataTable), implementando um parmetro para pesquisa pelas iniciais da descrio de Produto. Ressaltamos aqui, a necessidade de adicionarmos uma referncia para a NameSpace System.Data para podermos utilizar o tipo DataTable. Para tanto, adicione ento using System.Data; na rea superior do cdigo fonte. Listagem 03 public DataTable ListaProduto(string descricao) { DataTable DT = new DataTable(); //Cdigo omitido aqui return DT; }

Apostila de C# e ASP.Net
Encapsulamento

42 de 168

Encapsulamento vem de encapsular, que em programao orientada a objetos significa separar o programa em partes, o mais isoladas possvel. A idia tornar o software mais flexvel, fcil de modificar e de criar novas implementaes. Uma grande vantagem do encapsulamento que toda parte encapsulada pode ser modificada sem que os usurios da classe em questo sejam afetados. O encapsulamento protege o acesso direto (referncia) aos atributos de uma instncia fora da classe onde estes foram declarados. Esta proteo consiste em se usar modificadores de acesso mais restritivos sobre os atributos definidos na classe. Depois devem ser criados mtodos para manipular de forma indireta os atributos da classe.

Herana
o mecanismo que permite definir uma nova classe a partir de uma classe j existente. A classe que est sendo criada dita subclasse ou classe filha da classe j existente. Em contrapartida a classe j existente chamada de superclasse da classe que est sendo criada. A subclasse herda a estrutura de dados e os mtodos da superclasse, podendo adicionar variveis na estrutura de dados herdada, bem como adicionar novos mtodos e reescrever mtodos herdados. Uma classe pode possuir uma nica superclasse herana simples, ou pode conter mais do que uma superclasse herana mltipla. A herana mltipla tem sido alvo de muitas discusses e controvrsias. A nica linguagem, do FrameWork .NET, que implementa diretamente a herana mltipla o C++. A grande discusso em torno da herana mltipla tem a ver com a relao custo x benefcio, uma vez que a mesma de difcil implementao e concepo, embora os benefcios nem sempre sejam os esperados. Herana um conceito fundamental para a orientao a objetos. Atravs do mecanismo de herana podemos criar uma classe baseada em outra j existente. A nova classe que est sendo criada herda todas as propriedades e mtodos da classe base, tambm chamada de classe me ou superclasse conforme descrito anteriormente. A herana evita que as propriedades e mtodos da classe me tenham que ser redefinidos na classe filho, embora a classe filho ou subclasse possa redefinir os mtodos da classe me, atravs de um mecanismo conhecido como Overwrite. Para ilustrar o mecanismo de herana vamos a um exemplo prtico. Vamos imaginar que voc esteja projetando um programa baseado na orientao a objetos, evidentemente, para uma Mercearia. Uma das provveis classes seria a classe Clientes. Nesta classe poderamos definir as caractersticas e mtodos bsicos para um Cliente bsico. Para a classe Clientes poderamos definir as seguintes propriedades: Nome CPF RG Identidade Endereo Cidade CEP Fone E-Mail Crdito Para a classe Clientes poderamos definir os seguintes mtodos: Cadastrar Excluir Atualizar

Apostila de C# e ASP.Net

43 de 168

Observe que a nossa classe Clientes possui apenas as propriedades e mtodos comuns a qualquer Cliente, Este um dos princpios da utilizao de classes: nas classes de primeiro nvel definimos apenas as propriedades e mtodos comuns, os quais devero ser utilizados pelas classes dos demais nveis. Na Figura abaixo temos uma viso geral da classe Clientes.

Exemplo de Herana using System; public class Conta { public virtual double Calculo() { return (6*15); } } public class Conta1 : Conta { public override double Calculo() { return (6*5); } }

Apostila de C# e ASP.Net
Modificadores de classe
Os seguintes modificadores podem ser usados em classes, no C#: Modificador new sealed abstract Descrio

44 de 168

usado em classes aninhadas. Se a classe tiver o mesmo nome da classe externa, devemos usar esse moderador para indicar a sobreposio. a classe no pode ter classes derivadas. a classe no pode ser instanciada.

Modificadores que devem ser para ocultar ou redefinir mtodos da classe-base. Modificador abstract override virtual new Descrio Indica que o mtodo no possui implementao. Redefine um mtodo definido como virtual. Indica que o mtodo pode ser redefinido na classe derivada. Indica que o mtodo deixa de ser virtual em uma classe derivada.

Virtual
A palavra-chave virtual usada para modificar um mtodo, propriedade, indexador ou declarao de evento e permitir que ser substitudo em uma classe derivada. Por exemplo, esse mtodo pode ser substitudo por qualquer classe que herda a ele: public virtual double Area() { return x * y; }

Base
A palavra-chave base usada para acessar membros da classe base da dentro uma classe derivada: Chame um mtodo na classe base que foi substitudo por outro mtodo. Especifica o construtor de classe base deve ser chamado durante a criao de instncias da classe derivada. Um acesso de classe base permitido apenas em um construtor, um mtodo de instncia ou um acessador de propriedade de instncia. Exemplo: public class Person { protected string ssn = "444-55-6666"; protected string name = "John L. Malgraine"; public virtual void GetInfo() { Console.WriteLine("Name: {0}", name); Console.WriteLine("SSN: {0}", ssn); } }

Apostila de C# e ASP.Net
class Employee : Person { public string id = "ABC567EFG"; public override void GetInfo() { // Calling the base class GetInfo method: base.GetInfo(); Console.WriteLine("Employee ID: {0}", id); } } class TestClass { static void Main() { Employee E = new Employee(); E.GetInfo(); } } /* Sada Name: John L. Malgraine SSN: 444-55-6666 Employee ID: ABC567EFG */

45 de 168

Override
O modificador de override necessrio para estender ou modificar a implementao abstrata ou virtual de um mtodo herdado, propriedade, indexador ou evento. Exemplo: abstract class ShapesClass { abstract public int Area(); } class Square : ShapesClass { int side = 0; public Square(int n) { side = n; } // Area method is required to avoid // a compile-time error. public override int Area() { return side * side; }

Apostila de C# e ASP.Net
static void Main() { Square sq = new Square(12); Console.WriteLine("Area of the square = {0}", sq.Area()); } interface I { void M(); } abstract class C : I { public abstract void M(); } } // Sada: Area of the square = 144

46 de 168

Um mtodo override fornece uma implementao nova de um membro que herdada de uma classe base. O mtodo que substitudo por uma declarao de override conhecido como o mtodo base substitudo. O mtodo de base substitudo deve ter a mesma assinatura que o mtodo override. Voc no pode substituir um mtodo ou virtual no-esttico. O mtodo substitudo base deve ser virtual, abstract ou override. Uma declarao de override no possvel alterar a acessibilidade do mtodo virtual. Tanto o mtodo override e o mtodo virtual devem ter o mesmo acessar modificador nvel. Voc no pode usar a new, static, virtual ou abstract modificadores para modificar um mtodo override. Uma declarao de propriedade substituio deve especificar exatamente o mesmo modificador de Acessar, tipo e nome como a propriedade herdada, e a propriedade substituda deve ser virtual, abstractou override.

Apostila de C# e ASP.Net
Interfaces

47 de 168

Uma interface um tipo de referncia que um pouco semelhante a uma classe base abstrata que consiste apenas membros abstratos. Quando uma classe deriva de uma interface, ele deve fornecer uma implementao para todos membros da interface. Uma classe pode implementar mltiplas interfaces mesmo que ele possa herdar da apenas uma nica direta classe base. Interfaces so usadas para definir recursos especficos para classes que no tm necessariamente uma relao " um " . Por exemplo, a interface de IEquatable[`1] pode ser implementada por qualquer classe ou struct que deve permitir a determinar se dois objetos do tipo so equivalentes (no entanto, o tipo define equivalncia) de cdigo do cliente. IEquatable<(Of <(T>)>) no implica o mesmo tipo de " um " relao que existe entre uma classe base e uma classe derivada (por exemplo, um Cachorro uma Animal). Exemplo: interface IMyInterface { void MethodToImplement(); } Classe implementando interface: class InterfaceImplementer : IMyInterface { static void Main() { InterfaceImplementer iImp = new InterfaceImplementer(); iImp.MethodToImplement(); } public void MethodToImplement() { Console.WriteLine("MethodToImplement() called."); } }

Apostila de C# e ASP.Net
Erros e Manipulao de Exceo

48 de 168

Quando algo der errado enquanto um programa C# est Executando, uma exceo ocorre. Excees interromper o fluxo atual do programa e se nada for feito, o programa simplesmente pra Executando. Excees podem ser causadas por um bug em que o programa por exemplo, se um nmero dividido por zero ou pode ser um resultado de alguns entrada inesperado, tais como um usurio selecionar um arquivo que no existe. Como um programador, voc precisar permitir que o programa lidar com esses problemas sem falhando at parar. C# fornece vrias palavras-chave try, catche finally que permite que programas detectar excees, lidar com eles e continuar a Executando. Eles so uma ferramenta muito til para tornar seus aplicativos mais confiveis. Try e Catch O try e catch as palavras-chave so usadas juntos. Coloque try o Bloquear de cdigo que voc est preocupado pode gerar uma exceo e catch para conter o cdigo que ser executado se a exceo ocorrer. Neste exemplo, um clculo cria uma diviso por zero exceo, que, em seguida, detectada. Sem o try e catch blocos, esse programa falhar. Exemplo: class ProgramTryCatch { static void Main() { int x=0, y=0; try { x = 10 / y; } catch (System.DivideByZeroException) { System.Console.WriteLine("There was an attempt to divide by zero."); } } }

Finally

Cdigo contido em um Bloquear de finally sempre executado, se ocorrer uma exceo ou no. Use o Bloquear de finally para fazer se recursos so retornados: Por exemplo, para certificar-se que um arquivo esteja fechado. Exemplo: try { // Code to try here. } catch (SomeSpecificException ex) { // Code to handle exception here. } finally { // Code to execute after try (and possibly catch) here. }

Apostila de C# e ASP.Net
Windows Forms

49 de 168

Que o FrameWork .Net foi todo projetado tendo em vista a internet nos j sabemos , porm nem todas as aplicaes sero desenvolvidas para a web. A utilizao de Windows Forms (Win Form) o mecanismos que nos permite criar as tradicionais aplicaes para Windows. Win Forms o Novo Mecanismos para construo de Aplicativos Windows, baseados no FrameWork .Net. Um Windos Form bastante semelhante ao conceito de formulario utilizado pelas verses atuais do VB e Delphi. O Formulrio o Elemento Bsico, sobre o qual adicionaremos controles e cdigos para determinados eventos associados com o Formulrio e seus Controles. O Windows Form tudo isso, porm com a diferena que pode usar todos os mecanismos do .Net FrameWork, dentre os principais mecanismos disponveis, destaca-se o mecanismo de herana, o qual chamado, para o caso do Win Forms, de Herana Visual. O Win Forms, como tudo no FrameWork .Net um Objeto, o qual obtido a partir de uma classe bsica. Todos os formulrios no FrameWork .Net so baseados uma das seguintes classes: System.Windows,Forms. So baseados em um formulrio padro criado pelo usurio, atravs de mecanismos de herana.

Em Resumo, o Windows Form o Elemento bsico de Interao com o Usurio; em outras palavras, o Win Forms o Elemento visual das aplicaes, elemento este com o qual o usurio ir trabalhar. Tendo em vista o nosso breve aprendizado sobre o FrameWork, Orientao a Objetos e algumas funcionalidades do Visual Studio 2005 como IDE de Desenvolvimento, vamos praticar.

Apostila de C# e ASP.Net
Conhecendo o Visual Studio 2008
Server Explorer Aba responsvel por toda a parte de conexo com o Banco.

50 de 168

Solution Explorer Arvor do Projeto, local onde se v todos os Forms, Classes, Refrencias e Propriedades do Projeto. ToolBox Caixa de Componentes(Objetos Visveis e no visveis ) (Win Form, Web Form).

Apostila de C# e ASP.Net
Primeiro Projeto em C#
Parte 1

51 de 168

Proposta: Criar um projeto Windows Application contendo um modulo de calculadora e um modulo de cadastro de produtos. Criaremos um formulrio principal em nossa aplicaao com o controle Menu para acessar os seus mdulos. Neste formulrio teremos o primeiro contato com a linguagem C# e a IDE do Visual Studio. Aprenderemos tambm sobre variveis e tipos existentes, alm de iniciar a codificao na linguagem. Para isto, vamos iniciar o Visual Studio e seguir os passos descritos abaixo: Passo 1: Acessando a opo de menu File | New | Project, obteremos acesso caixa de dilogo representada na figura 01. Selecione Windows Application para iniciarmos um projeto baseado em WinForm. Preencha o campo nome com AppAula e aponte o projeto para sua pasta.

Figura 01 Janela de dilogo para criao de um novo projeto Como resultado desta etapa, o Visual Studio apresentado j com um novo projeto e um formulrio disponvel. Este formulrio ser o formulrio principal da nossa aplicao, ento, usando o Solution Explorer, renomeie o formulrio de Form1.cs para FormPrincipal.cs. O Visual Studio ir perguntar se voc deseja renomear todas as referncias de Form1. Clique em 'Sim' para continuar.

Figura 02 Confirmao para alterar nome do formulrio

Passo 2: Acrescente ao formulrio FormPrincipal o controle MenuStrip localizado na Toolbox dentro da seo Menus & Toolbars. O menu ir automaticamente se posicionar no topo do formulrio como padro Windows. Onde aparece Type Here voc pode escrever os itens do menu conforme a lista abaixo. O resultado ser apresentado na figura 03.

Apostila de C# e ASP.Net
Cadastro - Clientes - Produtos Utilitrios - Calculadora Sair

52 de 168

Figura 03 Formulrio principal com controle MenuStrip Passo 3: Adicione ao formulrio um controle StatusStrip, tambm localizado na seo Menus & Toolbars da Toolbox. Adicione dois StatusLabel ao StatusStrip e mude suas propriedades Name para statusData para o primeiro e statusHora para o segundo. Passo 4: Adicione um controle Timer localizado na seo Compoennts da Tollbox e mude suas propriedades conforme a tabela abaixo: Propriedade Name Interval Enabled Valor tmRelogio 1000 True

Passo 5: Dando um duplo clique no controle Timer, vc ir para o cdigo no evento Tick do mesmo. Agora vamos iniciar a codificao conforme descrito abaixo:
using ... namespace AppAula { public partial class FormPrincipal : Form { public FormPrincipal() { InitializeComponent(); } private void tmRelogio_Tick(object sender, EventArgs e) { statusData.Text = DateTime.Now.ToShortDateString(); statusHora.Text = DateTime.Now.ToLongTimeString(); }

} }

Apostila de C# e ASP.Net
Podemos agora executar a aplicao para vermos o resultado.

53 de 168

Note o delay que ocorre para que o tmRelogio inicie. Para evitar este bug, podemos chamar o mtodo tmRelogio_Tick aps a inicializao do formulrio. Ento, dentro da declarao do formulrio, aps InitializeComponent();, faa a chamada do mtodo.
public FormPrincipal() { InitializeComponent(); tmRelogio_Tick(null, null); }

Parte 2 Calculadora
Agora adicionaremos um formulrio na aplicao para aprenderemos a manipular classes, mtodos, atributos e propriedades. Passo 1: Clique com o boto direito do mouse no nome da aplicao dentro do Solution Explorer e escolha a opo Add | New Item... e na janela que se abre, selecione Windows Form e preencha seu nome de FormCalculadora conforme a figura 04.

Figura 04 Adicionando uma nova classe ao projeto

Passo 2: Monte a tela da calculadora com os controles abaixo alterando suas propriedades conforme descrito. Teremos um formulrio semelhante ao da figura 05. Controle Label TextBox Label TextBox Label Label ComboBox Button Propriedade Text Name Text Name Text Name Text Name Name Text Valor Valor 1: textValor1 Valor 2: textValor2 Resultado: labelResultado Operao CmbOperacao BtCalcular Calcular

Apostila de C# e ASP.Net

54 de 168

Figura 05 Formulrio Calculadora

Passo 3: Vamos adicionar uma classe ao projeto que ser responsvel por ter as propriedades e mtodos da calculadora. Clique com o boto direito do mouse sobre o nome do projeto no Solutio Explorer e escolha Add | New Item.... Selecione Class na caixa de dilogo e d o nome de Calculadora.cs e clique em Add. Feito isso, a classe exibida em nossa janela para iniciarmos a codificao das suas propriedades, atributos e mtodos conforme o cdigo abaixo:
class Calculadora { private Double _valor1; public Double Valor1 { get { return _valor1; } set { _valor1 = value; } } private Double _valor2; public Double Valor2 { get { return _valor2; } set { _valor2 = value; } } public enum Operacao { Soma, Subtracao, Multiplicacao, Divisao } public Calculadora() { } public Calculadora(Double V1, Double V2) { this._valor1 = V1; this._valor2 = V2; } public Double Somar() { return this._valor1 + this._valor2; } public Double Subtrair() { return this._valor1 - this._valor2; }

Apostila de C# e ASP.Net
public Double Multiplicar() { return this._valor1 * this._valor2; } public Double Dividir() { return this._valor1 / this._valor2; } public Double Calcular(Operacao oper) { switch (oper) { case Operacao.Soma: return Somar(); case Operacao.Subtracao: return Subtrair(); case Operacao.Multiplicacao: return Multiplicar(); case Operacao.Divisao: return Dividir(); default: return 0; } }

55 de 168

Passo 4: Com a classe pronta, vamos voltar ao formulrio FormCalculadora pra implementarmos o cdigo abaixo nos eventos que seguem:
public partial class FormCalculadora : Form { public FormCalculadora() { InitializeComponent(); cmbOperacao.DataSource = Enum.GetValues(typeof(Calculadora.Operacao)); } private void btnCalcular_Click(object sender, EventArgs e) { Double V1 = Convert.ToDouble(textValor1.Text); Double V2 = Double.Parse(textValor2.Text); Calculadora calc = new Calculadora(V1, V2); Double resultado = calc.Calcular((Calculadora.Operacao)cmbOperacao.SelectedItem); labelResultado.Text = "Resultado: " + resultado.ToString("N2"); } }

Passo 5: Resta agora fazer a chamada do formulrio FormCalcuuladora no item do menu Calculadora no formulrio FormPrincipal. Para isto, d um duplo clique no item do menu e proceda com o cdigo abaixo e execute a aplicao para ver o resultado.
private void calculadoraToolStripMenuItem_Click(object sender, EventArgs e) { FormCalculadora frmCalc = new FormCalculadora(); FrmCalc.ShowDialog(this); }

Apostila de C# e ASP.Net
Segundo Projeto em C# Asembly(DLL) Contendo DataSet Tipado
Parte I

56 de 168

Proposta Criar uma camada de acesso a dados, que fornea uma interface com mtodos para manuteno completa de uma tabela. Para tanto criaremos um objeto DataSet para uma tabela, com dois mtodos de pesquisa nesta alm das funcionalidades bsicas (Insert, Update e Delete). Tambm iremos implementar uma classe que fornea acesso aos mtodos desta classe DataSet, ocultando detalhes relativo a classe que se relaciona com o BD. Entre outras questes relevantes, considerando o paradigma do modelo de Programao Orientada a Objetos (OOP), a classe ltima citada, alm de ocultar detalhes da implementao de acesso e manipulao de dados, permite uma mudana de MidlleWare (Providers) de acesso a dados. Como ltima ressalva, citamos o fato de inicialmente estarmos utilizando estas duas classes (DataSet e Acesso) em um projeto Winform, permitindo sua reutilizao em projetos outros como: Aplicativos Web e Webservices. Esta camada ser desenvolvida em formato de dll. A Estrutura do Projeto Na prtica sero duas classes. Uma ser o DataSet e a outra uma classe de acesso aos mtodos do DataSet. Depois faremos outro aplicativo baseado em Winform, fazendo acesso as funcionalidades do primeiro aplicativo. Na sequencia relacionamos a lista de mdulos de cada aplicativo: Projeto Produto -ClassProduto -DSProduto Projeto WinForm -FormPrincipal -FormConsProduto -FormCadProduto

Passo 01: Acessando a opo de menu File|New Project, obteremos acesso a caixa de dialogo representada pela figura 01. Selecione Class Library para iniciarmos um projeto. Preencha a propriedade Name como Produto. Finalizando clique no boto OK.

Figura 01

Apostila de C# e ASP.Net
Em seguida nomeie a Class1.cs como ClassProduto.cs, salvando em seguida com este nome. Para o nome do projeto, confirme os dados conforme

57 de 168

Passo 02: Vamos agora implementar o esqueleto da classe ClassProduto, definindo os Campos, Propriedades e Mtodos para em seguida realmente implementarmos as funcionalidades. Veja a figura 01 que expem toda a classe e tambm os comentrios sobre as instrues ali contidas. using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Data; namespace Produto { public class ClassProduto { private int _Id; private string _Descricao; private decimal _Preco; private int _Original_Id; private string _Original_Descricao; private decimal _Original_Preco; public int Original_Id { get { return _Original_Id; } set { _Original_Id = value; } } public decimal Original_Preco { get { return _Original_Preco; } set { _Original_Preco = value; } } public string Original_Descricao { get { return _Original_Descricao; } set { _Original_Descricao = value; } }

Apostila de C# e ASP.Net
public decimal Preco { get { return _Preco; } set { _Preco = value; } } public string Descricao { get { return _Descricao; } set { _Descricao = value; } } public int Id { get { return _Id; } set { _Id = value; } } /// Altera um produto existente public void Alterar() { } /// Cria um novo produto public void Incluir() { } /// Exclui um produto public void Excluir() { } public DataTable ObterProduto(int Id_Produto) { } /// Retorna Vrios produtos, com base nas iniciais do campo descrio public DataTable ObterProduto(string Descricao) { } } }

58 de 168

Apostila de C# e ASP.Net

59 de 168

Com os Fields (campos) da nossa Classe Criados precisamos encapsular os campos criando assim as Properties, como segue na figura abaixo:

Figura 02

Passo 03: Um recurso bastante interessante do Visual Studio 2008, extendendo-se naturalmente ao C#.Net, a possibilidade de exibirmos uma Classe em forma de diagrama (figura 02). De forma inversa, podemos inclusive criar elementos, Fields(campos), Properties(propriedades) e Methods(mtodos) diretamente no diagrama. Como exemplo dessas possibilidades, confira as figuras a seguir, observando como fcil e produtivo tal recurso. Com objetivo de experimentar tal recurso, clique sobre o diagrama da classe com o boto direito do mouse, fazendo opo Add. Com este menu de contexto ativo, escolha Field. O resultado a declarao automtica no corpo da classe no local prprio, bastando alternar para a pgina de cdigo da classe, observando a declarao abaixo.

private double _Teste;

Procedendo da mesma maneira para criar uma propriedade, faa a opo Method, observando em seguida a declarao de tal propriedade e seus mtodos Get e Set. Para criar um mtodo, basta tambm proceder como nas duas intrues anteriores e observar o resultado.

Apostila de C# e ASP.Net

60 de 168

Figura 03

Passo 04: Uma vez definido toda a estrutura base da classe, necessitamos agora criar um DataSet Tipado que realmente implemente o acesso aso dados, bm como, possibilite por intermdio da classe ClassProduto a incluso, excluso e atualizao de registros no banco de dados. Um passo importante se faz necessrio antes de criarmos tal DataSet. Refirimo-nos a prpria conexo com o banco de dados. Acesse o menu View, habilitando a exibio do utilitrio Server Explorer. Este recurso permite no s criarmos vrias conexes para Providers diferentes, como permite criarmos objetos de banco de dados entre outros. Observe a figura 04, que expe este recurso.

Figura 04

Para criar uma nova conexo, clique com o boto direito do mouse sobre Data Connection na janela do Server Explorer e ser exibido a caixa de dialogo Add Connection (figura 05).

Apostila de C# e ASP.Net

61 de 168

Figura 05 Figura 04 - Clicando no boto Change, nesta caixa de dialogo, ser exibido a caixa de dialogo Change Data Source, onde podemos trocar o estabelecer o Provider de acesso a dados especfico par o banco de dados desejado. Neste caso optamos pelo Provider do banco de dados MS-SQL Server, mas em outras etapas faremos uso de outros Providers para comprovar a possibilidade de troca de provedor de dados, sem grande impacto sobre a aplicao num todo. Confira na imagem da figura 06.

Figura 06

Apostila de C# e ASP.Net
Uma vez criado o n que representa a conexo, podemos partir para a prxima etapa.

62 de 168

Passo 05: Iniciando o processo, clique no menu Data, escolhendo a opo New Data Source. Observe a figura 7, onde escolhemos a origem dos dados, neste caso Database .

Figura 7

Em seguida, conforme demonstra a figura 8, iremos selecionar a conexo recm-criada.

Figura 8

Apostila de C# e ASP.Net

63 de 168

Clicando em Next, na caixa de dialogo Data Source Configuration Wizard (figura 8) basta escolher na estrutura de rvore a tabela Produtos e dando um nome para o DataSet. Em seguida clique em Finish e teremos um objeto visual colocado no mdulo DSProduto representando um DataTable, objeto esse que onde implementaremos os mtodos necessrios a nossa classe. Observe o resultado exposto na figura 9.

Figura 9

Figura 10

Observe a figura 9 onde um DataTable denominado Produto, implementa um TableAdapter nomeado como ProdutoTableAdapter. Nele encontramos criado automticamente um mtodo nomeado como GetData com a seguinte instruo SQL: SELECT id, descricao, preco FROM Produtos

Esta instruo dever ser alterada para que possamos obter somente um registro, baseado na chave-primria da tabela. Lembre-se que nosso mtodo ObterProduto, sobrecarregado, em uma de suas implementaes, requer o identificador de um produto para retornar um objeto DataTable com tal registro. Assim o cdigo correto : SELECT id, descricao, preco FROM Produtos WHERE (id = @id)

Repare a incluso do parmetro @id, que ser substitudo com o valor passado por parmetro no mtodo. Existe duas maneiras de se alterar a instruo SQL deste mtodo. A primeira, representada pela figura 11, acessar a caixa de propriedade deste mtodo, clicando sobre o mesmo com o boto direito do mouse e manipulando diretamente na propriedade CommandText. Aproveitando o ensejo, altere tambm o nome do mtodo para ObterProdutoID em GetMethodName, evidenciando sua habilidade para retornar um registro baseado na pesquisa sobre o campo Id.

Figura 11 A outra maneira sugerida, conforme podemos observar na figura 12, clicando nas reticncias da propriedade CommandText, ter acesso ao utilitrio Query Builder, onde temos recursos avanados para montagem de consultas

Apostila de C# e ASP.Net
parametrizadas. Faa da maneira que melhor lhe convir.

64 de 168

Figura 12 Passo 07: Devemos agora adicionar mais um mtodo de pesquisa ao DataSet, denominado ObterProdutodescricao, permitindo a pesquisa na tabela Produtos pelas iniciais do Produto (campo descricao). Assim, clique sobre ProdutosTableAdapter com o boto direito do mouse, escolhendo Add Query no menu de contexto. A caixa de dialogo (figura 13) TableAdapter Query Configuration Wizard apresnetada, para a qual faremos a escolha da primeira opo (Use SQL Statements), clicando em seguida no boto Next.

Figura 13

Apostila de C# e ASP.Net
Veja a figura 14 para essas orientaes.

65 de 168

Caracterizando a Query a ser criada, no nosso caso uma istruo Select, faa a opo SELECT whith returns rows indicando que desejamos criar uma istruo que retorne registros. Clique em Next para prosseguir.

Figura 14

Nesta etapa basta digitar a instruo Select desejvel, ou ainda, utilizar o Query Builder para ajuda neste sentido clicando em Next para proseguir. A figura 15 reflete esta etapa.

Figura 15

Apostila de C# e ASP.Net

66 de 168

Imediatamente antes de finalizar, devemos adaptar o nome do mtodo para nossa realidade. Repare na figura 16 os nomes alterados para FillByDescricao e ObterProdutoDescricao respectivamente.

Figura 16

Clicando em Finish obtemos o resultado final conforme figuaras 17 e 18. Pronto o novo mtodo do DataSet est concluido.

Figura 17

Figura 18

Apostila de C# e ASP.Net

67 de 168

importantssimo ressaltar, que ainda que no tenhamos fieto nenhum esforo, os mtodos necessrios para incluso, alterao e excluso de registros na tabela Produto, foram criados, podendo ser acessado por uma instncia do objeto ProdutoTableAdapter, presente na classe DSProduto. Tais mtodos so denominados como: Insert, Update e Delete, podendo ser acessados conforme exemplo abaixo. DSProdutoTableAdapters.PRODUTOTableAdapter Produtos = new DSProdutoTableAdapters.PRODUTOTableAdapter(); Produtos.Update(_Id, _Descricao, _Preco, _Original_Id, _Original_Descricao, _Original_Preco); Na verdade, podemos e devemos interferir nas intrues criadas para as propriedades InsertCommand, DeleteCommand e UpdateCommand, ajustando as intrues conforme objetivo. Para acessar tais propriedades basta clicar com o boto direito do mouse sobre ProdutoTableAdapter, escolhendo Properties no menu de contexto. Observe tal caixa de dialogo conforme figura 19.

Para a instruo Insert, nada alm de quatro parmetros, um para cada campo da tabela produto. Tais parmetros sempre devem ter o nome iniciado com @, sendo opcional mas muito importante, que tenham o nome da coluna para qual sero atribuidos. Ver cdi abaixo. INSERT INTO Produtos(id, descricao, preco) VALUES (@id,@descricao,@preco) Com relao a instruo Delete, mais simples e objetiva, basta um nico parmetro para identificar o registro pela chave-primria da tabela. No caso o campo Id. Confira o cdigo asseguir.

DELETE FROM Produtos WHERE id = @Original_id

A exceo a simplicidade no se aplica a instruo Update. No basta definirmos os parmetros na quantidade de atribuies, sendo necessrio parmetros extras para implementao da clusula Where. Este fato deve-se a necessidade considerarmos a concorrncia de dados. Quando simultneamente dois o mais processos obterem o mesmo registro para alterao, devemos prever que no momento da atualizao de um desses processos, um entre os trs j teria finalizado com sucesso, obrigando ser sinalizado quando da tentativa de upadete por dos dois processos restantes. Isto no uma regra, mas se no assim procedermos, teriamos uma situao que um registro obtido, com campos tendo valores originais no momento da efetiva alterao j teriam sido mudados. Caso isso no seja uma restrio, basta manter como parmetro, a chave-primria, neste caso, o campo Id.

UPDATE WHERE

Produtos SET descricao = @descricao, preco = @preco

(id = @Original_id) AND (descricao = @Original_descricao) AND (preco = @Original_preco)

Variao do comando Delete levando-se em conta as mesmas condies do Update, ou seja, concorrncia de dados.

DELETE FROM Produtos WHERE (id = @Original_id) AND (descricao = @Original_descricao) AND (preco = @Original_preco)

Apostila de C# e ASP.Net

68 de 168

Figura 19

Passo 08: J que toda implementao do DataSet DSProduto est finalizada, com mtodos necessrios a atender nossa classe ClassProduto, vamos agora fazer uso dos mtodos deste DataSet em nossa classe, visando assim dar funcionalidaes aos mtodos da classe classProduto para que aplicativos possam fazer uso. Observe o cdigo em questo na listagem 02. /// Altera um produto existente /// </summary> public void Alterar() { DSProdutoTableAdapters.ProdutosTableAdapter Produtos = new DSProdutoTableAdapters.ProdutosTableAdapter(); Produtos.Update(_Descricao, _Preco, _Original_Id, _Original_Descricao, _Original_Preco); } /// Cria um novo produto public void Incluir() { DSProdutoTableAdapters.ProdutosTableAdapter Produtos = new DSProdutoTableAdapters.ProdutosTableAdapter(); Produtos.Insert(_Id, _Descricao, _Preco); }

Apostila de C# e ASP.Net
/// Exclui um produto public void Excluir() { DSProdutoTableAdapters.ProdutosTableAdapter Produtos = new DSProdutoTableAdapters.ProdutosTableAdapter(); Produtos.Delete(_Id, _Descricao, _Preco); } public DataTable ObterProduto(int id_produto) { DSProdutoTableAdapters.ProdutosTableAdapter Produtos = new DSProdutoTableAdapters.ProdutosTableAdapter(); return Produtos.ObterProdutoID(id_produto); } /// Retorna Vrios produtos, com base na descrio recebida public DataTable ObterProduto(string Descricao) { DSProdutoTableAdapters.ProdutosTableAdapter Produtos = new DSProdutoTableAdapters.ProdutosTableAdapter(); return Produtos.ObterProdutoDescricao(Descricao); } Listagem 02

69 de 168

Acima vemos um ntido modelo de Polimorfismo, temos um mtodo denominado ObterProduto com dois parmetros. Sendo assim terminamos os conceitos bsicos de OO.

Apostila de C# e ASP.Net
Parte II O Projeto Cliente

70 de 168

Desenvolveremos nesta etapa um aplicativo basedo Windows Forms, que dever gerar as interfaces necessrias para consumir os mtodos da nossa Dll anteriormente desenvolvida. J que investimos na separao da lgica de negcio e acesso a dados, livrando nosso aplicativo de camada de apresentao de ter que lidar com cdigo que no diga respeito a funcionalidade e aparncia, vamos ento investir nosso tempo em um aplicativo que preza por utilizar as melhores prticas e padres do desenvolvimento. Neste artigo complementar, faremos uso de um mtodo exposto pela Dll, implementando uma consulta parametrizada permitindo a interao do usurio que poder fazer submisses consecutivas por intermdio de um formulrio.

Consulta de Produtos.
Construa uma Nova Aplicao no Menu File New Project.

Figura 01

O Nome do Form criado automaticamente dever ser FormPrincipal.cs. Adicione ao FormPrincipal os seguintes componentes.

Apostila de C# e ASP.Net
Controle MenuStrip Origem (Toolbox) Menus e ToolBars Propriedade Valor

71 de 168

Devendo Criar os seguintes itens de menus Cadastros Produtos Sair. Devendo ficar assim:

Figura 02 Com o Boto direito do Mouse sobre o Solution Explorer, selecione a opo ADD Windows Forms.

Figura 03

Apostila de C# e ASP.Net
Salvando-o como Form_Consulta_Produto, e colocando os Seguinte Componentes sobre o mesmo.
Controle MenuStrip Button Origem (Toolbox) Menus e ToolBars Commom Controls Name Text Button Commom Controls Name Text Button Commom Controls Name Text Button Commom Controls Name Text Button Commom Controls Name Text Label TextBox DataGridView GroupBox Commom Controls Commom Controls Data Containers Text Name Name Dock Name Text GroupBox Containers Dock Name Text Fill GroupBox_2 ButtonPesquisar Pesquisar ButtonIncluir Incluir ButtonAlterar Alterar ButtonExcluir Excluir Button_Sair Sair Propriedade Valor

72 de 168

Nome Parcial do Produto TextBox_Descricao GridConsulta Top GroupBox_1

O Form dever ficar da seguinte forma.

Figura 04

Apostila de C# e ASP.Net
Configurando o Objeto Grid View.

73 de 168

Figura 05

Passo 3: Devemos linkar a aplicao com a Dll, para tanto, devemos clicar com o boto direito sobre a estrutura de arvore apresentada na Solution Explorer e clicar em Add Reference, na tela que abrir (figura 06), clique em Browse e indique o caminho da dll.

Figura 06

Apostila de C# e ASP.Net
Nossa DLL est na Pasta Bin Debug Produto.dll

74 de 168

Passo 4: Agora que j temos o desing pronto e as aplicaes ligadas, partiremos para a Implementao do formulrio de consulta de produtos, segue abaixo o cdigo e comentrios. Ativando o Evento Click do Boto Pesquisar(Dar dois Cliques no Componente) e adicionar as seguintes referncias.

Consulta de Produtos

private void ButtonPesquisar_Click(object sender, EventArgs e) { Produto.ClassProduto Class = new Produto.ClassProduto(); GridConsulta.DataSource = Class.ObterProduto(TextBox_Descricao.Text); }

Figura 07 Ficando assim nossa Consulta.Sendo necessrio ao Evento dos Botes Incluir e Alterar, vamos criar o Formulrio de Cadastro de Produtos. Da Mesma forma em que Implementamos os Outros Forms, iremos criar esse. O Nosso Formulario dever ficar assim:

Figura 08

Apostila de C# e ASP.Net
Agora sim poderemos prosseguir com os Cdigos do Form de Consulta. private void ButtonIncluir_Click(object sender, EventArgs e) { FormCadastro_Produtos frmCadProduto = new FormCadastro_Produtos(); frmCadProduto.set_Opcao("I"); frmCadProduto.ShowDialog(this); } private void ButtonAlterar_Click(object sender, EventArgs e) { DataGridViewRow linha = new DataGridViewRow(); linha = GridConsulta.CurrentRow; FormCadastro_Produtos frmCadProduto = new FormCadastro_Produtos(); frmCadProduto.set_Opcao("A"); frmCadProduto.Preencher(linha.Cells["Id"].Value.ToString(), linha.Cells["Descricao"].Value.ToString(),linha.Cells["Preco"].Value.ToString()); frmCadProduto.ShowDialog(this); } private void ButtonExcluir_Click(object sender, EventArgs e) { /*O Cdigo Referente Excluso de Produtos, fica para exercicio, podemos nos basear nos eventos acima para atingir nosso objetivo. */ } Na sequncia exercitaremos o Cadastro de Produtos.

75 de 168

Apostila de C# e ASP.Net
Cadastro de Produtos
using using using using using using using using System; System.Collections.Generic; System.ComponentModel; System.Data; System.Drawing; System.Linq; System.Text; System.Windows.Forms;

76 de 168

namespace Projeto_Cliente { public partial class FormCadastro_Produtos : Form { private string stOpcao; private int _Old_id; private string _Old_Descricao; private decimal _Old_Preco; // C#, utilizando conceitos de OO, ou seja, atributos sempre privados public FormCadastro_Produtos() { InitializeComponent(); } public void set_Opcao(string prstOpcao) { this.stOpcao = prstOpcao; //this seta o prprio objetos } public void Limpar() { //Instancia um Objeto Controle que da Classe FormCadProduto //foreach roda itens dentro de arrays Control controles = this; foreach (Control ctr in controles.Controls) { if (ctr.GetType().ToString().Equals("System.Windows.Forms.TextBox")) { ((TextBox)ctr).Text = ""; } }

Apostila de C# e ASP.Net
if (MessageBox.Show("Deseja sair da tela ?", "Interao", MessageBoxButtons.YesNo, MessageBoxIcon.Question, MessageBoxDefaultButton.Button1) == DialogResult.Yes) { this.Close(); } }

77 de 168

// Ir rodar em todos os controles do form, caso o controle seja do tipo TextBox, ir atribuir , ou seja, limpar o controle public void Preencher(string Id, string descricao, string preco) { txtCodigo.Text = Id; txtDescricao.Text = descricao; txtPreco.Text = preco; _Old_id = int.Parse(Id); _Old_Descricao = descricao; _Old_Preco =decimal.Parse(preco); } private void btCancelar_Click(object sender, EventArgs e) { Limpar(); } private void btConfirmar_Click(object sender, EventArgs e) { // Instancio a classe de cadastro, observe que no uso o DataSet, mas a outra classe ClasseCadastro Produto.ClassProduto classeProduto = new Produto.ClassProduto(); // Atribuo valores para as propriedades da classe, // e estas por sua vez, atribuiro estes valores para os atributos. classeProduto.Original_Descricao = _Old_Descricao; classeProduto.Original_Preco = _Old_Preco; classeProduto.Id = int.Parse(txtCodigo.Text); classeProduto.Original_Id = _Old_id; classeProduto.Descricao = txtDescricao.Text; classeProduto.Preco = decimal.Parse(txtPreco.Text); if (this.stOpcao.Equals("I")) { classeProduto.Incluir(); this.Limpar(); }else if (this.stOpcao.Equals("A")) {

Apostila de C# e ASP.Net
classeProduto.Alterar(); this.Limpar(); }else{ MessageBox.Show("Implementar a Excluso"); } } } }

78 de 168

Pronto, agora podemos comear os testes e implementar o que achar necessrio para o Bom Funcionamento desta tela.

Apostila de C# e ASP.Net

79 de 168

Camada Model e Business - Adotando Liguagem SQL


Esta camada implementa as classes de negcio do projeto, incluindo o modelo que representa a classe. Ser responsabilidade desta camada conectar a base de dados, fornecer um modelo para classe bem como implementar os mtodos de negcio, principalmente o CRUD. A histria bsica do proposto : Prover mtodos bsicos de CRUD para tabela de Produto bem como a tabela Movimento de forma relacionada. Alguns mtodos de consulta tanto para Produto como Movimento sero igualmente implementados. Toda implementao far uso direto da linguagem SQL para implementar os mtodos de negcio, o que caracteriza um mecanismo clssico, no fazendo uso de Frameworks como n-Hibernate ou Linq. Iniciando o Projeto 1- Com o ambiente do VisualStudio em execuo, selecione Menu File New Project. Conforme demostrado na figura 01, defina o nome do projeto (NameSpace) como NameSpaceSQL.

Figura 01 2- Inicialmente a janela Soluction Explorer dever ficar como exibido na figura 0, aps renomear a Classe denominada Class1 para Produto.

Figura 02

Apostila de C# e ASP.Net

80 de 168

3- Adicione mais duas Classes, a saber, Classe Movimento e ListaMovimento. Isto possvel clicando com o boto direito do mouse sob o n que representa a aplicao (NameSpaceSQL), escolhendo na opo Add New Item, conforme figura 03, o Template Class.

Figura 03 4- Agora providenciaremos a conexo com a base de dados, para tanto, clique com o boto direito do mouse sobre o n Propeties e faa a opo Open. Em seguida, baseando-se na figura 04, clique em Settings para adicionarmos uma propriedade que representar a com exo com o Banco de Dados.

Figura 04

Apostila de C# e ASP.Net

81 de 168

5- Preencha as propriedades Name, Type e Scope conforme exibido na figura 06. Para a propriedade Value, que define a string de conexo, clique nas reticncias na prpria propiedade Value, tomando por base a figura 05 que conecta uma base SQL Server.

Figura 05

Figura 06 6- Observe o cdigo fonte da classe Properties, principalmente o trecho que define a propriedade DBAula que implementa a string de conexo com o Banco de Dados. Sendo necessrio poderamos alterar parmetros desta conexo. namespace NameSpaceSQL.Properties { [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase { //. . . cdigo omitido aqui [global::System.Configuration.DefaultSettingValueAttribute( "Data Source=WS222\\SQLEXPRESS;Initial Catalog=BancoAula;Persist Security Info=True" + ";User ID=sa;Password=123")] public string DBAula { get { return ((string)(this["DBAula"])); } } } }

Apostila de C# e ASP.Net

82 de 168

Comentando Passo a Passo o Cdigo Fonte da Classe Produto Partial (Model)


1- Referncias (using) as classes necessrias ao desenvolvimento do cdigo da Classe Produto. using using using using System; System.Collections.Generic; System.Linq; System.Text;

2- Definio da NamSpace que acomodar as classes Produto (partial class). namespace NameSpaceSQL { 3- Definio da Classe Produto. public partial class Produto { Nota: Repare que na definio da classe foi utilizado da declarao partial, indicando que o cdigo do Modelo de Produto, aqui implementados, fazem parte de um todo. Conforme ser comentado posteriormente, a Classe Produto tambm implementa o cdigo relativo as Regras de Negcio e o CRUD.

4- Definio dos campos privados do Modelo Produto. private private private private private private private long _id; string _descricao; decimal _preco; List<Movimento> _movimento; long _oldid; string _olddescricao; decimal _oldpreco;

5- Mtodo Construtor da Classe Produto, que cria uma List da classe Movimento. public Produto() { this.Movimento = new List<Movimento>(); } Nota: Este mtodo necessrio em funo do projeto em questo, contemplar um relacionamento entre as Classes Produto e Movimento. Na Prtica manipulamos uma coleo de objetos Movimento para cada representao de objeto Produto. Isso ocorrer quando da incluso de um Produto, podermos tambm incluir um ou mais objetos Movimento. Os comentrios relativo a Incluso de Produto, implementado na classe Produto Partial que expressa a Lgica de Negcio da classe daro luz a este tpico.

Apostila de C# e ASP.Net

83 de 168

6- Os mtodos descritos abaixo definem Get(s) e Set(s) para os membros privados da classe, comentados no tpico 4. Nota: Para criar esses mtodos, no necessrio digit-los no corpo da classe, bastando apenas invocar os recursos representados pela figuas abaixo, da seguinte forma: Clique com o boto direito do mouse, sobre o nome do membro privado ID, faa a opo Refactro Encapsulate Field... e a caixa de dialogo representada pela figura o7 ser exibida. Pronto, basta clicar no boto OK e os mtos Set e Get para este membro privado ser criado. Repita os paos para os campos privados restantes.

Figura 06

Figura 07

7- Mtos Set e Get para o campo privado ID, criado a partir do tpico 7. public long Id { get { return _id; } set { _id = value; } }

Apostila de C# e ASP.Net
public string Descricao { get { return _descricao; } set { _descricao = value; } } public decimal Preco { get { return _preco; } set { _preco = value; } } public long OldId { get { return _oldid; } set { _oldid = value; } } public string OldDescricao { get { return _olddescricao; } set { _olddescricao = value; } } public decimal OldPreco { get { return _oldpreco; } set { _oldpreco = value; } } public List<Movimento> Movimento { get { return _movimento; } set { _movimento = value; } }

84 de 168

8- Restante dos mtos Set e Get para os campos privados restantes da Classe Produto (Modelo).

9- Encerra o bloco que define a Classe Produto (partial). } 10- Encerra o bloco que define a Classe Produto (partial) }

Apostila de C# e ASP.Net

85 de 168

Comentando Passo a Passo o Cdigo Fonte da Classe Produto Partial (Regras de Negcio)
1- Referncias (using) as classes necessrias ao desenvolvimento do cdigo da Classe Produto. using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Data; using System.Data.SqlClient; 2- Definio da NamSpace que acomodar as classes Produto (partial class). namespace NameSpaceSQL { 3- Definio da Classe Produto. public partial class Produto { Nota: Repare que na definio da classe foi utilizado da declarao partial, indicando que o cdigo (regras de negcio) aqui implementados, fazem parte de um todo. Conforme apresentado anteriormente, a Classe Produto tambm implenta o cdigo que define o Modelo Produto. 3.1- Atribuio da String de conexo a varivel strconn do tipo String. String strconn = NameSpaceSQL.Properties.Settings.Default.DBAula; 3.2- Criando instncia da Classe de Tratamento de Erro. ClasseErro ClasseErro = new ClasseErro(); Nota: A conexo com o banco de dados na Classe, e foi abordada nos tpicos relativo as figuras 04 e 05. 4- Comentrio detalhado do Mtodo Recursivo RetornaChave. 4.1Define o mtodo como uma funo que retorna um Inteiro Longo e parmetro de entrada String. O objetivo do mtodo obter junto a tabela GerarChave (ver dados e estrutura listados abaixo), um valor que represente o ltimo valor mais um, para o registro cujo o campo NomeCampoChave seja igual ao parmetro passado para o mtodo.

Apostila de C# e ASP.Net
public long RetornaChave(string NomeCampo) {

86 de 168

4.2Respectivamente cria um objeto denominado conn (implementa conexo com base de dados), que recebe como parmetro a varivel strconn, definida em no passo 4. Na sequncia executado pelo mtodo Open. SqlConnection conn = new SqlConnection( strconn); conn.Open(); 4.3Define a string que contem o cdigo SQL para obteno do valor do campo UltimoNumero. String sqlUltimoNumero = " Select UltimoNumero From GerarChave " + " Where NomeCampoChave = " + "'" + NomeCampo + "'";

4.4Define e cria um objeto do tipo SqlCommand tendo como parmetro a instruo SQL sqlUltimoNumero e o objeto de conexo conn implementado e executado no passo 4.2. SqlCommand cmdGerarChave = new SqlCommand(sqlUltimoNumero, conn); 4.5Cria varivel Numrica Inteira que recebe o valor retornado do mtodo ExecuteScalar() do objeto cmdGerarChave. Duas observaes importantes so: O Prprio mtodo ExecuteScalar(), utilizado quando espera-se um nico valor de retorno, a outra observao o uso da Classe Int64 colocada entre parenteses para converter o valor retornado pla instruo SQL. Int64 ValorCampoOld = (Int64)cmdGerarChave.ExecuteScalar(); 4.6Instruo SQL responsvel pela atualizao do campo UltimoNumero acrescido de um. Repare que por questes de trtar a concorrncia de dados, a clusula Where da instruo compara no s o valor para o campo NomeCampoChave, como o valor do campo UltimoNumero, obtido a partir da varivel ValorCampoOld, que contem o valor deste campo lido anteriormente na tabela. Isso garante que somente ser executado o comando Update, caso entre a leitura (Select) e o momento do Update, o registro no tenha sido modificado. String sqlAtualizaNumero = " Update GerarChave Set UltimoNumero = " + " UltimoNumero + 1 " + " Where NomeCampoChave = " + "'" + NomeCampo + "'" + " AND UltimoNumero = " + Convert.ToString(ValorCampoOld); 4.7Define e cria um objeto do tipo SqlCommand tendo como parmetro a instruo SQL sqlAtualizaNumero e o objeto de conexo conn implementado e executado no passo 4.2. SqlCommand cmdAtualizaNumero = new SqlCommand(sqlAtualizaNumero, conn);

Apostila de C# e ASP.Net

87 de 168

4.8Executa o mtodo ExecuteNonQuery() para o objeto cmdAtualizaNumero em uma condio IF que verifica se o retorno numrico zero. Caso seja, em funo do fato de que o instruo Update do comando cmdAtualizaNumero no afetou o registro definido em sua clusula Where. O motivo para tanto foi descrito no tpico 4.7. Sendo verdadeiro a condio IF, o mtodo exutado recursivamente at retornar um valor (sucesso na exucuo do comando Update). if (cmdAtualizaNumero.ExecuteNonQuery() == 0) { RetornaChave(NomeCampo); } 4.9Na sequncia, definido um objeto do tipo Long (Numrico Inteiro Longo), atribuido ao mesmo o valor da vrivel ValorCampoOld mais um, e por fim, o mtodo retorna tal valor. long ValorNovo; ValorNovo = (ValorCampoOld + 1); return ValorNovo; 4.10Encerra o bloco relativo ao mtodo RetornaChave. }

5- Cdigo relativo ao Mtodo de Negcio InserirProdutoMovimento (CRUD) 5.1Define o mtodo sem parmetros com reorno do tipo String, Cria e executa o mtodo Open para um objeto tipo SqlConnection. Na sequncia este objeto ser responsvel por controlar a transao da regra de negcio que o mtodo implementa. Vale ressaltar aqui, que se faz necessrio um controle explcito de transao com a base de dados, j que o mtodo tem como objetivo, incluir um produto na tabela Produto, e um movimento na tabela Movimento. Logo, devemos garantir a condio atmica para a transao, onde ambos os registros so criados ou nenhum registro criado. public string InserirProdutoMovimento() { SqlConnection conn = new SqlConnection(strconn); conn.Open(); 5.2Define um objeto do tipo SqlTransaction, sendo atribuido ao mesmo, o incio de transao para a conexo representada pelo objeto conn. SqlTransaction transacao = conn.BeginTransaction(); 5.3Inicia um bloco try / catch / finnaly. Seu objetivo, a partir de clusula try, minitorar a execuo das instrues do mtodo, observando alguma exceo e desviando para rea de tratamento de excees denominada catch. Ocorrendo ou no exceo, a clusula (todo o bloco) finally executada. try {

Apostila de C# e ASP.Net

88 de 168

5.4Define uma string que recebe como atribuio a instruo Insrte para Produto. Repare nos parmetros posicionados como valores a serem atribuidos aos campos da tabela Produto. String sqlProduto = " Insert Into Produto Values(@Id, @Descricao, @Preco) ";

5.5Define o objeto do tipo SqlCommand para insero de Produto. Repare que o mtodo recebe como parmetro sqlProduto contendo a instruo Insert, conn que representa o objeto de conexo, e por fim, transacao, que representa o objseto de transao em curso. SqlCommand cmdProduto = new SqlCommand(sqlProduto, conn, transacao);

5.6Atribuio dos membros pblicos da Classe Produto, a saber, Id, Descricao e Preco para os parmetros @Id, @Descricao e @Preco pertencentes a instruo Insert contida no objeto cmdProduto. cmdProduto.Parameters.AddWithValue("@Id", this._id); cmdProduto.Parameters.AddWithValue("@Descricao", this._descricao); cmdProduto.Parameters.AddWithValue("@Preco", this._preco);

5.7Executa o mtodo ExecuteNonQuery() para o objeto cmdProduto, instruindo o banco de dados na incluso de um Produto. Este mtodo til para execuo de instrues Insert, Updade e Delete. cmdProduto.ExecuteNonQuery(); 5.8Cria um lao do tipo foreach, que navega pelos registros contidos no membro this.Movimento (objetos Movimento). Para cada objeto Movimento montado uma instruo Insert tendo como valores os campos do objeto Movimento da lista. Observe que o primeiro parmetro de foreach um tipo Movimento e o segundo, aps in, representa a coleo Movimento definida no modelo Produto. foreach (Movimento Movimento in this.Movimento) { String sqlMovimento = " Insert Into Movimento Values(@Id, @ProdutoId, " + " @Tipo_MovimentoId, @Data, @Quantidade, @Valor) "; SqlCommand cmdMovimento = new SqlCommand(sqlMovimento, conn, transacao); cmdMovimento.Parameters.AddWithValue("@Id", Movimento.Id); cmdMovimento.Parameters.AddWithValue("@ProdutoId", Movimento.ProdutoId); cmdMovimento.Parameters.AddWithValue("@Tipo_MovimentoId", Movimento.Tipo_movimentoid); cmdMovimento.Parameters.AddWithValue("@Data", Movimento.Data); cmdMovimento.Parameters.AddWithValue("@Quantidade", Movimento.Quantidade); cmdMovimento.Parameters.AddWithValue("@Valor", Movimento.Valor); cmdMovimento.ExecuteNonQuery(); } 5.9Executa o mtodo Commit() para o objeto transacao, instruindo o banco de dados concluir a incluso do Produto e dos objetos Movimento em definitivo, encerrando a transao. transacao.Commit();

Apostila de C# e ASP.Net

89 de 168

5.10Atribui uma string vazia para retorno do mtodo. Em seguida encerra o bloco try, desviando de catch. return ""; }

5.11Caso ocorra erro entre o incio do bloco try e catch, as intrues deste ltimo bloco so executadas, instruindo o banco de dados a encerrar cancelando a transao (transacao.Rollback();) e retornando pelo mtodo, a mensagem de erro retornada pelo mtodo TrataErro da Classe ClasseErro tendo como parmetro a propriedade Message da instncia de Exception representada pelo objeto Erro. catch (Exception Erro) { transacao.Rollback(); conn.Close(); return ClasseErro.TrataErro(Erro.Message); }

5.12Sempre executado, o bloco finally implementa o fechamento da conexo representada pelo objeto conn. Na prtica, como observado no assunto Garbage Colector, sabemos que na verdade quem controla o destruir de um objeto este mecanismo, ficando a cargo do mtodo simplesmente indicar que o recurso est liberado para este. Isso tambm vale para os mtodos Open e Close das conexes de banco de dados, que so gerenciadas pelo pooled de conexes da middleware Ado.Net. finally { conn.Close(); } }

5.13Os mtos AlterarProduto e ExcluirProduto no sero comentados pois sua lgica j foi analisada e comentada nos mtodos anteriores. public string AlterarProduto() { SqlConnection conn = new SqlConnection(strconn); conn.Open(); SqlTransaction transacao = conn.BeginTransaction(); try { String sqlProduto = " Update Produto Set " + " Descricao = @Descricao, " + " Preco = @Preco Where " + " Id = @Old_ID AND " + " Descricao = @Old_descricao AND " + " Preco = @Old_Preco "; SqlCommand cmdProduto = new SqlCommand(sqlProduto, conn, transacao); cmdProduto.Parameters.AddWithValue("@Descricao", this._descricao); cmdProduto.Parameters.AddWithValue("@Preco", this._preco); cmdProduto.Parameters.AddWithValue("@Old_ID", this._oldid); cmdProduto.Parameters.AddWithValue("@Old_descricao", this._olddescricao); cmdProduto.Parameters.AddWithValue("@Old_Preco", this._oldpreco);

Apostila de C# e ASP.Net

90 de 168

if cmdProduto.ExecuteNonQuery() == 0 { transacao.Rollback(); conn.Close(); return Produto no Alterado. Ou o registro foi alterado ou excludo desde a obteno.; } transacao.Commit(); return ""; } catch(Exception Erro){ transacao.Rollback(); conn.Close(); return ClasseErro.TrataErro(Erro.Message); } finally { conn.Close(); } } public string ExcluirProduto() { SqlConnection conn = new SqlConnection(strconn); conn.Open(); SqlTransaction transacao = conn.BeginTransaction(); try{ String sqlProduto = " Delete Produto Where Id = @ID AND Descricao = @Descricao AND Preco = @Preco "; SqlCommand cmdProduto = new SqlCommand(sqlProduto, conn, transacao); cmdProduto.Parameters.AddWithValue("@Old_ID", this._oldId); cmdProduto.Parameters.AddWithValue("@Old_descricao", this._olddescricao); cmdProduto.Parameters.AddWithValue("@Old_Preco", this._oldpreco); if cmdProduto.ExecuteNonQuery() == 0 { transacao.Rollback(); conn.Close(); return Produto no Excludo. Ou o registro foi alterado ou excludo desde a obteno.; } transacao.Commit(); return ""; } catch(Exception Erro){ transacao.Rollback(); conn.Close(); return ClasseErro.TrataErro(Erro.Message); } finally{ conn.Close(); } }

Apostila de C# e ASP.Net

91 de 168

5.14Mtodo responsvel po retornar um registro da tabela Produto, baseado no valor de sua chave-primria. O mtodo retorna um tipo DataTable, ideal para acomodar registros de uma tabela. Para implementar este mecanismo necessrio criar alm de um objeto SqlCommand, um objeto SqlAdapter e por fim um objeto DataSet. Utilizamos o mtodo Fill deste ltimo para preencher o ojeto Table com os valres retornados pelo command cmdproduto. public DataTable RetornaProduto(long Id) { SqlConnection conn = new SqlConnection(strconn); conn.Open(); String sqlProduto = " Select * From Produto Where Produto.Id = @Id "; SqlCommand cmdProduto = new SqlCommand(sqlProduto, conn); cmdProduto.Parameters.AddWithValue("@Id", Id); SqlDataAdapter da = new SqlDataAdapter(); da.SelectCommand = cmdProduto; DataSet ds = new DataSet(); da.Fill(ds); return ds.Tables[0]; } 5.15Os mtodos RetornaProduto sobrecarregados e o mtodo RetornaMovimento, no sero comentados j que so semelhantes ao mtodo anterior, devidamente comentado e explicado. public DataTable RetornaProduto(string Descricao) { SqlConnection conn = new SqlConnection(strconn); conn.Open(); String sqlMovimento = " Select * From Produto Where Produto.Descricao Like @Descricao "; SqlCommand cmdMovimento = new SqlCommand(sqlMovimento, conn); cmdMovimento.Parameters.AddWithValue("@Descricao", Descricao + "%"); SqlDataAdapter da = new SqlDataAdapter(); da.SelectCommand = cmdMovimento; DataSet ds = new DataSet(); da.Fill(ds); return ds.Tables[0]; } public DataTable RetornaProduto(Decimal Preco) { SqlConnection conn = new SqlConnection(strconn); conn.Open(); String sqlProduto = " Select * From Produto Where Produto.Preco >= @Preco"; SqlCommand cmdProduto = new SqlCommand(sqlProduto, conn); cmdProduto.Parameters.AddWithValue("@Preco", Preco); SqlDataAdapter da = new SqlDataAdapter(); da.SelectCommand = cmdProduto; DataSet ds = new DataSet(); da.Fill(ds); return ds.Tables[0]; }

Apostila de C# e ASP.Net

92 de 168

public DataTable RetornaMovimento(String DecriProduto, DateTime DataIni, DateTime DataFin) { SqlConnection conn = new SqlConnection(strconn); conn.Open(); String sqlMovimento = " Select * From vw_ListaMovimento Where " + " Descricao_Produto Like + @Produto AND Data Between @DataIni AND @DataFin"; SqlCommand cmdMovimento = new SqlCommand(sqlMovimento, conn); cmdMovimento.Parameters.AddWithValue("@Produto", DecriProduto + "%"); cmdMovimento.Parameters.AddWithValue("@DataIni", String.Format("{0:MM/dd/yyyy}", DataIni)); cmdMovimento.Parameters.AddWithValue("@DataFin", String.Format("{0:MM/dd/yyyy}", DataFin)); SqlDataAdapter da = new SqlDataAdapter(); da.SelectCommand = cmdMovimento; DataSet ds = new DataSet(); da.Fill(ds); return ds.Tables[0]; } 5.16Encerra o bloco da Casse. }

5.17Encerra o bloco da NameSpace. }

Apostila de C# e ASP.Net
Cdigo Fonte da Classe Movimento (Model)
using using using using System; System.Collections.Generic; System.Linq; System.Text;

93 de 168

namespace NameSpaceSQL { public class Movimento { private long _id; private long _produtoId; private long _tipo_movimentoid; private DateTime _data; private Decimal _quantidade; private Decimal _valor; public Movimento() { } public long Id { get { return _id; } set { _id = value; } } public long ProdutoId { get { return _produtoId; } set { _produtoId = value; } } public long Tipo_movimentoid { get { return _tipo_movimentoid; } set { _tipo_movimentoid = value; } } public DateTime Data { get { return _data; } set { _data = value; } } public Decimal Quantidade { get { return _quantidade; } set { _quantidade = value; } } public Decimal Valor { get { return _valor; } set { _valor = value; } } } }

Apostila de C# e ASP.Net
Cdigo Fonte da Classe ListaMovimento (Model)
using using using using System; System.Collections.Generic; System.Linq; System.Text;

94 de 168

namespace NameSpaceSQL { public class ListaMovimento { public ListaMovimento() { } public ListaMovimento( long Id, long ProdutoId, long Tipo_movimentoid, DateTime Data, Decimal Quantidade, Decimal Valor, string Descricao_Movimento, string Descricao_Produto) { } private private private private private private private private long _id; long _produtoId; long _tipo_movimentoid; Decimal _quantidade; DateTime _data; Decimal _valor; string _Descricao_Movimento; string _Descricao_Produto;

public long Id { get { return _id; } set { _id = value; } } public long ProdutoId { get { return _produtoId; } set { _produtoId = value; } } public long Tipo_movimentoid { get { return _tipo_movimentoid; } set { _tipo_movimentoid = value; } }

Apostila de C# e ASP.Net
public DateTime Data { get { return _data; } set { _data = value; } } public Decimal Quantidade { get { return _quantidade; } set { _quantidade = value; } } public Decimal Valor { get { return _valor; } set { _valor = value; } } public string Descricao_Movimento { get { return _Descricao_Movimento; } set { _Descricao_Movimento = value; } } public string Descricao_Produto { get { return _Descricao_Produto; } set { _Descricao_Produto = value; } } } }

95 de 168

Apostila de C# e ASP.Net
Cdigo Fonte da Classe ClasseErro
using using using using System; System.Collections.Generic; System.Linq; System.Text;

96 de 168

namespace NameSpaceSQL { class ClasseErro { public string TrataErro(String MsgErro) { if (MsgErro.IndexOf("Violation") != -1) { return "Erro por violao de chave nica."; } else if (MsgErro.IndexOf("Cannot insert duplicate key row in object") != -1) { return "Erro por violao de chave primria."; } else if (MsgErro.IndexOf("conflicted with the REFERENCE constraint") != -1) { return "Existe registro tem relacionamentos, logo no pode ser excluido."; } else { return "Erro Ocorrido: " + MsgErro + " >>> Consulte o suporte <<<."; } } } }

Apostila de C# e ASP.Net
Camada View e Controller

97 de 168

Teremos aqui um projeto Web baseado em Asp.Net que representar a camda View, nela, teremos uma classe que servir como camada Controller, objetivando a ligao entre as pginas Asp.Net (Camada View) e os mtodos de negcio na camada Model. A histria basica do proposto : Implementar interfaces para cadastramento de produtos (Classe Produto), apresnetar uma conulta para pesquisa de produtos, e por fim uma listagem contendo movimentos.

Criando a Camada View


1- Com o ambiente do VisualStudio em execua, no menu File Web Site, faa a opo ASP.Net Web Site conforme figura 01.

Figura 01

2- Inicialmente a janela Soluction Explore dever ficar como o exibido na figura 02.

Figura 02

3- D um duplo clique sobre Default.aspx na rvore da Soluction Explore visualizando a pgina no modo Design. A rea de aderncia agora pode receber controles para compor a pgina. Clique na aba que define o modo Source observando o cdigo resltante.

Apostila de C# e ASP.Net

98 de 168

Figura 03 4- Visando ter um modelo que sirva de base para todas as pginas de nosso projeto, vamos adicionar agora uma Master Page. Clique sob o n raiz do projeto escolhendo Add New Item escolhedo o Template Master Page. A figura 04 nos orienta neste sentido. Observe ainda o cdigo fonte (aba Source) resultante.

Figura 04 <%@ Master Language="C#" AutoEventWireup="true" CodeFile="PaginaPadrao.master.cs" Inherits="PaginaPadrao" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head runat="server"> <title>Untitled Page</title> <asp:ContentPlaceHolder id="head" runat="server"> </asp:ContentPlaceHolder> </head> <body> <form id="form1" runat="server"> <div> <asp:ContentPlaceHolder id="ContentPlaceHolder1" runat="server"> </asp:ContentPlaceHolder> </div> </form> </body> </html>

Apostila de C# e ASP.Net

99 de 168

5- Adicione os diretrios Css, Img e Js contendo respectivamente o arquivo de folha de estilo, as imagens a serem aplicadas ao projeto, e por fim, o arquivo contendo as intrues JavaScript. Conforme demonstrado na figura 05 clique em Refresh Folder para que a janela Soluction Explore possa refletir a nova estrutura de diretrios.

Figura 05

Figura 06

6- Aplique sob a pgina Master Page um controle Image oriundo da janela Tool Box, configurando a propriedade ImageURL conforme figuras 07 e 08.

Figura 07

Apostila de C# e ASP.Net

100 de 168

Figura 08

7- Observe, clicando na aba source da pgina, o cdigo fonte resultante. Especial ateno a tag Image e suas propriedades descita no cdigo fonte da pgina. Atente tambm para o resultado visual da pgina Master Page. <%@ Master Language="C#" AutoEventWireup="true" CodeFile="PaginaPadrao.master.cs" Inherits="PaginaPadrao" %> //. . . Cdigo omitido aqui <asp:ContentPlaceHolder id="head" runat="server"> </asp:ContentPlaceHolder> </head> <body> <form id="form1" runat="server"> <div align="center"> <div style="position: relative; width: 800px; height:100px"> <asp:Image ID="ImageTopo" runat="server" Height="80px" Width="800px" ImageUrl="~/Img/CabecaCursoCSharp.gif" style="z-index: 1; left: 0px; top: 0px; position: relative; border: 1px solid #808080;" /> <asp:ContentPlaceHolder id="ContentPlaceHolder1" runat="server"> </asp:ContentPlaceHolder> </div> </div> </form> </body> </html>

Apostila de C# e ASP.Net

101 de 168

Figura 09

8- Adicione uma nova pgina ao projeto definindo seu nome como Index.apsx. Para tanto, clicando no boto direito do mouse sob o n raiz do projeto escolhendo Add New Item. Repare neste caso, o checkbox Select master page assinulado, gerando a caixa de dialogo representada pela figura 11. Nesta, selecione uma Master Page para servir de Template para a pgina Index.

Figura 10

Figura 11

Apostila de C# e ASP.Net

102 de 168

9- Adicione um controle Menu oriundo da caixa de dialogo ToolBox Navigation. Utilize o Munu Tasks localizado na parte superior esquerda na forma de uma seta, selecionando a opo Edit Menu Items..., representada pela figura 12. Adicione menus e itens de menu conforme ilustrado na sequncia representada pelas figuras 12, 13, 14, 15, 16 e 17.

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

10- Agora acresscente a tag Div antes da tag Menu, conforme listagem parcial do cdigo fonte da pgina Index provendo a configurao que colocar o objeto Menu centralizado na pgina.

<div align="center" style="border: 1px solid #808080; width: 800px; height:500px">


<asp:Menu ID="MenuSistema" runat="server" BackColor="#B5C7DE" DynamicHorizontalOffset="2" Font-Names="Verdana" Font-Size="0.8em" ForeColor="#284E98" Orientation="Horizontal" StaticSubMenuIndent="10px" style="margin-left: 0px" Width="800px"> <StaticSelectedStyle BackColor="#507CD1" /> <StaticMenuItemStyle HorizontalPadding="5px" VerticalPadding="2px" /> <DynamicHoverStyle BackColor="#284E98" ForeColor="White" /> <DynamicMenuStyle BackColor="#B5C7DE" /> <DynamicSelectedStyle BackColor="#507CD1" /> <DynamicMenuItemStyle HorizontalPadding="5px" VerticalPadding="2px" /> <StaticHoverStyle BackColor="#284E98" ForeColor="White" /> <Items> <asp:MenuItem Text="Cadastro" Value="Cadastro"> <asp:MenuItem Text="Produtos" Value="Produtos"></asp:MenuItem> <asp:MenuItem Text="Pedidos" Value="Pedidos"></asp:MenuItem> <asp:MenuItem Text="Clientes" Value="Clientes"></asp:MenuItem> </asp:MenuItem> <asp:MenuItem Text="Relatrios" Value="Relatrios"> <asp:MenuItem Text="Lista de Produtos" Value="Lista de Produtos"> </asp:MenuItem> <asp:MenuItem Text="Movimentos" Value="Movimentos"> </asp:MenuItem> </asp:MenuItem> <asp:MenuItem Text="Utilitrios" Value="Utilitrios"> <asp:MenuItem Text="Envio de Email" Value="Envio de Email"> </asp:MenuItem> </asp:MenuItem> </Items> </asp:Menu>

11- Execute o projeto neste momento, acionando o menu Debug Start Debugging, observando seu funcionamento conforme imagem da figura 18.

Figura 18

Apostila de C# e ASP.Net

105 de 168

12- Conforme j orientado em passos anteriores, adicione mais uma pgina aspx, tendo como Template a pgina Master Page denominada PaginaPadrao. Se orientando pelo design representado pela figura 19 e pela listagem abaixo aplique e configure propriedades para os controles definidos na listagem do cdigo fonte da pgina CadastroProduto.aspx.

Figura 19 <%@ Page Language="C#" MasterPageFile="~/PaginaPadrao.master" AutoEventWireup="true" CodeFile="CadastroProduto.aspx.cs" Inherits="CadastroProduto" Title="Untitled Page" %> <asp:Content ID="Content1" ContentPlaceHolderID="head" Runat="Server"> </asp:Content> <asp:Content ID="Content2" ContentPlaceHolderID="ContentPlaceHolder1" Runat="Server"> <div align="center" style="border: 1px solid #808080; width: 800px; height:470px"> <asp:Label ID="LabelTituloPagina" runat="server" Text="CADASTRO DE PRODUTOS" style="z-index: 1; left: 0px; top: 80px; position: absolute; width: 800px; text-align: center" </asp:Label> <asp:Label ID="LabelDescricao" runat="server" Text="Descrio do Produto" style="z-index: 1; left: 50px; top: 180px; position: absolute; width: 200px; text-align: left" </asp:Label> <asp:TextBox ID="TextBoxDescricao" runat="server" style="z-index: 1; left: 50px; top: 200px; position: absolute; width: 350px;" </asp:TextBox> <asp:Label ID="LabelPreco" runat="server" Text="Preo do Produto" style="z-index: 1; left: 50px; top: 260px; position: absolute; width: 200px; text-align: left" </asp:Label> <asp:TextBox ID="TextBoxPreco" runat="server" style="z-index: 1; left: 50px; top: 280px; position: absolute; width: 150px;" </asp:TextBox> <asp:Button ID="ButtonCancelar" runat="server" style="z-index: 1; left: 50px; top: 370px; position: absolute; width: 100; height: 25px" Text="Cancelar" /> <asp:Button ID="ButtonConfirmar" runat="server" style="z-index: 1; left: 150px; top: 370px; position: absolute; width: 100; height: 25px" Text="Confirmar" /> <asp:Label ID="LabelErro" runat="server" style="z-index: 1; left: 0px; top: 530px; position: absolute; width: 800px; text-align: center" > </asp:Label> </div> </asp:Content>

Apostila de C# e ASP.Net

106 de 168

Nota: Vale ressaltar a tag Div, novamente aqui sendo configurada para centralizar os controles nela acomodada. Note tambm a propriedade position: absolute definida como propriedade de style para todos os componentes internos a Tag Div. Isso proporciona que todos os controles obedecero suas posies definidas pelas propriedades top e left, mas com relao a margem esquerda da Tag Divi e no do browser que hora ir exibi-los. 13- Crie agora respectivamente as pginas ConsultaProduto.aspx e ConsultaMovimento.aspx. Tomo por base as imagens das figuras 20 e 21. Os detalhes sobre a configurao dos controles destas pginas podem ser observados nas listagens de cdigo fonte que seguem as imagens. As notas referentes a pgina aspx anterior valem para essas.

Figura 20 <div align="center" style="border: 1px solid #808080; width: 800px; height:450px"> <asp:Label ID="LabelTituloPagina" runat="server" Text="CONSULTA DE MOVIMENTOS" style="z-index: 1; left: 0px; top: 80px; position: absolute; width: 800px; text-align: center" > </asp:Label> <asp:Label ID="LabelDescricaoProduto" runat="server" Text="Descrio" style="z-index: 1; left: 20px; top: 150px; position: absolute; width: 70px;" > </asp:Label> <asp:Label ID="LabelPeriodo" runat="server" Text="Perodo" style="z-index: 1; left: 300px; top: 150px; position: absolute" > </asp:Label> <asp:Label ID="LabelEntreData" runat="server" Text="" style="z-index: 1; left: 410px; top: 170px; position: absolute; width: 11px;" > </asp:Label> <asp:TextBox ID="TextBoxDescricaoProduto" runat="server" style="z-index: 1; left: 20px; top: 170px; position: absolute; width: 250px;" > </asp:TextBox> <asp:TextBox ID="TextBoxDataIni" runat="server" style="z-index: 1; left: 300px; top: 170px; position: absolute; width: 100px;" > </asp:TextBox>

Apostila de C# e ASP.Net
<asp:TextBox ID="TextBoxDataFin" runat="server" style="z-index: 1; left: 430px; top: 170px; position: absolute; width: 100px;"> </asp:TextBox>

107 de 168

<asp:Button ID="ButtonPesquisar" runat="server" style="z-index: 1; left: 560px; top: 165px; position: absolute; width: 75px; height: 25px" Text="Pesquisar" CssClass="Botao" /> <asp:Button ID="ButtonVoltar" runat="server" style="z-index: 1; left: 640px; top: 165px; position: absolute; width: 75px; height: 25px" Text="Votar" /> <asp:Button ID="ButtonImprimir" runat="server" style="z-index: 1; left: 720px; top: 165px; position: absolute; width: 75px; height: 25px" Text="Imprimir" /> <asp:GridView ID="GridViewListaMovimento" runat="server" style="z-index: 1; left: 0px; top: 220px; position: absolute; height: 90px; width: 800px" > <Columns> <asp:BoundField DataField="Id" HeaderText="Id" SortExpression="Id" /> <asp:BoundField DataField="ProdutoId" HeaderText="ProdutoId" SortExpression="ProdutoId" /> <asp:BoundField DataField="Tipo_movimentoid" HeaderText="Tipo_movimentoid" SortExpression="Tipo_movimentoid" /> <asp:BoundField DataField="Data" HeaderText="Data" SortExpression="Data" /> <asp:BoundField DataField="Quantidade" HeaderText="Quantidade" SortExpression="Quantidade" /> <asp:BoundField DataField="Valor" HeaderText="Valor" SortExpression="Valor" /> <asp:BoundField DataField="Descricao_Movimento" HeaderText="Descricao_Movimento" SortExpression="Descricao_Movimento" /> <asp:BoundField DataField="Descricao_Produto" HeaderText="Descricao_Produto" SortExpression="Descricao_Produto" /> </Columns> </asp:GridView> </div> </asp:Content>

Apostila de C# e ASP.Net

108 de 168

Figura 21 <div align="center" style="border: 1px solid #808080; width: 800px; height:450px"> <asp:Label ID="LabelTituloPagina" runat="server" Text="CONSULTA DE MOVIMENTOS" style="z-index: 1; left: 0px; top: 100px; position: absolute; width: 800px; text-align: center"> </asp:Label> <asp:Label ID="LabelDescricaoProduto" runat="server" Text="Descrio" style="z-index: 1; left: 40px; top: 150px; position: absolute"> </asp:Label> <asp:Label ID="LabelPeriodo" runat="server" Text="Perodo" style="z-index: 1; left: 320px; top: 150px; position: absolute"> </asp:Label> <asp:Label ID="LabelEntreData" runat="server" Text="" style="z-index: 1; left: 430px; top: 170px; position: absolute"> </asp:Label> <asp:TextBox ID="TextBoxDescricaoProduto" runat="server" style="z-index: 1; left: 40px; top: 170px; position: absolute; width: 250px;"> </asp:TextBox> <asp:TextBox ID="TextBoxDataIni" runat="server" style="z-index: 1; left: 320px; top: 170px; position: absolute; width: 100px;"> </asp:TextBox> <asp:TextBox ID="TextBoxDataFin" runat="server" style="z-index: 1; left: 450px; top: 170px; position: absolute; width: 100px;"> </asp:TextBox> <asp:Button ID="ButtonPesquisar" runat="server" style="z-index: 1; left: 580px; top: 165px; position: absolute; width: 80px;" Text="Pesquisar" /> <asp:Button ID="ButtonVoltar" runat="server" style="z-index: 1; left: 680px; top: 165px; position: absolute; width: 80px;" Text="Votar" /> <asp:GridView ID="GridView1" runat="server" style="z-index: 1; left: 1px; top: 240px; position: absolute; height: 90px; width: 798px"> </asp:GridView> </div>

Apostila de C# e ASP.Net

109 de 168

14- Neste ponto iremos retornar a pgina Index, selecionando o Menu Task do controle Menu selecionando a opo Edit Menu Items..., conforme imagem da figura 22.

Figura 22 15- Conforme observado na figura 23, selecione o item de menu Produtos definindo sua propriedade NavigateUrl para chamar a pgina ConsultaProduto.aspx.

Figura 23 16- Objetivando definir a prieira pgina a ser exibida quando da execuo do projeto, com o boto direito do mouse sobre o diretrio raiz do projeto, selecione no menu de contexto a opo Start Options..., e em seguida proceda conforme observado nas figuras 24, 25 e 26.

Figura 24

Apostila de C# e ASP.Net

110 de 168

Figura 25

Figura 26 17- Teste a execuo da pgina ConsultaProduto.aspx, a partir da execuo do menu da pgina Index. Veja a figura 27 que ilustra este tpico.

Figura 27 18- O fraguimento de cdigo abaixo o contedo do arquivo de Folha de Estilo denominado Estilo.css que servir para configurar os aspectos visuais dos controles de nossa pgina. Numa etapa a seguir aplicaremos esses estilos aos controles do projeto.
.Botao { font-family: verdana,helvetica; font-size: 11px; font-weight: bold; color:#004080; background-color: #DAD7CF; }

Apostila de C# e ASP.Net
.CaixaTexto { font-family: verdana,helvetica; font-size: 11px; font-weight: normal; color: #000000; border: 1px solid #000000; } .LabelTexto { font-family: verdana,helvetica; font-size: 11px; font-weight: bold; color: #004080; } .LabelTitulo { font-family: verdana,helvetica; font-size: 15px; font-weight: bold; color: #004080; background-color: #DAD7CF; } .ComboBox { font-family: verdana,helvetica; font-size: 11px; color: #000000; background-color: #ffffff; border: 1px solid #000000; } .TextoCelulaGrid { font-family: verdana,helvetica; font-size: 11px; color: #000000; } .TextoTituloGrid { font-family: verdana,helvetica; font-size: 11px; font-weight: bold; color: #ffffff; background-color: #004080; }

111 de 168

19- Acrescente a Tag Link ao cdigo fonte da Master Page, para que os controles das pginas derivadas possam ser configurados com as Classes da folha de estilo. Esta tag deve ser aplicata dentro da tag head. <link href="\css\estilo.css" type="text/css" rel="stylesheet" />

20- Aplique estilo aos controles Label, TextBox e Button da pgina CadastroProduto, em modo Design, procedendo da seguinte forma: 20.1 Selecione o label com a propriedade text definida como Descrio do Produto, e em sua propriedade (precione F4 caso a caixa de dialogo Properties no esteja sendo exibida) CssClass escolhendo a Classe LabelText conforme ilustrado nas figuras 28 e 29..

Apostila de C# e ASP.Net

112 de 168

Figura 28

Figura 29

20.2 Aplique o mesmo para os controles TextBox e Button, escolhendo respectivamente as Classes CaixaTexto e Botao. Por fim veja o resultado refletido na pgina CadastroProduto.aspx conforme figura 30.

Figura 30

20.3 Proceda assim para todos os formulrio do projeto, e aproveite para alterar algumas Classes da Folha de Estilo para ver o efeito.

Apostila de C# e ASP.Net

113 de 168

21- Como ajuste final, visando corrigir incompatibilidade em algumas funcionalidades em alguns browsers, aplique os trechos de cdigo abaixo conforme orientao. 21.1 A tag abaixo deve ser aplicada dentro da Tag Head da Master Page. <style type="text/css"> .adjustedZIndex{z-index: 1; } </style> 21.2 Deve ser aplicado como propriedade de Style do objeto Menu na pgina Master Page. DynamicMenuStyle BackColor="#B5C7DE" CssClass="adjustedZIndex"/> 21.3 Aplicado ao evento Page_PreInit da Master Page. protected void Page_PreInit(object sender, EventArgs e) { if (Page.Request.ServerVariables["http_user_agent"].ToLower().Contains("safari")) { Page.ClientTarget = "uplevel"; } } 22- Adicione o fraguimento de cdigo descrito abaixo dentro da Tag Head da Master Page, para podermos utilizar funes de JavaScript em nossas pginas. Veja no Anexo 1 desta apostila uma abordagem mais prounda sobre JavaScript e sua aplicao em pginas aspx. <script language="javascript" type="text/javascript" src="JS/FuncoesJavaScript.js"> </script> 22- Aplicando funes JavaScript a controles do projeto 22.1- Primeiro iremos criar um arquivo contendo funes JavaScript (ver listagem abaixo), na sequncia referenci-lo em nossas pginas ou na pagina Mestre do projeto. Desta forma, poderemos fazer uso das referidas funes em eventos JavaScript dos controles Asp.Net contidos em nossas pginas. Crie um arquivo com formato texto padro, nomeando-o como FuncoesJavaScript.JS, salvando-o no diretrio JS do projeto web. O cdigo do contedo do arquivo em questo exibido na listagem 01. function FormataData(input) { if (input.value.length==10) { event.keyCode=0; } var tecla = event.keyCode; if (tecla > 47 && tecla < 58){ input.value=input.value; } else { event.keyCode=0; }

Apostila de C# e ASP.Net
if ((input.value.length==2)||(input.value.length==5)) { input.value=input.value + "/" ; } } function SomenteNumeros(input) { var tecla = event.keyCode; if (tecla > 47 && tecla < 58){ input.value=input.value; } else { event.keyCode=0; } } function Formatar(src, mask) { var i = src.value.length; var saida = mask.substring(0,1); var texto = mask.substring(i) if (texto.substring(0,1) != saida) { src.value += texto.substring(0,1); } } function FormatarCnpj(src, mask) { if (src.value.length==18) { event.keyCode=0; } var tecla = event.keyCode; if (tecla > 47 && tecla < 58){ src.value=src.value; } else { event.keyCode=0; } var i = src.value.length; var saida = mask.substring(0,1); var texto = mask.substring(i) if (texto.substring(0,1) != saida) { src.value += texto.substring(0,1); } }

114 de 168

Apostila de C# e ASP.Net

115 de 168

22.2- Outra maneira de injetar referncia a mtodos de JavaScript a controles de Asp.Net, utilizando a propriedade Attributes de um controle, usando o mtodo Add do mesmo para acrescentar chamada a uma funo JavaScript. No exemplo abaixo, ser acrescentado ao controle no lado Client-Side o uso da funo FormataData quando ocorrer o evento onKeypress de java excript para os controles TextBoxDataIni e TextBoxDataFin. O evento da pgina ideal para codificar o proposto no pargrafo anterior Page_Load, pois assim, ao carregar da pgina o fraguimento de cdigo renderizado no lado Client-Side (Browser). protected void Page_Load(object sender, EventArgs e) { TextBoxDataIni.Attributes.Add("onkeypress", "return FormataData(this);"); TextBoxDataFin.Attributes.Add("onkeypress", "return FormataData(this);"); } 22.3- No formulrio (ou pgina se preferir) Index.Aspx, acione o Menu Task do controle Menu conforme Figura 31 clicando em Edit Menu Items. Emseguida selecione o item Movimentos atribuindo a propriedade NavigateUrl o formulrio ConsultaMovimento.Aspx. As Figuras 32 e 33 ilustram estes passos.

Figura 31

Figura 32

Apostila de C# e ASP.Net

116 de 168

Figura 33

22.4- Execute o site, testando a funo JavaScript conforme ilustrado na Figura 34 representando o formulrio ConsultaMovimento.Aspx em execuo.

Figura 34

22.5- Por fim, estude tambm o contedo do Anexo 2 desta apostila, que trata de uma outra forma de formatar controles de Aspx com a adoo de Expresses Regulares.

Apostila de C# e ASP.Net
Criando a Camada Controller
Comentando os passos:

117 de 168

1- Necessitamos nesnte momento adicionar uma classe ao projeto Web, para que implemente o cdigo necessrio ao acesso aos mtodos da camada de negcio (Model). Clique com o voto direito do mouse sobre o n que representa o projeto em Soluction Explore, selecione Add New Item..., tendo como resposta o exposto na figura 01. Selecione o Template Class, defina o nome como ProdutoController e clique no boto Add para finalizar

Figura 01

2- Na sequncia responda Sim para a caixa de dialogo representada pela figura 02, autorizando acomodar a classe recem criada no diretrio App_code do projeto Web.

Figura 02

3- Por fim, repare a figura 03 exibindo a classe no diretrio App_Code.

Figura 03

Apostila de C# e ASP.Net

118 de 168

4- Adicionemos agora referncia para para os assemblyes que representam a Camada de Negcio (Model), objetivando assim, permitir a Classe ProdutoController ter acesso aos mtodos de negcio. 4.1- Clicando com o boto direito do mouse sob o n do projeto (conforme figura 04), escolha Add Reference no menu de contexto..

Figura 04 4.2- Aps aguardar uns instantes, a imagem da figura 05 ser exibida, permitindo que pela caixa de dilogo Add Reference possamos escolher a biblioteca (aplicativo) NameSpaceSQL.dll, completando assim o processo de referncia a camada de negcio.

Figura 05 5- Declaraes (referncias as NameSpaces necessrias ao cfigo fonte do projeto.)

using using using using using using using using

System; System.Data; System.Configuration; System.Linq; System.Web; System.Web.Security; System.Web.UI; System.Web.UI.HtmlControls;

Apostila de C# e ASP.Net
using using using using using using System.Web.UI.WebControls; System.Web.UI.WebControls.WebParts; System.Xml.Linq; System.Data; System.Collections.Generic; System.Collections.ObjectModel;

119 de 168

5- Definio do nome da classe, do escopo (Publica ou Privada) da classe e do bloco inicial.

public class ProdutoController_SQL {


6- Instncias para as classes Produto, Movimento e ListaMovimento contidas na NameSpaceSQL prviamente referenciada.

NameSpaceSQL.Produto Produto = new NameSpaceSQL.Produto(); NameSpaceSQL.Movimento Movimento = new NameSpaceSQL.Movimento(); NameSpaceSQL.ListaMovimento ListaMovimento = new NameSpaceSQL.ListaMovimento();
7- Definio dos campos pblicos que aramazenaro os valores relativo aos campos do modelo Produto. Sero teis para armazenar os valores referentes a um Produto quando obtido, e nas operaes de Update, a srio Old dos mesmos, podero reter os valores obtidos, distinguindo-os dos valores alterados pelo processo.

public public public public public public

long Id; string Descricao; decimal Preco; long OldId; string OldDescricao; decimal OldPreco;

8- Mtodo que retorna um DataTable (collection) contendo um registro da tabela Produo baseado na chave primria passada como parmetro. Tambm preenche os campos pblicos que representam o registro produto.

public DataTable GetProduto(long Id) { DataTable dt = new DataTable(); dt = Produto.RetornaProduto(Id); this.Id = (long)dt.Rows[0].ItemArray[0]; this.Descricao = (string)dt.Rows[0].ItemArray[1]; this.Preco = (decimal)dt.Rows[0].ItemArray[2]; return dt; }

9- Mtodo que recebe como parmetro um tipo DataTable (em geral um registro de Produto), armazenando os valores em variveis que representaro no processo de Update os valores antigos, aquele teis para clusula Where da instruo Update subjacente.

public void SetOldProduto(DataTable OldDT) { this.OldId = (long)OldDT.Rows[0].ItemArray[0]; this.OldDescricao = (string)OldDT.Rows[0].ItemArray[1]; this.OldPreco = (decimal)OldDT.Rows[0].ItemArray[2]; }

Apostila de C# e ASP.Net
public DataTable ObterProduto(string Descricao) { return Produto.RetornaProduto(Descricao); }
11- O mesmo que o item anterior, mas para o mtodo RetornaMovimento.

120 de 168

10- Mtodo que encapsula o mtodo RetornaProduto da Classe Produto, sobrecarregado pelo parmetro string, que retorna um DataTable contendo uma lista de registros da tabela Produto

public DataTable ObterListaMovimento(string Descricao, DateTime DataIni, DateTime Datafin) { return Produto.RetornaMovimento(Descricao, DataIni, Datafin); }
12- Mtodo que encapsula o mtodo de insero de Produto e Movimento, implementado na Classe Produto, retornando string. 12.1 Define: O Nome do mtodo, seus parmetros de entrada e o bloco inicial do mtodo.

public string InserirProdutoMovimento(string Descricao, decimal Preco) {


12.2 Preenche o campo Id da instncia de Produto com o valor retornado pelo mtodo gerador de chave nica da Classe Produto.

Produto.Id = Produto.RetornaChave("ID_PRODUTO");
12.3 Preenche os campos Descricao e Preco, da instncia de Produto com os valores obtidos pelos parmetros do mtodo InserirProdutoMovimento.

Produto.Descricao = Descricao; Produto.Preco = Preco;


12.4 Identico ao item 13.2, mas para o campo Id da instncia de Movimento.

Movimento.Id = Produto.RetornaChave("ID_MOVIMENTO");
12.5 Preenche o restante dos campos da instncia de Movimento. So valores arbitrados para concluso do exemplo.

Movimento.ProdutoId = Produto.Id; Movimento.Tipo_movimentoid = 1; Movimento.Quantidade = 0; Movimento.Valor = 0; Movimento.Data = DateTime.Now.Date; Produto.Movimento.Add(Movimento);


13.6 Finalizado a lgica do mtodo, invoca a execuo do mtodo de negcio InserirProdutoMovimento, que retorna uma string contendo a mensagem de erro caso ocorram. Por fim encerra o bloco de cdigo do mtodo.

return Produto.InserirProdutoMovimento(); }

Apostila de C# e ASP.Net

121 de 168

15- Mtodo que encapsula a chamda ao mtodo AlterarProduto da Classe Produto. Repare os parmetros OldId, OldDescricao e OldPreco, que servem para serem referenciados na clusula Where da instruo Update. Assim, temos garantia de execuo da instruo Update na condio de Concorrncia Otimista. Este mtodo tambm retorna uma string com a mensagem de eero, retornado pelo mtodo subjacente caso exista. public string AlterarProduto( string Descricao, decimal Preco, long OldId, string OldDescricao, decimal OldPreco ) { Produto.Descricao = Descricao; Produto.Preco = Preco; Produto.OldId = OldId; Produto.OldDescricao = OldDescricao; Produto.OldPreco = OldPreco; return Produto.AlterarProduto(); } 16- O mesmo que o item anterior sendo que para a excluso de Produto. public string ExcluirProduto( long OldId, string OldDescricao, decimal OldPreco ) { bool Sucesso = false; Produto.OldId = OldId; Produto.OldDescricao = OldDescricao; Produto.OldPreco = OldPreco; return Produto.ExcluirProduto(); }

17- Encerra o bloco de cdigo da Classe ProdutoController. }

Apostila de C# e ASP.Net
Vinculando a Camada View com a Camada Controller
Configurando o Controle GridView da Pgina ConsultaProduto

122 de 168

Responsvel por exibir o resultado de consultas, neste caso, a consulta de Produtos retornada pelo mtodo ObterProduto, que retorna para a propriedade DataSource do GridView um conjunto de dados na forma de um DataTable, veremos na sequncia os passos para ainda em tempo de projeto configurar as colunas que sro exibidas. 1- Selecione o GridView (figura 01) clicando na seta (Menu Task) localizada na canto superior esquerdo do controle. Selecione no combo da opo Choose Data Source (figura 02), New Data Source para vincularmos o GridView a um mtodo que possa retornar a estrutura de uma consulta. Um Datasource um objeto que, uma vez vinculado a um mtodo, pode ser usado para acesso a estrutura de retorno do mtodo, como em tempo de execuo acessar o prprio mtodo.

Figura 01

Figura 02 2- Cumprido o passo anterior, a caixa de dialogo Data Source Configuration Wizard, representada pela imagem da figura 03 ser exibida, para a qual faremos opo para o objeto Object.

Figura 03

Apostila de C# e ASP.Net

123 de 168

3- Cicando em OK na opo anterior somos conduzidos para caixa de dialogo Configure Data Source ObjectDataSource1. Na opo Choose your business object, selecione a classe ProdutoController_SQL clicando no boto Next para prosseguir na configurao do objeto.

Figura 04

4- Nesta etapa, na aba SELECT, escolha no combo Choose a method o mtodo ModeloProduto conforme ilustrado pela figura 05. Clique no boto Next, proseguindo na configurao.

Figura 05 5- Passado a passo anterior, ser exibido a imagem da figura 06 janela GridView Tasks (Menu Task do controle) tendo agora na propriedade Choose Data Source uma referncia a ObjectDataSource1, que o DataSource que definir, em tempo de projeto, as colunas do GridView. Confira a Figura 07 para visualizar o resultado no GridView. Repare que a estrutura de colunas do GridView (figura 07) passou refletir naturalmente a estrutura de campos da Classe Produto. Devemos agora ajustar para nossa realidade, excluindo colunas desnecessrias.

Apostila de C# e ASP.Net

124 de 168

Figura 06

Figura 07

6- Se orientando pela figura 06, clique em Edit Columns... para poder manipular e configurar as colunas do GridView. Conforme exibido na figura 08, selecione os campos OldId, OldDescricao e OldPreco, individualmente, clicando no boto de excluso. Estes campos esto localizados na lista Selected Fields.

Figura 08

Apostila de C# e ASP.Net

125 de 168

7- Ainda na caixa de dialogo Fields, selecione em Selectd Fields a coluna Id manipulando suas propriedades conforme sequncia. 7.1 Propriedade HeaderText igual a Id. Esta propriedade define o ttulo da coluna no grid.

Figura 09 7.2 Propriedade DataField igual a Id. O valor atribuido a esta propriedade deve ser igual ao nome de um campo retornado pelo DataTable (collection) para que ocorra a sincronia, logo, representar uma coluna da coleo resultante do mtodo subjacente. Repare a figura 11, exibida quando houve a seleo, que representa a estrutura resultante do mtodo retornado pelo ObjectDataSource ao qual o GridView est selecionado. Na prtica no necessitamos de um ObjectDataSource vinculado a um mtodo em tempo de projeto. Bastaria irmos adicionando colunas ao GirdView, e em seguida, configurar a propriedade DataField com nomes de colunas que antecipadamente sabemos que retornar do mtodo que ser matribuido a propriedade DataSource do GridView.

Figura 10

Apostila de C# e ASP.Net

126 de 168

Figura 11 7.3 Por fim, poderamos manipular as propriedades HeaderStyle e ItemStyle, definindo a aparncia final dos ttulos das colunas bem como das colunas, ou melhor, das clulas das colunas. No faremos isso, optaremos aqui por utilizar a propriedade CssClass tanto de HeaderStyle quanto ItemStyle

Figura 12 7.4 Conforme sugerido no item 7.3, aplique a propriedade CssClass de HeaderStyle de todas as colunas, o nome da Classe TextoTituloGrid que consta em nosso arquivo de Folha de Estilo (Estilo.Css). Isto funcionar devido ao fato de nossa Pgina Padro, que a base da pgina atual, j referenciar o arquivo de Folha de Estili citado. Proceda o mesmo para a propriedade ItemStyle das colunas, atribuindo a propriedade CssClass, a Classe TextoCelulaGrid da mesma Folha de Estilo. A imagem da figura 13 reflete o efeito das classes de Folha de Estilo aplicado ao GridView.

Figura 13 7.5 Como ajustes final, iremos adicionar uma coluna especial, visando criar um Link para que o usurio possa selecionar uma linha no GridView, e por consequncia obtermos associado a um evento do mesmo GridView o valor da chave do registro selecionado. Neste caso o valor da clula da priemira coluna para a linha selecionada. Se oriente ento pela figura 14, vendo o resultado na imagem da figura 15. 7.5.1 Conforme figura 14, obtida a partir do clique na opo Edit Columns... do menu GridView Tasks, na lista Avaleables fields, selecione Select no n CommandField clicando no boto Add.

Apostila de C# e ASP.Net

127 de 168

Em seguida configure a propriedade HeadText da coluna recem criada para vazio, a propriedade ButtonType para Link e a propriedade SelectText como Selecionar. Manipule tambem a propriedade ItemStyle Width com o valor de 20% (determina a largura da coluna em termos percentuais com relao a largura do GridView). Se desejar, aplique classes da Folha de Estilo a gosto. Talvez queira esperimentar criar uma classe de Folha de Estililo especfica para este tipo de controle (coluna).

Figura 14

Figura 15 7.5.2 Finalizando, na propriedade DataSourceID, remova a referncia ao ObjectDataSource1, que a partir deste momento no mais tem importncia, j que como informado, s tem utilidade para configurarmos o GridView em tempo de projeto. Responda No para caixa de dialogo da figura 16 para no perder a configurao de colunas at aqui alcanada. Remova tambm a Tag ObjectDataSource no cdigo fonte da pgina (listado a aprtir da imagem da figura 16). Para tanto, saia do modo Design e clique na aba Source da pgina ConsultaProduto

Figura 16 <asp:ObjectDataSource ID="ObjectDataSource1" runat="server" SelectMethod="ModeloProduto" TypeName="ProdutoController_SQL"> </asp:ObjectDataSource>

Apostila de C# e ASP.Net
Comentando o cdigo da Pgina ConsultaProduto

128 de 168

1- Cria uma instncia da Classe ProdutoController (Prod) ao ser criado uma instncia da Classe ConsultaProduto. A partir de Prod temos acesso aos mtodos da Camada Controller. public partial class ConsultaProduto : System.Web.UI.Page { ProdutoController_SQL Prod = new ProdutoController_SQL();

2- Procedimento para o evento Click do objeto ButtonPesquisar. Primeiro preenchido a propriedade DataSource do GridView com dados retornados do mtodo ObterProduto da classe ProdutoController. Repare o valor da propriedade Text do controle TextBoxDescricaoProduto passado com o parmetro. Por fim, aplicado o mtodo DataBind (funciona como um Refresh) para o controle GridView, para que os dados retornado pelo mtodo ObterProduto possam ser exibidos. protected void ButtonPesquisar_Click(object sender, EventArgs e) { GridViewProdutos.DataSource = Prod.ObterProduto(TextBoxDescricaoProduto.Text); GridViewProdutos.DataBind(); } 3- O cdigo acionado para o evento Click do objeto ButtonIncluir implementa: protected void ButtonIncluir_Click(object sender, EventArgs e) { 3.1 - Atribui para varivel PaginaRetorno, do tipo Session, o nome da pgina aspx ConsultaProduto. Esta varivel pode ser acessada por outra pgina dentro da seo, possibilitando a lgica desta pgina utiliza-la como parmetro para um possvel mtodo de retorno (navegabilidade) de pgina. Session["PaginaRetorno"] = "ConsultaProduto.aspx";

3.2 Define o valor da varivel Operao, do tipo Session. Esta varivel servir de Flag para o processo de manuteno de Produto, na pgina aspx CadastroProduto. Session["Operacao"] = "Incluir";

3.3 Usando o objeto Response, redireciona (mtodo Redirect) o fluxo para a pgina aspx CadastroProduto. Response.Redirect("CadastroProduto.aspx"); 3.4 Encerra o bloco de cdigo do procedimento ButtonIncluir_Click. }

Apostila de C# e ASP.Net
4- Cdigo para o evento Click do objeto ButtonAlterar. Identico ao item 3. protected void ButtonAlterar_Click(object sender, EventArgs e) { Session["PaginaRetorno"] = "ConsultaProduto.aspx"; Session["Operacao"] = "Alterar"; Response.Redirect("CadastroProduto.aspx"); } 5- Cdigo para o evento Click do objeto ButtonExcluir. Identico ao item 3. protected void ButtonExcluir_Click(object sender, EventArgs e) { Session["PaginaRetorno"] = "ConsultaProduto.aspx"; Session["Operacao"] = "Excluir"; Response.Redirect("CadastroProduto.aspx"); }

129 de 168

6- Cdigo para o evento Click do objeto ButtonVoltar. Usa o mtodo Redirect de Response tendo como parmetro a varivel de seo PaginaRetorno. Repare o mtodo ToString que converte o valor da varvel d tipo Session para string, j que o mtodo Redirect requer uma string. protected void ButtonVoltar_Click(object sender, EventArgs e) { Response.Redirect(Session["PaginaRetorno"].ToString()); } 7- O evento SelectedIndexChanging do objeto GridView ideal para obter valores da linha selecionadas (com ao do click do mouse). Neste caso atribuimos a varivel de seo PKProduto, o valor da propriedade Text da primeira coluna (index zero). O valor da varivel PKProduto ser utilizado na lgica da pgina Aspx CadastroProduto. protected void GridViewProdutos_SelectedIndexChanging(object sender, GridViewSelectEventArgs e) { Session["PKProduto"] = GridViewProdutos.Rows[e.NewSelectedIndex].Cells[0].Text; }

8- Encerra o bloco de cdigo da Classe ConsultaProduto. }

Apostila de C# e ASP.Net
Comentando o cdigo da Pgina CadastroProduto
1- Cria umainstncia da Classe ProdutoController e define uma varivel local do tipo string.

130 de 168

public partial class CadastroProduto : System.Web.UI.Page { ProdutoController_SQL Produto = new ProdutoController_SQL(); string MsgErro;
2- Define a lgica para o evento Load da pgina Aspx CadastroProduto, detectando se a pgina j foi carregada (pelo parmetro de sistema IsPostBack), se no, e se a varivel de seo PKProduto diferente de Incluir.

protected void Page_Load(object sender, EventArgs e) { if ((!IsPostBack) && (!Session["Operacao"].Equals("Incluir")))


{

2.1 Preenche a varivel de seo OldProduto com o DataTable resultante do mtodo GetProduto.

Session["OldProduto"] = Produto.GetProduto(Convert.ToInt64(Session["PKProduto"]));
2.2 Preenche a propriedade Text do objeto TextBoxDescricao com o campo Descricao do objeto Produto. Este

objeto foi carregado com o registro obtido pelo mtodo GetProduto junto ao mtodo subjacente na Classe Produto da NameSpaceSQL. TextBoxDescricao.Text = Produto.Descricao;
2.3 O memso que o item anterior, mas para o objeto TextBoxPreco. Repare a funo ToString da Classe Convert ajustando o valor do campo Preco de Produto que do tipo Decimal (ponto flutuante).

TextBoxPreco.Text = Convert.ToString(Produto.Preco);
2.4 Encerram respectivamente a funo If e o bloco do procedimento Page_Load.

} 3- Procedimento referente ao evento Click do objeto ButtonConfirmar. Comentando: 3.1- Declarao do procedimento e inio do bloco do procedimento. protected void ButtonConfirmar_Click(object sender, EventArgs e) { 3.2- Estrutura If veificando se a varivel de seo Operacao igual a Incluir. Se for, executa o mtodo InserirProdutoMovimento (que mapeia o mesmo mtodo na camada Model Produto) retornando a mensagem de erro (se houver) para varvel de classe MsgErro. if (Session["Operacao"].Equals("Incluir")) { MsgErro = Produto.InserirProdutoMovimento(TextBoxDescricao.Text, decimal.Parse(TextBoxPreco.Text)); }

Apostila de C# e ASP.Net

131 de 168

3.3- Verifica em else if (primeira condio else da estrutura If) se Operacao igual a Alterar. Sendo, passa para o mtodo SetOld (seu parmetro tipo DataTable) da instncia de ProdutoController o contedo da varivel de escopo Session, convertendo-o para um tipo DataTable. O mtodo SetOldProduto armazena nos campos pblicos da Classe ProdutoController relativo aos campos que sero utilizados na chamada ao mtodo AlterarProduto, que encapsulando o mesmo mtodo na Classe Produto, utilizar para os parmetros da clusula Where do comando Update. Em seguida chama o Mtodo AlterarProduto passando os devidos valores para seus parmetros. Aqui, novamente, atribuido para varivel MsgErro, a mensagem de erro resultante da execuo do mtodo caso exista. else if (Session["Operacao"].Equals("Alterar")) { Produto.SetOldProduto((DataTable)Session["OldProduto"]); MsgErro = Produto.AlterarProduto(TextBoxDescricao.Text, decimal.Parse(TextBoxPreco.Text), Produto.OldId, Produto.OldDescricao, Produto.OldPreco); } 3.4- O mesmo que o item 3.3, mas para operao de excluso. else if (Session["Operacao"].Equals("Excluir")) { Produto.SetOldProduto((DataTable)Session["OldProduto"]); MsgErro = Produto.ExcluirProduto(Produto.OldId, Produto.OldDescricao, Produto.OldPreco); } 3.5- Atribui a propriedade Text do controle LabelErro, o valor da varivel MsgErro. Este controle exibe por intermdio de sua propriedade Text, na parte inferior da pgina a mensagem de erro resultante da execuo dos mtodos de negcio. LabelErro.Text = MsgErro; MsgErro = ""; } 4- Utilizando como parmetro o valor da varivel de seo PaginaRetorno, invoca o mtodo Redirect do objeto Response para orientar o fluxo para o formulrio ConsultaProduto, neste caso. protected void ButtonCancelar_Click(object sender, EventArgs e) { Response.Redirect(Session["PaginaRetorno"].ToString()); } 5- Encerra o bloco de cdigo da Classe CadastroProduto. }

Apostila de C# e ASP.Net
Testando a Aplicao

132 de 168

1- Execute a aplicao, e pelo menu da pgina de Index, selecione o item Produto fazendo logo em seguida uma busca de produto iniciado pela letra C. Confira esses passos observando as figuras 01 e 02.

Figura 01

Figura 02

Apostila de C# e ASP.Net

133 de 168

2- Clique sobre uma linha do GridView, por exemplo, na linha do produto Celular Xing Ling, e em seguida no boto Alterar. Como consequncia ser exibido a pgina representada pela figura 03. Promova alguma alterao, confirme e volte a pgina de consulta.

Figura 03

Apostila de C# e ASP.Net
Projeto WebServices em C#

134 de 168

Proposta: Desenvolver um WebService para controlar as vendas em nosso site. Web service uma soluo utilizada na integrao de sistemas e na comunicao entre aplicaes diferentes. Com esta tecnologia possvel que novas aplicaes possam interagir com aquelas que j existem e que sistemas desenvolvidos em plataformas diferentes sejam compatveis. Os Web services so componentes que permitem s aplicaes enviar e receber dados em formato XML. Cada aplicao pode ter a sua prpria "linguagem", que traduzida para uma linguagem universal, o formato XML. Para as empresas, os Web services podem trazer agilidade para os processos e eficincia na comunicao entre cadeias de produo ou de logstica. Toda e qualquer comunicao entre sistemas passa a ser dinmica e principalmente segura, pois no h interveno humana. Essencialmente, o Web Service faz com que os recursos da aplicao do software estejam disponveis sobre a rede de uma forma normalizada. Outras tecnologias fazem a mesma coisa, como por exemplo, os browsers da Internet acedem s pginas Web disponveis usando por norma as tecnologias da Internet, HTTP e HTML. No entanto, estas tecnologias no so bem sucedidas na comunicao e integrao de aplicaes. Existe uma grande motivao sobre a tecnologia Web Service pois possibilita que diferentes aplicaes comuniquem entre si e utilizem recursos diferentes. Utilizando a tecnologia Web Service, uma aplicao pode invocar outra para efetuar tarefas simples ou complexas mesmo que as duas aplicaes estejam em diferentes sistemas e escritas em linguagens diferentes. Por outras palavras, os Web Services fazem com que os seus recursos estejam disponveis para que qualquer aplicao cliente possa operar e extrair os recursos fornecidos pelo Web Service. Os Web Services so identificados por um URI (Unique Resource Identifier), descritos e definidos usando XML (Extensible Markup Language). Um dos motivos que tornam os Web Services atrativos o fato deste modelo ser baseado em tecnologias standards, em particular XML e HTTP (Hypertext Transfer Protocol). Os Web Services so utilizados para disponibilizar servios interativos na Web, podendo ser acessados por outras aplicaes usando, por exemplo, o protocolo SOAP (Simple Object Access Protocol). O objetivo dos Web Services como a comunicao aplicao para aplicao atravs da Internet. Esta comunicao realizada com intuito de facilitar EAI (Enterprise Application Integration) que significa a integrao das aplicaes de uma empresa, ou seja, interoperabilidade entre a informao que circula numa organizao nas diferentes aplicaes como, por exemplo, o comrcio eletrnico com os seus clientes e seus fornecedores. Esta interao constitui o sistema de informao de uma empresa. E para alm da interoperabilidade entre as aplicaes, a EAI permite definir um workflow entre as aplicaes e pode constituir uma alternativa aos ERP (Enterprise Resource Planning). Com um workflow possvel optimizar e controlar processos e tarefas de uma determinada organizao. Padro O W3C, OASIS so as instituies responsveis pela padronizao dos Web Services. Empresas como IBM e Microsoft, duas das maiores do setor de tecnologia, apiam o desenvolvimento deste padro. Segundo o W3C (World Wide Web Consortium) um Web Service define-se como: um sistema de software projetado para suportar a interoperabilidade entre mquinas sobre rede. Tem uma relao descritiva num formato machine-processable, especificamente WSDL (Webservice Description Language). Outros sistemas interagem com o Web Service usando as mensagens SOAP, tipicamente sobre HTTP com XML na juno com outros standards da Web. Tecnologias As bases para a construo de um Web service so os padres XML e SOAP. O transporte dos dados realizado normalmente via protocolo HTTP ou HTTPS para conexes seguras (o padro no determina o protocolo de transporte). Os dados so transferidos no formato XML, encapsulados pelo protocolo SOAP. Segurana Muitas empresas temiam, no passado, prover funcionalidades na Internet devido ao medo de expor seus dados. Mas com advento dos Web Services elas podem publicar servios de forma simples e que so totalmente isolados da base de dados. A segurana dos Web Services um dos pontos fracos desta tecnologia. O problema no a falta de mecanismos de segurana mas sim a falta de consenso em qual deve ser o mecanismo a ser adoptado pela tecnologia Web Service, As questes mais relevantes na segurana so as seguintes: - Autenticidade (ter a certeza que uma transaco do Web Service ocorreu entre o servidor e seu cliente; - Privacidade (todas as mensagens trocadas entre o servidor e o cliente no so interceptadas por uma pessoa no autorizada); - Integridade (as mensagens enviadas tanto pelo servidor ao cliente, como o contrrio, devem permanecer inalteradas). Em seguida descrevese os principais mecanismos de segurana.

Apostila de C# e ASP.Net

135 de 168

SSL O SSL (Secure Socket Layer) [Netscape 1996] quando aplicado a pequenos dispositivos oferece autenticao, integridade de dados e privacidade de servios. Atualmente, a soluo para enviar informao confidencial para Web Services utilizar um mecanismo de segurana SSL sobre HTTP tambm conhecido como HTTPS (Hypertext Transfer Protocol Secure). Este mecanismo protege informaes confidenciais e fcil de ser configurado. Tem como desvantagem ser mais lento do que as transaces HTTP no encriptadas pelo que no adequado para taxas de transferncias de dados elevadas. XML SIGNATURE A XML Signature [IETF e W3C 2000] uma iniciativa conjunta da IETF (Internet Engineering Task Force) e do W3C para especificar uma sintaxe XML e regras de processamento para criao e representao digital de assinaturas. As vantagens na utilizao da XML Signature, ao contrrio de outras normas de assinaturas digitais, esto baseadas na independncia da linguagem de programao, fcil interpretao humana e independncia do fabricante. Esta tecnologia tambm permite assinar digitalmente subconjuntos de um documento XML. XML ENCRYPTION A XML Encryption [IETF e W3C 2002] especifica um processo para encriptao de dados e sua representao em formato XML. Os dados podem ser dados arbitrrios (incluindo um documento XML), elementos XML ou contedos de elementos XML. Um documento XML que utiliza a XML Encryption pode ser visto por qualquer utilizador, mas apenas o proprietrio da chave de descodificao conseguir compreender o contedo codificado. WS-SECURITY O WS-Security (Web Services Security) uma iniciativa conjunta de empresas como Microsoft, IBM e Verisign destinada ao uso da XML-Signature e da XML-Encryption para fornecer segurana s mensagens SOAP. O WSSecurity um esforo destinado a fazer com que os Web Services trabalhem melhor em um ambiente global. O WS-Security tambm inclui alguns importantes componentes como encaminhamento, confiana e tratamento de transaes. SAML O SAML (Security Assertion Markup Language) [OASIS 2001] uma norma emergente para a troca de informao sobre autenticao e autorizao. O SAML soluciona um importante problema para as aplicaes da prxima gerao, que a possibilidade de utilizadores transportarem seus direitos entre diferentes Web Services. Isto importante para aplicaes que tencionam integrar um nmero de Web Services para formar uma aplicao unificada. Limitaes associados aos Web Services Apesar da sua grande popularidade e relativa simplicidade, o SOAP tem vrias limitaes, que por sua vez os Web Services tambm sofrem essas limitaes pois utilizam o SOAP. As limitaes so descritas em seguida: Segurana e privacidade nenhuma das verses do SOAP define qualquer tipo de segurana. Isto devido ao SOAP utilizar HTTP, mas para implementar mecanismos de segurana ao nvel da rede pode utilizar o protocolo SSL no HTTP (tambm conhecido como HTTPS) para garantir a confidencialidade, a integridade e a autenticao do cliente, do servidor e da comunicao cifrada. Como no existe um suporte para segurana, que inclui a privacidade, nas normas que compem os Web Services, tem levado cada projeto a procurar diferentes solues para resolver o problema da segurana o que se torna incompatvel com a promessa de implementar uma normalizao a nvel global. Mensagens e encaminhamento para suportar as funcionalidades das mensagens assncronas tradicionais Qualidade de servio e fiabilidade para garantir tempos de resposta e detectar excepes Processamento transaccional para suportar comunicao transaccional, para associar essa comunicao transaccional com as transaces locais e para participar em transaces distribudas Gesto para controlar o estado e comportamento dos Web Services Desempenho para optimizar a execuo dos Web Services que tem implicaes ao nvel do desenho das aplicaes, chamadas remotas, caractersticas da rede e armazenamento/processamento dos documentos Interoperabilidade suportar a interoperao sem problemas o grande objetivo dos Web Services e do SOAP, ou seja, fornecerem uma plataforma de integrao entre aplicaes e diferentes linguagens e implementados em qualquer sistema operativo. Assim esta tecnologia seria uma tecnologia normalizada mas, no entanto, existem rivalidades entre fornecedores. Por exemplo, o AXIS (implementao SOAP do projeto Apache) no compatvel com .Net da Microsoft, por isso gera interfaces em dois formatos, uma para consumo prprio e outra diferente para o .Net ser compatvel com o Axis. Para resolver este problema existe vrias abordagens para resolver este problema como o SOAPBuilders Interoperability Lab que fornece uma plataforma para testar a interoperabilidade dos produtos.

Apostila de C# e ASP.Net

136 de 168

Integrao de sistemas Muitos consideram que os Web services corrigem um grande problema da informtica: a falta de integrao de sistemas. Os Web services permitem que a integrao de sistemas seja realizada de maneira compreensvel, reutilizvel e padronizada. uma tentativa de organizar um cenrio cercado por uma grande variedade de diferentes aplicativos, fornecedores e plataformas. O futuro dos Web Services Acredita-se que no futuro as empresas iro listar seus Web services em diretrios pblicos (UDDI), de onde podero ser vendidos como servios para outras empresas, instituies ou usurios comuns... Tecnologias Utilizadas Para a representao e estruturao dos dados nas mensagens recebidas/enviadas utilizado o XML (eXtensible Markup Language). As chamadas s operaes, incluindo os parmetros de entrada/sada, so codificadas no protocolo SOAP (Simple Object Access Protocol, baseado em XML). Os servios (operaes, mensagens, parmetros, etc.) so descritos usando a linguagem WSDL (Web Services Description Language). O processo de publicao/pesquisa/descoberta de Web Services utiliza o protocolo UDDI (Universal Description, Discovery and Integration). XML Extensible Markup Language (XML) a base em que os Web Services so construdos. O XML fornece a descrio, o armazenamento, o formato da transmisso para trocar os dados atravs dos Web Services e tambm para criar tecnologias Web Services para a troca dos dados. A sintaxe de XML usada nas tecnologias dos Web Services especifica como os dados so representados genericamente, define como e com que qualidades de servio os dados so transmitidos, pormenoriza como os servios so publicados e descobertos. Os Web Services descodificam as vrias partes de XML para interagir com as vrias aplicaes. SOAP O SOAP (Simple Object Access Protocol) baseia-se numa invocao remota de um mtodo e para tal necessita de especificar o endereo do componente, o nome do mtodo e os argumentos para esse mtodo. Estes dados so formatados em XML com determinadas regras e enviados normalmente por HTTP para esse componente. No define ou impe qualquer semntica, quer seja o modelo de programao, quer seja a semntica especfica da implementao. Este aspecto extremamente importante, pois permite que quer o servio, quer o cliente que invoca o servio sejam aplicaes desenvolvidas sobre diferentes linguagens de programao. Por esta razo, o SOAP tornou-se uma norma aceite para se utilizar com Web Services, uma tecnologia construda com base em XML e HTTP. Desta forma, pretende-se garantir a interoperabilidade e intercomunicao entre diferentes sistemas, atravs da utilizao da linguagem XML e do mecanismo de transporte HTTP ou outro como, por exemplo, SMTP. O SOAP permite que os documentos XML de envio e de recepo sobre a Web suportem um protocolo comum de transferncia de dados para uma comunicao de rede eficaz, ou seja, o SOAP providencia o transporte de dados para os Web Services. Em relao a Web, o SOAP um protocolo de RPC que funciona sobre HTTP (ou SMTP, ou outro) de forma a ultrapassar as restries de segurana/firewalls normalmente impostas aos sistemas clssicos de RPC (RMI, DCOM, CORBA/IIOP) suportando mensagens XML. Em vez de usar HTTP para pedir uma pgina HTML para ser visualizada num browser, o SOAP envia uma mensagem de XML atravs do pedido HTTP e recebe uma resposta, se existir, atravs da resposta do HTTP. Para assegurar corretamente a transmisso da mensagem de XML, o servidor de HTTP, tais como Apache ou IIS (Microsoft Internet Information Server), recebe mensagens SOAP e deve validar e compreender o formato do documento XML definido na especificao SOAP v1.1. WSDL
a sigla de Web Services Description Language, padro baseado em XML para descrever o servio como no COM, onde ele traz os mtodos do Web Service. Funciona como uma espcie de TypeLibrary do Web Service, alm de ser usado para a validao das chamadas dos mtodos. O WSDL (Web Services Description Language) uma especificao desenvolvida pelo W3C que permite descrever os Web Services segundo um formato XML. O WSDL extensvel para permitir a descrio dos servios e suas mensagens, independentemente dos formatos de mensagem e dos protocolos de rede que sejam usados. No entanto, comum usarse o MIME (Multipurpose Internet Mail Extensions) e o HTTP/SOAP. O WSDL descreve os servios disponibilizados rede atravs de uma semntica XML, este providencia a documentao necessria para se chamar um sistema distribudo e o procedimento necessrio para que esta comunicao se estabelea. Enquanto que o SOAP especifica a comunicao entre um cliente e um servidor, o WSDL descreve os servios oferecidos.

Apostila de C# e ASP.Net

137 de 168

UDDI Protocolo desenvolvido para a organizao e registro de Web Services. O UDDI (Universal Description Discovery and Integration) uma iniciativa em desenvolvimento no mbito do consrcio industrial UDDI promovido originalmente pela IBM, Microsoft e Arriba, com objetivo de acelerar a interoperabilidade e utilizao dos Web Services, pela proposta de um servio de registo de nomes de organizaes e de descrio do servio. Um registro UDDI contm trs tipos de informao: informaes gerais de cada organizao, tais como o nome, morada, telefone e contatos; informaes de organizaes e servios por categorias de negcios; informaes tcnicas sobre os servios providenciados pelas organizaes. O UDDI providencia trs funes principais, conhecidas como publicao, descoberta e ligao: 1) publicao: permite que uma organizao divulgue o(s) seu(s) servio(s); 2) descoberta: permite que o cliente do servio, procure e encontre um determinado servio; 3) ligao (bind): permite que o cliente do servio, possa estabelecer a ligao e interagir com o servio. WS-I o consrcio que garante a integrao entre os Web Services para garantir sempre que os Web Services possam conversar entre-si. Iniciativas em curso O sucesso que os Web Services possam vir a apresentar passa necessariamente pela vontade da indstria, pela partilha e abertura dos processos de normalizao e das prprias especificaes da resultantes. Parte significativa desse processo tem sido desenvolvida no mbito do W3C. No entanto, dever-se- tambm referir outros esforos e consrcios que tm vindo a ser desenvolvidos, designadamente o UDDI, o ebXML, ou o XML/EDI. Por exemplo, o ebXML um esforo patrocinado pela UN/CEFACT e pela OASIS, cujo objetivo a produo de um conjunto de especificaes para permitir colaboraes de negcio eletrnico. O standard ebXML pode ser visto como uma extenso s funcionalidades de descrio, publicao e descoberta de servios (definidas no mbito do UDDI), ao tratar os seguintes aspectos: como especificar os processos de negcio; como identificar os Web Services participantes e respectivas colaboraes; ou, que padres de negociao existem na colaborao entre os participantes. Estes aspectos, so tratados nomeadamente nas seguintes especificaes: 1) esquemas para especificao de processos de negcio, BPSS (business process specification schema); 2) acordos de protocolos de colaborao, CPA (collaboration protocol agreement); 3) ou perfis de protocolos de colaborao, CPP (collaboration protocol profile). Contribuio das empresas As principais empresas, para alm de promoverem e participarem ativamente nos vrios consrcios de normalizao, tm vindo a incorporar nas suas prprias infra-estruturas de desenvolvimento e suporte de aplicaes implementaes das normas ligadas aos Web Services. Entre outras, merece referncia a plataforma da Microsoft, .Net , da Sun, Java ONE (Open Net Environment), da Hewlett-Packard, e-speak e da IBM, IBM Web Services . Novos Modelos de Negcio S o futuro dir quem tem razo: se os cpticos ou conservadores, se os que arriscam e concretizam a sua viso. Com o conceito dos Web Services talvez o mais importante nem seja a tecnologia em si, mas toda uma discusso volta dos fatores econmico-polticos que este paradigma poder suscitar, bem como os modelos de negcio que podero emergir. Parece natural a emerso de novos portais, no para as pessoas consultarem e usarem, mas para as aplicaes, i.e., para os servios se registarem/publicarem de modo a tornarem-se conhecidos, descobertos e usados. Esses portais de servios (tecnicamente consiste em servios de registos UDDI e/ou ebXML) podero ser definidos a nvel global, regional, para domnios de negcio horizontais ou verticais. Novos Requisitos Tecnolgicos No entanto e naturalmente, novos problemas e requisitos tecnolgicos so colocados com o conceito dos Web Services. Desde logo, ao nvel da modelao destes servios e dos processos de negcio em que aqueles participam. Aspectos como a composio de servios, coordenao de fluxos de trabalho, identificao e privacidade, segurana, negociao, contratos e pagamentos, tratamento de excepes, categorizao e taxonomias de servios, etc., devero ser adequadamente investigados e tratados de forma que este paradigma possa vir a apresentar um largo consenso e sucesso.

Apostila de C# e ASP.Net

138 de 168

Vantagens e Desvantagens Os Web Services so modelos que surgiram para o desenvolvimento de aplicaes tpicas de negcio eletrnico, envolvendo e suportando o estabelecimento da colaborao e negociao de forma aberta, distribuda e dinmica entre distintos parceiros. Os Web Services podem no futuro representar um sucesso significativo por causa de existir um esforo significativo, por parte da maioria dos parceiros industriais, na normalizao das tecnologias envolvidas. As tecnologias subjacentes aos Web Services (tais como HTTP, SOAP, WSDL, UDDI, XML) so abertas, amplamente divulgadas e consensuais. Por outro lado, existe potencial para haver uma real independncia das linguagens de programao (Java, C++, VB, Delphi, C#), das arquiteturas de computadores e sistemas operativos, o que permite uma evoluo mais suave e econmica para este modelo computacional. No entanto, existe crticas que demonstram medos ou falsas expectativas que os investimentos em Web Services podem suscitar. Uma dessas crticas diz respeito ao fato do SOAP menos eficiente do que os sistemas de RPC existentes. Por exemplo, as mensagens (com os respectivos envelopes e descrio de tipos) trocadas entre as partes so descritas em formato de texto/XML enquanto que nos sistemas clssicos de RPC so trocadas em formato binrio. No entanto, esta desvantagem compensada significativamente pela facilidade de interoperao entre os servios, sem os problemas conhecidos de segurana/firewalls, e pela facilidade de se esconder os detalhes proprietrios das infra-estruturas de suporte.

Apostila de C# e ASP.Net
Criando WebService

139 de 168

O objetivo deste exerccio, exemplificar a criao de um WebService para servir de Interface Remota (pelo protocolo http) das classes de negcio do exerccio NameSpaceSQL, acessadas pela camada Vieww e Controller. Com essa abordagem, poderemos facilmente estender as funcionalidades da camada de negcio (Model) a aplicativos, sejam baseado em Asp.Net ou WinForm, para acesso remoto. Para tanto, necessitamos apenas construir o WebService com mtodos que exponham as funcionalidades da camada Model permitindo acesso via http (Web Reference no VisualStdio). Com essa atitude, podemos classificar nosso projeto (Model, WebService, Controller e View) no somente adequada ao paradigma MVC, mas tambm agora, como um aplicativo baseado em Objetos Distribudos. Passo 01 Conforme exibido na figura 01, com o seu ambiente VisualStudio em execuo, crie um projeto ASP.NET Web Service, definindo o local conforme definido. Repare que optamos pela linguagem Visual C#.

Figura 01

Passo 02 Observe o cdigo da Listagem 01, gerado automaticamente, representando a classe nomeada Service. Repare ainda o mtodo pblico do tipo string, denominado HelloWorld, criado automaticamente para projeto. Listagem 01 using System; using System.Linq; using System.Web; using System.Web.Services; using System.Web.Services.Protocols; using System.Xml.Linq; [WebService(Namespace = "http://tempuri.org/")] [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)] // To allow this Web Service to be called from script, using ASP.NET AJAX, uncomment the following line. // [System.Web.Script.Services.ScriptService] public class Service : System.Web.Services.WebService { public Service () { //Uncomment the following line if using designed components //InitializeComponent(); }

Apostila de C# e ASP.Net
[WebMethod] public string HelloWorld() { return "Hello World"; } }

140 de 168

Nota: Vale observar o mtodo HelloWord, que precedido de uma anotao [WebMethod] garantido ao mesmo exposio para os aplicativos consumidores do WebService. Outros mtodos podem existir, mas no necessariamente sendo expostos aos aplicativos consumidores, bastando apenas no serem precedido da referida anotao. Naturalmente mtodos no anotados com [WemMethod], s podem ser acessados por outros mtodos da classe, anotados ou no. Passo 03 Execute o projeto e tenha uma surpresa, pois sem nenhum esforo temos uma aplicao de teste expondo um link para o mtodo HelloWord. Cinfira na Figura 03. Este precedimento, executar o WebService e termos uma resposto na Browse uma facilidade que temos no ambiente do VisualStudio, mas que limitado para testes preliminares e principalmente para debug. Nota: Conforme demonstrado na Figura 02, exibido a caixa de dialogo Debuggging Not Enabled solicitando permisso ou no para configurao do arquivo Web.Config, que se positivo, habilitar o recurso de debug pra nosso WebService.

Figura 02

Figura 03 Dando continuidade ao Passo 03, se orientando pelas Figuras 04 e 05, finalize o teste conferindo o resultado.

Apostila de C# e ASP.Net

141 de 168

Figura 04

Figura 05 Passo 04 Visando alinhar os nomes das classes de nosso WebService com os objetos de negcio da camada Modelo, renomeie tanto o nome da classe quanto o mtodo construtor para WSProduto reflitindo o definido nas Listagem 02. A Figura 06 exibe a caixa de dialogo Soluction Explore do projeto aps as alteraes promovidas. Listagem 02 public class WSProduto : System.Web.Services.WebService { public WSProduto() { } Cdigo omitido aqui.

Figura 06

Apostila de C# e ASP.Net

142 de 168

Passo 05 Acrescente o mtodo RetornaProduto, preocupando-se em anot-lo com [WebMethod] para que tenha visiblidade para os clientes consumidores do WebService. A Listagem 03 contem todo o cdigo fonte da classe WSProduto, incluindo claro as modificaes e acrscimos relativos Passos 04 e 05, em negrito para facilitar. Listagem 03 1. using System; 2. using System.Linq; 3. using System.Web; 4. using System.Web.Services; 5. using System.Web.Services.Protocols; 6. using System.Xml.Linq; 7. using System.Data; 8. 9. [WebService(Namespace = "http://tempuri.org/")] 10. [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)] 11. 12. public class WSProduto : System.Web.Services.WebService 13. { 14. public WSProduto() 15. { 16. } 17. 18. [WebMethod] 19. public string HelloWorld() { 20. return "Hello World"; 21. } 22. 23. [WebMethod] 24. public DataTable RetornaProduto(String Descricao) 25. { 26. NameSpaceSQL.Produto Produto = NameSpaceSQL.Produto(); 27. return Produto.RetornaProduto(Descricao); 28. } 29. 30. } Comentando a Listagem o3 Linha 14 23 24 26 27 Comentrio Mtodo construtor da classe. Anotao que torna o mtodo acessvel aos clientes (consumidores do WebService). Define um mtodo pblico que implementa um parmetro do tipo String, retornando um tipo DataTable (Collection). Cria uma instncia do objeto (classe) Produto da NameSpaceSQL anteriormente referenciada. Executa o mtodo da Classe produto, retornando uma lista (DataTable) de produtos.

Apostila de C# e ASP.Net

143 de 168

Passo 06 Finalizando a implementao, altere o cdigo do arquivo WSProduto.asmx , definindo o novo nome da Classe. Originalmente o nome era Service, aqui estamos renomeando para WSProduto conforme linhas de cdigo abaixo. Verso Original <%@ WebService Language="C#" CodeBehind="~/App_Code/Service.cs" Class="Service" %> Verso Modificada <%@ WebService Language="C#" CodeBehind="~/App_Code/Service.cs" Class="WSProduto" %>

Passo 07 Fazendo valer o benefcio fornecido pela ferramente, em implementar um aplicativo de teste de consumo de mtodos de nosso WebService, utilize a opo de menu Debug | Start Debuggin para executar o teste. Baseado na imagem da Figuras 07, clique no link RetornaProduto, e em seguida, agora se orientando pela imagem da Figura 08, preencha o campo Descricao com a letra C clicando no boto Invoke para que o mtodo seja executado no WebService. A Listagem 04 exibe em formato XML o pacote de dados retornado pelo mtodo, exibindo os registros da tabela Produto que tem descrio iniciada com a letra C passado como parmetro. Nota: Apesar da afirmao anterior, na prtica, nosso WebService no acessa a tabela Produto no banco de dados. Na verdade ela submete uma chamado ao mtodo relativo na Camada de Negcio, e esse sim interge com a base de dados.

Figura 07

Figura 08

Apostila de C# e ASP.Net
Listagem 04 <DataTable> <xs:schema id="NewDataSet"> <xs:element name="NewDataSet" msdata:IsDataSet="true" msdata:MainDataTable="Table" msdata:UseCurrentLocale="true"> <xs:complexType> <xs:choice minOccurs="0" maxOccurs="unbounded"> <xs:element name="Table"> <xs:complexType> <xs:sequence> <xs:element name="Id" type="xs:long" minOccurs="0"/> <xs:element name="Descricao" type="xs:string" minOccurs="0"/> <xs:element name="Preco" type="xs:decimal" minOccurs="0"/> </xs:sequence> </xs:complexType> </xs:element> </xs:choice> </xs:complexType> </xs:element> </xs:schema> <diffgr:diffgram> <NewDataSet> <Table diffgr:id="Table1" msdata:rowOrder="0"> <Id>1</Id> <Descricao>Celular Sony 2233</Descricao> <Preco>223.00</Preco> </Table> <Table diffgr:id="Table2" msdata:rowOrder="1"> <Id>3</Id> <Descricao>Cmera Fuji 3.7</Descricao> <Preco>350.00</Preco> </Table> <Table diffgr:id="Table3" msdata:rowOrder="2"> <Id>9</Id> <Descricao>Caneta Lazer</Descricao> <Preco>109.00</Preco> </Table> <Table diffgr:id="Table4" msdata:rowOrder="3"> <Id>15</Id> <Descricao>Celular Xing Ling</Descricao> <Preco>113.00</Preco> </Table> <Table diffgr:id="Table5" msdata:rowOrder="4"> <Id>112</Id> <Descricao>Cadeira Sem Brao para Micro</Descricao> <Preco>44.00</Preco> </Table> <Table diffgr:id="Table6" msdata:rowOrder="5"> <Id>113</Id> <Descricao>Cadeira ComBrao para Micro</Descricao> <Preco>100.00</Preco> </Table> </NewDataSet> </diffgr:diffgram> </DataTable>

144 de 168

Apostila de C# e ASP.Net
Configurando o IIS (Internet Information Services)

145 de 168

Para que possamos fazer uso do WebService WSProduto, referenciando-o em nosso projeto Asp.Net (Camada View) e consumir seus mtodos siga os passos a seguir. Vale ressaltar, que apesar de podermos testar nosso WebService diretamente no ambiente do VisualStudio, necessrio disponibilizarmos o servio em um Servidor Web, em nosso caso claro o IIS da Microsoft. Passo 01 Execute o utilitrio IIS, tendo como referncia a Figura 01, clique com o boto direito do mouse sobre o n Site da Web Padro, escolhendo a opo Novo | Diretrio Virtual.... Com isso iniciamos o passo-a-passo para criao de um diretrio virtual que servir de referncia de acesso ao nosso WebService por intermdio de uma URL. Para tanto, os clientes consumidores do WebService implementaro uma URL por intermdio do protocolo HTTP conforme exemplo a seguir. Exemplo de URL com Protocolo HTTP http:\\MeuServidor\NomeDiretorioVirtual\WSProduto.asmx

Figura 01

Ainda neste passo, clique no boto Avanar na caixa de dialogo apresentada em funo da ao anterior para prosseguir na criao do Diretrio Virtual para acesso ao projeto WebService. A Figura 02 resume isso.

Figura 02

Apostila de C# e ASP.Net

146 de 168

Passo 02 Dando continuidade, defina o nome WSProduto na propriedade Alias da caixa de dialogo representada pela Figura 03. Esse naturlmente ser o nome do Diretrio Virtual, o melhor resumindo, o nome de referncia na URL para acesso ao projeto WebService.

Figura 03

Passo 03 Conforme demonstrado na imagem da Figura 04 aponte para o diretrio que contem o projeto WebService, indicando ao IIS onde encontrar os servios solicitados pela URL que invocar classes de WSProduto. Clique no boto Avanar para prosseguir no processo.

Figura 04

Passo 04 A Caixa de dialogo exibida aps o passo anterior, Figura 05, permite configurar caractersticas que iro autorizar ou no (dar permisso) ao ISS de execuo aos scripts Asp.Net. Proceda como exibida na imagem da Figura 05, clicando no boto Avanar.

Apostila de C# e ASP.Net

147 de 168

Figura 05 Passo 05 Basta clicar no boto Concluir da Figura 06, assim, encerrando os passos necessrios para divulgarmos nosso WebService. A Figura 07 demonstra nosso Diretrio Virtual (Alias de acesso ao WebService) devidamente configurado.

Figura 06

Figura 07

Apostila de C# e ASP.Net
Consumindo o WebService na Aplicao Web

148 de 168

Passo 01 Basicamnete fazemos uma referncia ao WebService alvo, clicando com o boto direito do mouse no n do projeto Web e selecionando a opo do menu de contexto Add Web Reference.... Voc pode acionar esta opo orientando-se pela imagem da Figura 01.

Figura 01

Passo 02 Orientando-se pela Figura 02, complete a ao anterior preenchendo a URL de acesso ao WebService. Naturalmente devemos montar a referida URL coonforme esquema a seguir: HTTP:// Nmero IP do Servidor ou Nome do Servidor/ Nome do Alias criado no IIS/ Nome do arquivo ASMX que representa o WebService

Em nosso exemplo ficaria ento assim: http://WS222/WSProduto/WSProduto.aspx

Figura 02 Defina um nome para o Prox no campo Web reference nameclicando em seguida no boto Add Reference. Asiim procedendo, conforme observado na Soluction Explore do projeto (Figura 03) Obtivemos uma classe (Proxi) mapeando os mtodos e o endereo dos mesmos para acesso ao WebService.

Apostila de C# e ASP.Net

149 de 168

Figura 03

Passo 03 Finalizando esta etapa, observe a o cdigo da Listagem 01 onde, em negrito, procedemos as alteraes necessrias para utilizao do mtodo RetornaProduto do WebService. Basicamente criamos um objeto denominado WSProduto que herda da classe (Proxi) WSProduto, e em seguida fizemos uso do mtodo referido, atribuindo o tipo de retorno (DataTable) a propriedade DataSource do GridView. public partial class ConsultaProduto : System.Web.UI.Page { //ProdutoController_SQL Prod = new ProdutoController_SQL(); WSProduto.WSProduto WSProduto = new WSProduto.WSProduto(); protected void ButtonPesquisar_Click(object sender, EventArgs e) { //GridViewProdutos.DataSource = Prod.ObterProduto(TextBoxDescricaoProduto.Text); GridViewProdutos.DataSource = WSProduto.RetornaProduto(TextBoxDescricaoProduto.Text); GridViewProdutos.DataBind(); } . . . Cdigo restante da classe omitido aqui.

Apostila de C# e ASP.Net
Gerando Relatrios com CrystalReport

150 de 168

O gerador de relatrios CrystalReport que utilizaremos aqui, parte integrante do VisualStudio. Na prtica, o produto, distribudo (comercializado) em separado pela proprietria do produto, e nada impede que utilizamos o mesmo para desenvolver nossos modelos de relatrios. Uma prtica comum no desenvolvimento de relatrios com CrystalReport, injetar instruo SQL para obter os dados junto a uma fonte de dados, e a partir desta instruo, em tempo de desenvolvimento, utilizar o IDE do produto para modelar os dados do relatrio. Isto no faremos, pois desde o incio de nosso projeto temos tido a devida ateno para no fugir ao padro MVC, logo, neste caso, em se tratando o relatrio de um componente da camada View, no poderamos cometer o engando de tornarmos o mesmo dependente e acoplado a fonte de dados (Banco de Dados). O que faremos aqui ento? Vamos desenvolver o Lay-Out de nossos relatrios a partir dos atributos de nossa classes, e em seguida, utilizarmos os mesmos na camada View, atribuindo aos mesmos o resultado retornado pelos mtodos de negcio que retornam colees de dados por intermdio de um DataTable. Igualmente aos controles de dadosde coleo como GridView, ListBox entre outros, os relatrios gerados a partir do CrystalReport implementam a propriedade DataSource para qual atribuiremos os tais DataTable retornados pelos mtodos de obteno de registros. Passo 01 Baseado no exposto na Figura 01, adicione um diretrio na estrutura de diretrios do nosso projeto Camada_Model_SQ nomeando-o como RPT. Este diretrio acomodar nossos modelos de relatrios gerados pelo CrystalReport. O resultado ficar semelhante ao representado na Figura 02.

Figura 01

Apostila de C# e ASP.Net

151 de 168

Figura 02 Passo 02 Orientando-se pela Figura 03, 04 e 05, adicione um novo item ao projeto, a saber, um relatrio CrystalReport. Repare que optamos nesta fase por um relatrio em branco, abrindo mo do ajudador do ambiente CrystsalReport.

Figura 03

Apostila de C# e ASP.Net

152 de 168

Figura 04

Figura 05 Passo 03 As Figuras 06 e 07, respectivamente exibem a rea de Lay-Out do relatrio e a paleta de componentes (Tollbox) onde podemos buscar controles visuais para texto e forma a ser aplicado a rea de design. A rea de Lay-Out como podemos observar, dividia em Sessions que representam as bandas de um relatrio.

Apostila de C# e ASP.Net

153 de 168

Figura 06

Figura 07 Passo 04 Iniciando o desenho de nosso relatrio, no tocante a modelagem de dados a ser exibido, acesse a caixa de dialogo Field Explores, precisamente no n Database Fields, clique com o boto direito do mouse sobre este n selecionando Database Expert entre as opes.

Figura 08

Passo 05 Na caixa de dialogo representada pela Figura 09, acesse o n Net Objects dentro da estrutura de ns de Project Data. Assim, teremos acesso a todas as classes (modelos) do projeto, sendo que para nosso exemplo optaremos por ListaMovimento da NameSpaceSQL. Por fim clique na seta (>) para selecionar o modelo que vai fornecer os campos do nosso relatrio. Clique no boto OK para finalizar.

Apostila de C# e ASP.Net

154 de 168

Figura 09 Passo 06 Agora em Field Explorer no n Database Fields (Figura 10) temos acesso aos campos da classe selecionada, bastando arrastar, por exemplo os campos Data, Descricao_Movimento, Descricao_Produto e Quantidade para a banda Detail (Session3 Detail) para definir quais campos desejamos exibir no relatrio. Observe que quando arrastamos um campo para Session3 Detail, na banda superior, para cada campo adicionado, e colocado tambm um componente que serve de ttulo para a coluna. As figuras 11 e 12 exibem o retratado.

Figura 10

Figura 11

Apostila de C# e ASP.Net

155 de 168

Figura 12

Passo 07 Vamos agora aplicaremos um controle Text Object oriundo da Tool Box (Figura 14), servindo o mesmo como ttulo do relatrio. Naturalmente aplicaremos tal controle na banda de cabealho (Session2 Page Header). D um duplo clique no controle para edit-lo, digitando o texto conforme imagem da Figura 15. Ainda nesta etapa, aplique na banda cabealho um controle Print Date e um Print Time, disponveis no n Special Fields em Field Explore (Figura 14). Repare que nesta coleo temos vrias variveis teis para o relatrio.

Figura 13 Para finalizar o design, aplique conforme ilustrado na Figura 15, duas linhas horizontais para visualmente separar os ttulos das colunas dos dados da mesma. Aplique tambm o controle Page Number a banda rodap, obtendo-o da coleo Special Fields em Field Explore (Figura 13).

Apostila de C# e ASP.Net

156 de 168

Figura 14

Figura 15

Passo 08 Clicando com o boto direito do mouse sobre a rea de desig, selecione no menu de contexto (Figura 16) a opo Preview Report para antes mesmo de atribuirmos dados ao relatrio termos uma viso realista do design final. O resultado pode ser observado na Figura 17.

Figura 16

Apostila de C# e ASP.Net

157 de 168

Figura 17

Passo 09 Agora daremos uma guinada extrema, saindo do projeto que estamos, e abrindo o projeto Web. Mas antes, temos que copiar o diretrio RPT do projeto atual todos os arquivos do CrystalReport e incluirmos no projeto Web, pois assim, no contexto do projeto Web (Camada View), poderemos utiliz-los. Proceda como sugerido na Figura 18 para visualizarmos o diretrio RPT recm copiado para o projeto Web.

Figura 18

Apostila de C# e ASP.Net

158 de 168

Passo 10 Adicione uma nova pgina Aspx ao projeto, nomeando-a como ExibeRelatorio.Aspx. Imediatamente aps salvar este arquivo, aplique a ele um componente CrystalReportSource e um componente CrystalReportViewer. O primeiro controle, naturalmente, servir para atribuirmos um coleo de dados retornada por exemplo por um mtodo de negcio que retorne um tipo DataTable. Selecione o controle CrystalReportViewer, e no menu Task (canto superior direito do componente) e em Choose Report Source vincule-o ao controle CrystalReportSource, definindo o mesmo como fonte de dados do controle CrystalReportViewer. No difcil concluir que o controle CrystalReportViewer servir para prover o design final (quando em execuo) dos relatrios no browser, acrescentando funcionalidades como: salvar em vrios formatos, imprimir e zoom.

Figura 19

Figura 20 Passo 11 Acrescente, conforme Listagem 01, o procedimento para o evento Page_Load da pgina ExibeRelatorio.Aspx. Listagem 01

1. protected void Page_Load(object sender, EventArgs e)


2. {

3. 4. 5.
6. }

CrystalReportSource.Report.FileName = (String) Session["NomeRelatorio"]; CrystalReportSource.ReportDocument.SetDataSource((DataTable)Session["DataTableRelatorio"]); CrystalReportSource.DataBind();

Comentando o cdigo fonte da Listagem 01 Linha 3 4 5 Descrio Define o nome do relatrio oriundo prviamente atribuido a varivel de seo (Session). Atribui ao mtodo a coleo de dados (DataTable) prviamente atribuido a varivel de seo. Invoca o mtodo DataBind do controle CrystalReportSource para renderizar o contedo do relatrio.

Apostila de C# e ASP.Net

159 de 168

Passo 12 Finalizando a codificao, observando a Listagem 02, aplique o cdigo constante ao evento Click do boto Imprimir da Page ConsultaMovimento.Aspx. Caso no exista este boto em sua pgina, acrescente. Listagem 02

1. protected void ButtonImprimir_Click(object sender, EventArgs e)


2. {

3.
4.

Session["NomeRelatorio"] = "CrystalReportListaMovimento.rpt"; Session["DataTableRelatorio"] = Prod.ObterListaMovimento(TextBoxDescricaoProduto.Text, DateTime.Parse(TextBoxDataIni.Text), DateTime.Parse(TextBoxDataFin.Text) ); Response.Redirect("ExibirRelatorio.aspx");

5. 6. 7. 8.
9.

10.
11. }

Comentando o cdigo fonte da Listagem 02 Linha 3 5 10 Descrio Atribui a varivel de seo (Session) o nome do relatrio que desejamos exibir.. Atribui a varivel de seo (Session) o DataTable (coleo de registros) retornado pelo mtodo. Redireciona para a pgina ExibirRelatrio.Aspx, naturalmente desejando ver os dados no browser.

Passo 13 Execute o projeto e verifique o resultado.

Apostila de C# e ASP.Net
Anexo 01 - JavaScript Aplicado a Asp.Net

160 de 168

O ASP.NET foi uma grande revoluo no desenvolvimento web, trouxe uma grande produtividade para todo o processo de desenvolvimento. Mas o ASP.NET no mudou a arquitetura de desenvolvimento web. Assim como o ASP 3, o ASP.NET uma tecnologia para desenvolvimento no lado do servidor, realizando acesso a dados e gerando o contedo a ser enviado para o client. Mas em um sistema ser necessria tambm a interatividade com o usurio, programando o lado client. Tarefas como exibir uma mensagem popup ou definir o foco de uma caixa apenas podem ser feitas com programao no lado client, o que continua sendo feito com javascript. A programao javascript no mudou em nada. O que mudou foi a forma como o javascript gerado em conjunto com a tecnologia do servidor. Torna-se necessrio entender adequadamente a relao de execuo entre o que est no servidor e o que est no lado client para ser possvel gerar o javascript corretamente. Ento vamos analisar em detalhes situaes em que o javascript seja necessrio e como ele pode ser gerado. Inserindo eventos em webControls O javaScript permite que faamos a programao de eventos no lado client. Eventos como click, onmouseover, onmouseout, e outros, podem ser programados em diversos objetos da interface web, tal como botes, imagens, links e outros objetos. Os eventos no javascript so inseridos na forma de atributos das tags. Atravs da propriedade Atributes podemos ter controle sobre os atributos de tags que sero renderizados no lado client, assim podemos adicionar eventos client aos objetos. Por exemplo, se desejarmos adicionar um evento onclick em um boto podemos utilizar o seguinte cdigo: button1.attributes.add("onclick","alert('Esse botao foi clicado')") Neste exemplo ao clicarmos no boto veremos uma mensagem popup antes que o postBack tipico do boto ocorra, para finalmente rodar o evento click deste boto no servidor.

Cancelamento de um postBack
Conforme caracterstica do prprio javascript, podemos utilizar o evento onclick para cancelar a ocorrncia de um postBack, bastando retornar do evento um valor boolean. Assim podemos, ao invs de fazer uso da funo alert, utilizar a funo confirm do javascript para gerar uma mensagem de confirmao em botes, por exemplo. Veja: Button1.attributes.add("onclick","return confirm('Tem certeza ?')")

Gerando eventos no HTML


Para alguns eventos, podemos inseri-los diretamente na tag ao invs de fazer a insero atravs do Attributes. Mas apenas para alguns eventos. A regra a seguinte : Se existe um evento de servidor com o mesmo nome ento voc no pode inserir o evento direto no HTML, pois ser interpretado errado, ser confundido com o evento do servidor. Por exemplo, o onclick do boto, que no servidor tem o mesmo nome.

Apostila de C# e ASP.Net

161 de 168

Mas se no existe nenhum evento de servidor com o mesmo nome, fique a vontade, insira o evento na tag normalmente, o webcontrol, ao no reconhecer o atributo, renderizar o atributo no client exatamente como estiver e desta forma ir gerar o evento no javascript. Um exemplo disso so os eventos omouseover e onmouseout no objeto Image, veja como fica, neste exemplo preenchendo a linha de status do browser : <asp:Image id="Image1" runat="server" ImageUrl="SNAG-0002.jpg" onmouseover="javascript:window.status='testando 1,2,3'" onmouseout="javascript:window.status=''"> </asp:Image>

Utilizando funes JavaScript


Seria por demais desagradvel ter que inserir rotinas mais longas em eventos javaScript utilizando apenas a propriedade attributes. As regras e lgicas de programao javascript, porm, continuam valendo. Assim sendo, ao invs de inserir todo o cdigo atravs do attributes podemos apenas inserir uma chamada de funo atravs do attributes. Assim sendo podemos criar funes diretamente no arquivo .ASPX e atravs do Attributes inserir apenas as chamadas dessas funes. <script language=javascript> function Confirmar(){ return(window.confirm("Tem certeza ?"))} </script> E no CodeBehind: Button1.attributes.add("onclick","return Confirmar()") Gerando javascript para o client Existem alguns casos em que o cdigo javascript deve ser executado imediatamente no load da pgina e no em um evento de um objeto especfico. Os dois casos mais comuns so a exibio de uma mensagem popup no client e a definio do foco para um determinado objeto. Existem 2 mtodos na classe page para a gerao de cdigo JavaScript, so os seguintes: RegisterClientScriptBlock: Gera o script imediatamente aps a tag form RegisterStartUpScript: Gera o script imediatamente antes do fechamento da tag form (</form>) Essa sutil diferena tem impacto na gerao do cdigo client : com o RegisterClientScriptBlock garantimos que o script seja executado to logo possvel, mas deveremos ter cuidado para que o script no faa referncia a objetos que ainda nem tiveram suas tags recebidas pelo browser, do contrrio o script ir gerar erro. J com o RegisterStartUpScript o script ser executado apenas depois de todos os objetos terem chegado ao client, justamente devido a posio que o script inserido na pgina. Ambos os mtodos recebem 2 parmetros, o script a ser inserido dentro da pgina e um parmetro chamado "key". O parmetro key tem por objetivo impedir que um script seja duplicado dentro da pgina, o que

Apostila de C# e ASP.Net
especialmente importante durante o processo de criao de custom web controls.

162 de 168

Neste parmetro, key, criamos uma espcie de nome para o script. Assim sendo se por algum motivo a instruo de gerao do script for executada mais de uma vez, o ASP.NET se encarrega de ignorar as execues duplicadas. So casos incomuns quando o script gerado diretamente na pgina, mas um recurso fundamental para para a criao de custom web controls. Exibindo uma mensagem de concluso: Me.RegisterClientScriptBlock("x", "<script>alert('Operao concluida !')</script>") Definindo o foco para uma caixa: Me.RegisterStartupScript("z", "<script>document.all.TextBox1.focus()</script>") Cuidados com os nomes dos objetos No exemplo acima utilizamos o nome do objeto - TextBox1 - para poder definir o foco para o objeto. Mas nem sempre o nome que o objeto possui no servidor ser o mesmo nome que o objeto possui no client, os nomes podero ser diferentes especialmente quando o objeto estiver dentro de algum container, tal como uma DataGrid, um Repeater ou outro objeto do gnero. Para resolver este problema os objetos possuem uma propriedade chamada clientID. Esta propriedade guarda o nome que o objeto ter quando estiver no client. Assim sendo, mudando o cdigo acima, para termos maior segurana com relao ao nome do objeto, o cdigo fica da seguinte forma : Me.RegisterStartupScript("z", "<script>document.all." & TextBox1.ClientID & ".focus()</script>") Tambm possvel ter expresses de binding dentro de blocos de javascript, quer seja para a traduo do nome de um objeto ou para algum outro objetivo. Veja : <script language="javascript"> function DefinirFoco(){ document.all.<%# Textbox1.clientid %>.focus()} </script> Pode-se ento utilizar a instruo Page.DataBind para provocar o processamento da expresso e desta forma gerar o id do objeto na posio correta. Manipulando janelas com JavaScript Manipular janelas popup outro recurso para o qual precisamos utilizar amplamente o javascript. Em um sistema frequente a necessidade de criarmos janelas popup modais para perguntarmos informaes adicionais ao usurio. Mais uma vez precisamos de javaScript para isso. importante destacar que no podemos utilizar response.redirect ou server.transfer e indicar em qual janela ou frame a pgina ser aberta. Os dois primeiros so instrues do servidor e portanto no tem como controlar a atividade no client. Abrindo um popup Essa primeira parte simples. Podemos utilizar o window.open do javascript normalmente. Podemos inseri-lo diretamente no ASPX ou utilizar uma das instrues Register para fazer a gerao do script com o window.open

Apostila de C# e ASP.Net
Utilizando uma janela modal

163 de 168

Neste caso a tarefa complica um pouco mais, pois em geral quando utilizamos uma janela modal desejamos uma resposta, um resultado. Assim sendo precisamos realizar uma comunicao entre as janelas utilizando javascript Vamos supor um WebForm1.aspx chamando em uma janela modal um Webform2.aspx. <script language="javascript"> function abrirjanela() { var ret; ret=window.showModalDialog("webform2.aspx","",""); document.all.TextBox1.value=ret; } </script> Neste exemplo temos uma funo abrirjanela que dever estar no webForm1.aspx. Esta funo faz a abertura de uma janela modal, obtem um valor de resposta e atribui esse valor de resposta na TextBox1. Esta funo pode ser disparada de diversas formas diferentes : utilizando um hyperlink, o click de uma imagem, um boto html, enfim, objetos client. Porm s justificvel usar um objeto de servidor para fazer esse disparo se for necessrio realizar algum processamento adicional antes da janela popup. Nesse caso podemos fazer o disparo da funo no click de um boto no servidor (no "fazer o disparo", mas sim gerar o javascript para isso). Me.RegisterStartupScript("x", "<script>abrirjanela()</script>") No WebForm2 precisaremos definir o valor de retorno atravs da propriedade returnValue do objeto window e fechar o form. <script language="javascript"> function terminou() { window.returnValue=document.all.TextBox1.value; window.close(); } </script> Mais uma vez temos a mesma questo : S justificvel usar objetos de servidor se houver algum processamento adicional a ser realizado antes do fechamento. A forma de fazer o disparo, neste caso, fica identica a anterior : Me.RegisterStartupScript("x", "<script>terminou()</script>") Detalhes adicionais : Funes javaScript podem ser inseridas em arquivos .JS e estes vinculados a pgina atravs da prpria tagm<script>. O trabalho entre frames tambm precisa ser feito em javascript. Deve-se ter cuidado com o autoPostback, que insere cdigo javascript em alguns eventos do objeto. Se ao mesmo tempo voc tentar inserir seu prprio cdigo javascript para o mesmo evento, gerar erro. O evento onSubmit do form um evento especial, pois todos os webControls podem manipula-lo. Por isso voc no deve tentar lidar diretamente com esse evento. Para isso existe um mtodo chamado RegisterOnSubmitStatement que ir controlar o uso do evento OnSubmit por todos os webControls.

Apostila de C# e ASP.Net
Anexo 2 - Expresses Regulares
O que Expresso Regular?

164 de 168

Em cincia da computao, uma expresso regular (ou o estrangeirismo regex, abreviao do ingls regular expression) prov uma forma concisa e flexvel de identificar cadeias de caracteres de interesse, como caracteres particulares, palavras ou padres de caracteres. Expresses regulares so escritas numa linguagem formal que pode ser interpretada por um processador de expresso regular, um programa que ou serve um gerador de analisador sinttico ou examina o texto e identifica partes que casam com a especificao dada. O termo deriva do trabalho do matemtico norte-americano Stephen Cole Kleene, que desenvolveu as expresses regulares como uma notao ao que ele chamava de lgebra de conjuntos regulares. Seu trabalho serviu de base para os primeiros algoritmos computacionais de busca, e depois para algumas das mais antigas ferramentas de tratamento de texto da plataforma Unix. O uso atual de expresses regulares inclui procura e substituio de texto em editores de texto e linguagens de programao, validao de formatos de texto (validao de protocolos ou formatos digitais), realce de sintaxe e filtragem de informao.

Expresses Regulares em JavaScript


Expresso Regular (ou Regular Expression, que o nome original) uma forma de efetuar a validao sobre um texto atravs de um determinado padro, eliminando um longo trecho de cdigo para fazer esta funo. Uma Regular Expression composta de uma seqncia de smbolos e caracteres especiais que interpretada como uma regra, que indicar se um texto posterior segue todas as condies nela impostas. Mas e como isso funciona? Vamos a um exemplo prtico: validao de e-mail. function validaEmail(mail){ var er = RegExp(/^[A-Za-z0-9_\-\.]+@[A-Za-z0-9_\-\.]{2,}\.[A-Za-z0-9]{2,}(\.[A-Za-z0-9])?/); if(mail == ){ window.alert(Informe seu e-mail!); }else if(er.test(mail) == false){ window.alert(E-mail invlido!); } } Listagem 01 Funo contendo um exemplo de Expresso Regular (linha 2) Vamos entender o cdigo. Na segunda linha temos a declarao da Regular Expression escrita em uma das duas formas possveis. Pode-se utilizar o mtodo construtor RegExp, assim como no exemplo, ou atribuir diretamente a expresso (quadro 02). var er = /^[A-Za-z0-9_\-\.]+@[A-Za-z0-9_\-\.]{2,}\.[A-Za-z0-9]{2,}(\.[A-Za-z0-9])?/; Listagem 02 Expresso regular sem RegExp Mas qual a diferena? Da primeira forma voc pode-se atribuir a expresso regular dinamicamente, passando uma string por parmetro, por exemplo. Na segunda forma, o contedo da expresso esttico, sendo definido no cdigo somente. E o que significa aquela sopa de letrinhas? Vamos por partes: Primeira parte: ^[A-Za-z0-9_\-\.]+: os caracteres devem estar entre A e Z (apenas maisculo), entre a e z Segunda parte: @: aps a primeira seqncia de caracteres deve encontrar uma arroba (@). Terceira parte: [A-Za-z0-9_\-\.]{2,}: deve encontrar duas ou mais seqncias de caracteres que satisfaam a condio de ser alfanumrico, underline, trao ou ponto.

Apostila de C# e ASP.Net
Quarta parte: \.[A-Za-z0-9]{2,}: deve encontrar duas ou mais seqncias de antecedidos por ponto.

165 de 168

caracteres alfanumricos

Quinta parte: (\.[A-Za-z0-9])?: pode encontrar ou no uma seqncia contendo os caracteres que esto entre os parnteses. Por fim, a funo test ir validar a expresso, retornando um booleano que ir indicar se a string passada por parmetro est validada dentro da expresso. Para entender melhor, a Tabela 01 traz os sinalizadores utilizados nas expresses regulares e seus respectivos significados. Tabela 01: Sinalizadores de expresses regulares
Sinalizador Descrio Sinalizadores Exemplo

i g gi

No faz distino e minsculas Pesquisa global de de um padro

entre letras maisculas /Java/i encontrar "JAVA"

tanto "java" quanto "Java" e

todas as ocorrncias /ca/g encontrar as duas ocorrncias de "ca" na frase " cada macaco no seu galho" /ca/g encontrar as duas ocorrncias de "ca" na frase "Cada macaco no seu galho"

Pesquisa global, sem distino entre letras maisculas e minsculas Encontra um linha. Encontra um carro. Encontra um horizontal. Encontra um vertical. Encontra um pgina. caractere de quebra de caractere de retorno de caractere de tabulao caractere de tabulao indicador de quebra de ASCII expresso

Caracteres literais

\n \r \t \v \f \xxx \xdd \uxxxx

Encontra o caractere pelo valor octal xxx.

"\50" encontra o caractere de abertura de parenteses "(" "\x28" encontra o caractere de abertura de parenteses "(" "\u00A3" encontra""

Encontra o caractere ASCII expresso pelo valor hexadecimal dd. Encontra o caractere ASCII expresso pelo valor UNICODE xxxx.

Posies dos itens de pesquisa

^ $

Encontra somente no Encontra somente no

incio da string final da string.

/^The/ encontra "The" in "The encontra em "In The Night" /and$/ encontra "and" encontra em "landing"

night" mas no

em "Land" mas no

\b

Encontra nos extremos de uma palavra (os caracteres de teste devem existir no /ly\b/ encontra "ly" em "This is incio ou fim de uma palavra pertencente string). Encontra no meio de uma palavra da string, ou seja, o inverso de \b.

really cool."

\B

/\Bor/ encontra "or" em "normal" mas no encontra em "origami."

Classes de caracteres

Apostila de C# e ASP.Net
[xyz]

166 de 168

Encontra qualquer caractere pertencente ao grupo de caracteres dentro dos /[AN]BC/ encontra "ABC" e"NBC" mas no colchetes. Voc pode usar o hfen para encontra "BBC" uma vez que o "B" fora dos definir uma faixa. Por exemplo: /[a-z]/ colchetes no faz parte do conjunto. encontra qualquer letra do alfabeto, /[09]/ encontra qualquer digito de 0 a 9. Encontra qualquer caractere que no esteja no conjunto entre colchetes. O smbolo ^ nos colchetes indica negao.

[^xyz]

Obs: No confunda o smbolo ^ /[^AN]BC/ encontra (negao) dentro dos colchetes com o "ABC" ou "NBC". smbolo ^ que indica que o padro deve ser encontrado no incio da string. A negao deve ser usada somente dentro de colchetes. (ponto). Encontra qualquer caractere /b.t/ encontra exceto quebras de linha ou outro caractere diante. UNICODE que significa trmino de linha. Encontra qualquer caractere alfanumrico incluindo o sublinhdo. Equivale [a-zA-Z0-9_]. /\w/ encontra

"BBC" mas no encontra

"bat", "bit", "bet" e assim por

\w

"200" em "200%"

\W \d \D \s \S

Encontra qualquer caractere que no esteja no conjunto [a-zA-Z0-9_]. Equivale /\W/ encontra "%" [^a-zA-Z0-9_]. Encontra qualquer Equivale a [0-9]. dgito de 0 a 9. /\D/ encontra

em "200%"

Encontra qualquer caractere que no seja um dgito. Equivale [^0-9]. Encontra um caractere que provoca um espao. Equivale [ \t\r\n\v\f]. Encontra qualquer caractere que no provoque um espao. Equivale [^ \t\r\n\v\f].

"No" em "No 342222"

Padres de repeties

{x} {x,} {x,y} ? * +

Encontra exatamente um padro. Encontra x ou mais padro. Encontra de x at y padro. Encontra zero ou uma Equivale {0,1}. Encontra zero ou Equivale {0,}.

x ocorrncias de ocorrncias de um ocorrncias de um ocorrncia.

/\d{5}/ encontra 5 /\s{2,}/ encontra no espao. /\d{2,4}/ encontra 4 dgitos. /a\s?b/ encontra "a b".

dgitos. mnimo 2 caracteres de no mnimo 2 mas no mais que "ab" ou

mais ocorrncias. ocorrncias.

/we*/ encontra "w" em "why" e "wee" em "between", mas no encontra em "bad". /fe+d/ encontra tanto "fed" quanto "feed"

Encontra uma ou mais Equivale {1,}.

Agrupamento de padres

() |

Agrupa caracteres para criar uma clusula. Pode ser aninhado. Oferece alternativa para o padro. similar a uma instruo "OU".

/(abc)+(def)/ encontra uma ou mais ocorrncias de "abc" seguida(s) por uma ocorrncia de "def". /(ab)|(cd)|(ef)/ encontra "ab" ou "cd" ou "ef".

Apostila de C# e ASP.Net

167 de 168

Existem alguns mtodos para efetuar a validao e outras operaes tendo como base a expresso regular construda, os quais esto descritos na Tabela 02. Tabela 02: Mtodos de validao em expresses regulares Mtodo exec test match search replace split lastIndex Executa pesquisas em Indica se a string Descrio uma string e retorna um array das informaes obtidas.

satisfaz os parmetros da expresso regular.

Executa uma pesquisa em uma string e retorna um array das informaes obtidas ou nulo se nada for encontrado. Faz uma pesquisa na Executa uma pesquisa substring. Quebra uma string em string e retorna o ndice do resultado, ou -1 se no for encontrado. em uma string e substitui o resultado encontrado por uma um array de substrings.

Armazena a posio da ltima pesquisa bem sucessida realizada na string. Se nada for encontrado, a propriedade lastIndex ser colocada como 1. n representa o numero de 1 a 9 Armazena os nove mais recentes pesquisa dentro de parnteses encontradas. Por exemplo, se o padro usado por uma regular expression para a ltima pesquisa foi / (Hello)(\s+)(world)/ e a string pesquisada foi Hello world o contedo de RegExp.$2 poderia ser qualquer caractere entro Hello e world. Armazena a copia do padro da regular expression.

$n

source

Sabendo utilizar os caracteres especiais nas expresses regulares j 50%, os outros 50% ficam por conta da lgica para montar a expresso. Para fixar bem o assunto vamos a mais um exemplo: validao de datas. Voc j deve ter visto pela Internet alguns scripts medonhos, com algumas dezenas ou centenas de linhas de cdigo para validar datas, aqueles que voc olha e nem sabe direito como funciona. Vamos simplificar um pouco isso, seguindo o cdigo do quadro 03. function validaData(data){ var er = RegExp("(0[1-9]|[012][0-9]|3[01])/(0[1-9]|1[012])/[12][0-9]{3}"); if(er.test(data)){ var barras = data.split("/"); var dia = barras[0]; var mes = barras[1]; var ano = barras[2]; var d = new Date(ano, mes-1, dia); if(dia != d.getDate()){ return false; else if(mes != (d.getMonth() + 1)){ return false; }else if(ano != d.getFullYear()){ return false; }else{ return true; } }else{ return false; } } Listagem 03 Validao de datas com Expresso Regular.

Apostila de C# e ASP.Net

168 de 168

Na segunda linha temos a declarao da nossa expresso regular, vamos entender como ela funciona. Primeira parte: (0[1-9]|[012][0-9]|3[01]): valida os dias indicando que expresso ir considerar como vlido tudo o que se iniciar com 0 e vier seguido de um dgito entre 1 e 9, ou (pipe (|) o operador lgico or) iniciar com 2 ou 3 e vier seguido de um dgito entre 0 e 9, ou ento iniciar com 3 e vier seguido por 0 ou 1. Isto ir validar os dias entre 1 e 31. Segunda parte: (0[1-9]|1[012]): agora a validao dos meses, que deve ser considerado os que iniciarem com zero, seguidos por um dgito entre 1 e 9, ou iniciar com 1, seguido de 0, 1 ou 2. Terceira parte: [12][0-9]{3}: aqui ir validar o ano, que dever iniciar com 1 ou 2 e aps isso ter uma seqncia de 3 dgitos entre 1 e 9, desta forma, valida os anos entre 1000 e 2999. As barras indicam o formato da data, que deve estar como dd/MM/aaaa. Mas no se pode validar tudo apenas com expresso regular, pois temos os anos bissextos e os meses com 30 ou 31 dias. Por isso temos a segunda parte, que ir criar uma varivel do tipo data passando os parmetros de dia, ms e ano e depois verificar se cada parte da data criada confere com a data informada. A questo de informar mes-1 e depois comparar o ms com d.getMonth() + 1 se d pelo motivo do JavaScript tratar o ms iniciando de 0, e no por 1, ou seja, o JavaScript conta os meses de 0 a 11. Enfim, Expresses Regulares se resume basicamente a isto, no muito complicado, basta dar uma olhada mais atentamente para entender.