Escolar Documentos
Profissional Documentos
Cultura Documentos
Jogos PE Logica Aplicada ApostilaCSharp PDF
Jogos PE Logica Aplicada ApostilaCSharp PDF
Net 1 de 168
.Net Framework
Tpicos:
Microsoft .NET
CLR Common Language Runtime
Metadata
Assemblies
Linguagens habilitadas ao .NET
Common Type System
Web Services
ADO.NET
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:
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:
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.
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:
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.
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
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.
A linguagem C#
A estrutura bsica de uma aplicao C#
using System;
class HelloWorld
{
static void Main( )
{
// escrevendo no console
Console.WriteLine("Hello World !!!");
Console.ReadLine( );
}
}
O Cabealho do programa
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.
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.
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");
}
}
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 9 de 168
Palavras reservadas em C#
abstract event new struct
as explicit null switch
base extern object this
bool false operator throw
break finally out true
byte fixed override try
case float params typeof
catch for private uint
char foreach protected ulong
checked goto public unchecked
class if readonly unsafe
const implicit ref ushort
continue in return using
decimal int sbyte virtual
default interface sealed volatile
delegate internal short void
do is sizeof while
double lock stackalloc
else long static
enum namespace string
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:
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:
Atributos de uma classe ou campos da classe: a varivel declarada como membro de uma classe.
A declarao deve ser efetuada como se segue:
Exemplo:
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 12 de 168
Boxing e UnBoxing
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.
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 13 de 168
Strings
O tipo string representa uma seqncia de caracteres Unicode. string um alias para System.String no. NET
Framework.
string a = "hello";
string b = "h";
Operadores
Operadores aritmticos
Operador Descrio
+ (Adio)
- (Subtrao)
* (Multiplicao)
/ (Diviso)
% (Resto/Mdulo)
Operadores de atribuio
Operador Descrio
= (Atribuio simples)
+= (Atribuio aditiva)
-= (Atribuio Subtrativa)
*= (Atribuio Multiplicativa)
/= (Atribuio de diviso)
%= (Atribuio de mdulo)
Operadores relacionais
Operador Descrio
== (Igualdade)
> (Maior)
< (Menor)
!= (Diferente)
Operadores lgicos
Operador Descrio
&& (E)
|| (OU)
Apostila de C# e ASP.Net 15 de 168
Instrues de Controle
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.
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 16 de 168
Instruo switch
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 17 de 168
Instrues de Iterao
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 18 de 168
Instruo while
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 of n is 1
Current value of n is 2
Current value of n is 3
Current value of n is 4
*/
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.
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 20 de 168
Continue
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 21 de 168
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 22 de 168
Classes
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
}
No nosso exemplo:
Tipo Referncia;
ClasseTeste teste;
Apostila de C# e ASP.Net 23 de 168
protected: O membro no pode ser acessado fora da classe, porm o membro est disponvel para
outras classes derivadas da classe base.
private: O membro no pode ser acessado fora da classe, nem mesmo por outras classes derivadas da
classe base.
internal: O membro somente visvel na unidade de cdigo onde o mesmo est definido. um meio-
termo entre public e protected, uma vez que o membro pode ser acessado por todas as classes definidas
na mesma unidade (pblico para as classes da mesma unidade), porm no pode ser acessado por classes
definidas em outras unidades (protected para unidades definidas em outras unidades).
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;
}
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 26 de 168
O resultado fina pode ser observado na Listagem 02 com o nome da Classe j alterado para Produto.
Listagem 02
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Projeto_OOP
{
public class 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 27 de 168
Campos (Fields)
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; }
}
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);
}
}
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
Figura 02
Apostila de C# e ASP.Net 29 de 168
Passo 2
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
{
}
Apostila de C# e ASP.Net 31 de 168
Passo 3
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 33 de 168
Listagem 02
public class Produto
{
private long _id;
public long Id
{
get { return _id; }
set { _id = value; }
}
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 Livro()
{
titulo = "ASP.NET com C#";
autor = "Alfredo Lotar";
}
class TesteLivro
{
static void Main()
{
Livro lv = new Livro();
Console.WriteLine(lv.titulo);
Console.WriteLine(lv.autor);
Console.Read();
}
}
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 36 de 168
public Produto()
{
}
Apostila de C# e ASP.Net 37 de 168
Namespaces
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:
}
Apostila de C# e ASP.Net 38 de 168
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 39 de 168
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; }
}
public Produto()
{
}
}
}
Apostila de C# e ASP.Net 40 de 168
Mtodos (Methods)
Um mtodo contm cdigo que atua sobre os dados do objeto. Os mtodos, falando em termos de Orientao a
Objetos, descrevem as aes que podem ser realizadas pela classe.
Na prtica, a funcionalidade de uma classe implementada atravs dos seus mtodos.
Modificador Descrio
O tipo ou membro pode ser acessado por qualquer outro cdigo no mesmo assembly ou
public
outro conjunto que faz referncia a ele.
private 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
protected
uma classe derivada.
O tipo ou membro pode ser acessado por qualquer cdigo no mesmo assembly, mas no
internal
no outro conjunto.
O tipo ou membro pode ser acessado por qualquer cdigo no mesmo assembly, ou por
protected internal
qualquer classe derivada em outro assembly.
Exemplo:
// public class:
public class Tricycle
{
// protected method:
protected void Pedal() { }
// private field:
private int wheels = 3;
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 42 de 168
Encapsulamento
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.
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.
Exemplo de Herana
using System;
public class Conta
{
public virtual double Calculo()
{
return (6*15);
}
}
Modificadores de classe
Modificador Descrio
new usado em classes aninhadas. Se a classe tiver o mesmo nome da classe externa, devemos
usar esse moderador para indicar a sobreposio.
sealed a classe no pode ter classes derivadas.
abstract a classe no pode ser instanciada.
Modificador Descrio
abstract Indica que o mtodo no possui implementao.
override Redefine um mtodo definido como virtual.
virtual Indica que o mtodo pode ser redefinido na classe derivada.
new 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:
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 45 de 168
class TestClass
{
static void Main()
{
Employee E = new Employee();
E.GetInfo();
}
}
/*
Sada
Name: John L. Malgraine
SSN: 444-55-6666
Employee ID: ABC567EFG
*/
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;
}
interface I
{
void M();
}
abstract class C : I
{
public abstract void M();
}
}
// Sada: Area of the square = 144
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 47 de 168
Interfaces
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();
}
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 49 de 168
Windows Forms
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 50 de 168
Primeiro Projeto em C#
Parte 1
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.
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.
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 52 de 168
Cadastro
- Clientes
- Produtos
Utilitrios
- Calculadora
Sair
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 Valor
Name tmRelogio
Interval 1000
Enabled 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();
}
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.
Passo 2: Monte a tela da calculadora com os controles abaixo alterando suas propriedades conforme descrito.
Teremos um formulrio semelhante ao da figura 05.
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 Calculadora()
{
}
Passo 4: Com a classe pronta, vamos voltar ao formulrio FormCalculadora pra implementarmos o cdigo abaixo
nos eventos que seguem:
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.
Segundo Projeto em C#
Asembly(DLL) Contendo DataSet Tipado
Parte I
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 Projeto WinForm
-ClassProduto -FormPrincipal
-DSProduto -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 57 de 168
Em seguida nomeie a Class1.cs como ClassProduto.cs, salvando em seguida com este nome.
Para o nome do projeto, confirme os dados conforme
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 Id
{
get { return _Id; }
set { _Id = value; }
}
/// Retorna Vrios produtos, com base nas iniciais do campo descrio
public DataTable ObterProduto(string Descricao)
{
}
}
}
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.
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 62 de 168
Uma vez criado o n que representa a conexo, podemos partir para a prxima etapa.
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
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 :
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 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 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.
Veja a figura 14 para essas orientaes.
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.
Variao do comando Delete levando-se em conta as mesmas condies do Update, ou seja, concorrncia de
dados.
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.
Parte II
O Projeto Cliente
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.
Figura 01
O Nome do Form criado automaticamente dever ser FormPrincipal.cs. Adicione ao FormPrincipal os seguintes
componentes.
Apostila de C# e ASP.Net 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 72 de 168
Text Pesquisar
Text Incluir
Text Alterar
Text Excluir
Text Sair
Name GroupBox_1
Text
Name GroupBox_2
Text
Figura 04
Apostila de C# e ASP.Net 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 74 de 168
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 75 de 168
Cadastro de Produtos
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
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();
}
// 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);
}
if (this.stOpcao.Equals("I"))
{
classeProduto.Incluir();
this.Limpar();
}else if (this.stOpcao.Equals("A"))
{
Apostila de C# e ASP.Net 78 de 168
classeProduto.Alterar();
this.Limpar();
}else{
MessageBox.Show("Implementar a Excluso");
}
}
}
}
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
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
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace NameSpaceSQL
{
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.
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 84 de 168
8- Restante dos mtos Set e Get para os campos privados restantes da Classe Produto (Modelo).
namespace NameSpaceSQL {
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.
Nota: A conexo com o banco de dados na Classe, e foi abordada nos tpicos
relativo as figuras 04 e 05.
4.1-
Define 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 86 de 168
4.2-
Respectivamente 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.
4.3-
Define a string que contem o cdigo SQL para obteno do valor do campo UltimoNumero.
4.4-
Define 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.
4.5-
Cria 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.
4.6-
Instruo 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.7-
Define 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.
4.8-
Executa 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.9-
Na 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.10-
Encerra o bloco relativo ao mtodo RetornaChave.
5.1-
Define 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.
5.2-
Define um objeto do tipo SqlTransaction, sendo atribuido ao mesmo, o incio de transao para a conexo
representada pelo objeto conn.
5.3-
Inicia 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.4-
Define 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.5-
Define 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.
5.6-
Atribuio 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.7-
Executa 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.8-
Cria 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.
5.9-
Executa 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.10-
Atribui uma string vazia para retorno do mtodo. Em seguida encerra o bloco try, desviando de catch.
return "";
}
5.11-
Caso 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.
5.12-
Sempre 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.13-
Os mtos AlterarProduto e ExcluirProduto no sero comentados pois sua lgica j foi analisada e comentada
nos mtodos anteriores.
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();
}
}
5.14-
Mtodo 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.
5.15-
Os mtodos RetornaProduto sobrecarregados e o mtodo RetornaMovimento, no sero comentados j que
so semelhantes ao mtodo anterior, devidamente comentado e explicado.
5.16-
Encerra o bloco da Casse.
5.17-
Encerra o bloco da NameSpace.
}
Apostila de C# e ASP.Net 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; }
}
}
Apostila de C# e ASP.Net 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)
{
public long Id
{
get { return _id; }
set { _id = value; }
}
}
Apostila de C# e ASP.Net 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 97 de 168
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.
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
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.
<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;"
/>
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">
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
</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
<Columns>
<asp:BoundField DataField="Id" HeaderText="Id" SortExpression="Id" />
<asp:BoundField DataField="Descricao_Movimento"
HeaderText="Descricao_Movimento" SortExpression="Descricao_Movimento" />
</asp:GridView>
</div>
</asp:Content>
Apostila de C# e ASP.Net 108 de 168
Figura 21
</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 111 de 168
.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;
}
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.
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.
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.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;
}
input.value=input.value;
}
else
{
event.keyCode=0;
}
Apostila de C# e ASP.Net 114 de 168
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;
}
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).
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 117 de 168
Comentando os passos:
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
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
using System;
using System.Data;
using System.Configuration;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
Apostila de C# e ASP.Net 119 de 168
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Xml.Linq;
using System.Data;
using System.Collections.Generic;
using System.Collections.ObjectModel;
6- Instncias para as classes Produto, Movimento e ListaMovimento contidas na NameSpaceSQL prviamente referenciada.
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.
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.
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
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.
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;
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.
16- O mesmo que o item anterior sendo que para a excluso de Produto.
}
Apostila de C# e ASP.Net 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
Figura 16
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.
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.
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");
}
Apostila de C# e ASP.Net 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.
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.
}
Apostila de C# e ASP.Net 130 de 168
1- Cria umainstncia da Classe ProdutoController e define uma varivel local do tipo string.
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.
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);
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);
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.
}
Apostila de C# e ASP.Net 132 de 168
Testando a Aplicao
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 134 de 168
Projeto WebServices em C#
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 descreve-
se 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 WS-
Security 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.
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.
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 usar-
se 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:
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).
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 139 de 168
Criando WebService
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 140 de 168
[WebMethod]
public string HelloWorld() {
return "Hello World";
}
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 Comentrio
Define um mtodo pblico que implementa um parmetro do tipo String, retornando um tipo
24
DataTable (Collection).
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 144 de 168
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>
Apostila de C# e ASP.Net 145 de 168
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.
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 148 de 168
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
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.
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. CrystalReportSource.Report.FileName = (String) Session["NomeRelatorio"];
4. CrystalReportSource.ReportDocument.SetDataSource((DataTable)Session["DataTableRelatorio"]);
5. CrystalReportSource.DataBind();
6. }
Linha Descrio
3 Define o nome do relatrio oriundo prviamente atribuido a varivel de seo (Session).
4 Atribui ao mtodo a coleo de dados (DataTable) prviamente atribuido a varivel de seo.
5 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. Session["NomeRelatorio"] = "CrystalReportListaMovimento.rpt";
4.
5. Session["DataTableRelatorio"] = Prod.ObterListaMovimento(TextBoxDescricaoProduto.Text,
6. DateTime.Parse(TextBoxDataIni.Text),
7. DateTime.Parse(TextBoxDataFin.Text)
8. );
9.
10. Response.Redirect("ExibirRelatorio.aspx");
11. }
Linha Descrio
3 Atribui a varivel de seo (Session) o nome do relatrio que desejamos exibir..
5 Atribui a varivel de seo (Session) o DataTable (coleo de registros) retornado pelo mtodo.
10 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 160 de 168
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.
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.
Por exemplo, se desejarmos adicionar um evento onclick em um boto podemos utilizar o seguinte cdigo:
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:
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 :
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()")
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.
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 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.
Me.RegisterStartupScript("z", "<script>document.all.TextBox1.focus()</script>")
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 :
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.
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 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
<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 164 de 168
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.
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.
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!);
}
}
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])?/;
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.
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 165 de 168
Quarta parte: \.[A-Za-z0-9]{2,}: deve encontrar duas ou mais seqncias de caracteres alfanumricos
antecedidos por ponto.
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.
Sinalizadores
No faz distino entre letras maisculas /Java/i encontrar tanto "java" quanto "Java" e
i
e minsculas "JAVA"
Pesquisa global de todas as ocorrncias /ca/g encontrar as duas ocorrncias de "ca" na
g
de um padro frase " cada macaco no seu galho"
Pesquisa global, sem distino entre /ca/g encontrar as duas ocorrncias de "ca" na
gi
letras maisculas e minsculas frase "Cada macaco no seu galho"
Caracteres literais
Agrupa caracteres para criar uma /(abc)+(def)/ encontra uma ou mais ocorrncias
()
clusula. Pode ser aninhado. de "abc" seguida(s) por uma ocorrncia de "def".
Oferece alternativa para o padro.
| /(ab)|(cd)|(ef)/ encontra "ab" ou "cd" ou "ef".
similar a uma instruo "OU".
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.
Mtodo Descrio
exec Executa pesquisas em uma string e retorna um array das informaes obtidas.
test Indica se a string satisfaz os parmetros da expresso regular.
Executa uma pesquisa em uma string e retorna um array das informaes obtidas ou
match
nulo se nada for encontrado.
search Faz uma pesquisa na string e retorna o ndice do resultado, ou -1 se no for encontrado.
Executa uma pesquisa em uma string e substitui o resultado encontrado por uma
replace
substring.
Armazena a posio da ltima pesquisa bem sucessida realizada na string. Se nada for
lastIndex
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
$n 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.
source Armazena a copia do padro da regular expression.
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;
}
}
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.