Escolar Documentos
Profissional Documentos
Cultura Documentos
Net
1 de 168
Apostila de C# e ASP.Net
2 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:
APL
Boo
Clarion
COBOL
Component Pascal
C#
C++
Delphi
Eiffel
Forth
Fortran
Haskell
Java
JScript
J#
Lua
Mercury
Mondrian
Oberon
Object Pascal / Delphi
Language
Oz
Pascal
Perl
PowerBuilder
PowerShell
Python
RPG
Ruby
Scheme
SmallTalk
Standard ML
Visual Basic
Esta plataforma permite a execuo, construo e desenvolvimento de Web Services (Aplicaes Web) de forma
integrada e unificada.
A plataforma .NET baseia-se em um dos princpios utilizados na tecnologia Java ((Just In Time Compiler - JIT), os
programas desenvolvidos para ela so duplo-compilados (compilados duas vezes), uma na distribuio (gerando
um cdigo que conhecido como "bytecodes") e outra na execuo.
Um programa escrito em qualquer das mais de vinte linguagens de programao disponveis para a plataforma, o
cdigo fonte gerado pelo programador ento compilado pela linguagem escolhida gerando um cdigo
intermedirio em uma linguagem chamada MSIL (Microsoft Intermediate Language).
Este novo cdigo fonte gera um arquivo na linguagem de baixo nvel Assembly, de acordo com o tipo de projeto:
Apostila de C# e ASP.Net
3 de 168
No momento da execuo do programa ele novamente compilado, desta vez pelo compilador JIT, de acordo com
a utilizao do programa, por exemplo: Temos um Web Site desenvolvido em ASP.NET, ao entrar pela primeira vez
em uma pgina o JIT ir compila-la, nas outras vezes que algum outro usurio acessar esta pgina, ele usar esta
compilao.
Tambm possvel, atravs de ferramentas especficas, "pr-compilar" o cdigo para que no se tenha o custo da
compilao JIT durante a execuo.
O fato desta arquitetura utilizar a MSIL gera uma possibilidade pouco desejada entre os criadores de software que
a de fazer a "engenharia reversa", ou seja, a partir de um cdigo compilado, recuperar o cdigo original. Isto
no uma ideia agradvel para as empresas que sobrevivem da venda de softwares produzidos nesta plataforma.
Por causa disso, existem ferramentas que "ofuscam" o cdigo MSIL, trocando nomes de variveis, mtodos,
interfaces e etc para dificultar o trabalho de quem tentar uma engenharia reversa no mesmo.
Apostila de C# e ASP.Net
4 de 168
Vejam o quanto este procedimento trabalhoso. Com o CTS do .NET simplesmente esta preocupao no existe,
uma vez que todas as linguagens tm acesso a um conjunto de tipos comum a todas elas. Conforme descrito na
documentao do Framework .NET, so as seguintes as principais funes do CTS: Fornece uma estrutura que
possibilita a integrao entre diferentes linguagens habilitadas ao .NET, com uma execuo mais rpida, uma vez
que a sobrecarga para a converso entre os diferentes tipos de diferentes linguagens deixa de existir.
Fornece uma estrutura de tipos com base em um modelo orientado a objetos, o que facilita a criao de
novas linguagens habilitadas ao .NET, favorecendo a utilizao de boas prticas de programao, como
por exemplo a herana. Uma vez que os tipos so objetos, podemos criar tipos derivados dos objetos
bsicos, os quais herdam todas as caractersticas dos objetos bsicos.
O CTS define algumas regras que toda linguagem deve seguir, para ser habilitada ao .NET. Por seguirem
um conjunto de regras comum, a interao entre programas escritos em diferentes linguagens fica bem
mais fcil.
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.
Um assembly composto de dois elementos bsicos:
Manifesto.
Um conjunto de mdulos.
Apostila de C# e ASP.Net
6 de 168
Apostila de C# e ASP.Net
7 de 168
A linguagem C#
A estrutura bsica de uma aplicao C#
O pequeno trecho de cdigo a seguir implementa o clssico programa Ol mundo:
using System;
class HelloWorld
{
static void Main( )
{
// escrevendo no console
Console.WriteLine("Hello World !!!");
Console.ReadLine( );
}
}
O Cabealho do programa
A primeira linha do nosso programa, que escreve no console Ol mundo em C#, contm a informao do
namespace System, que contm as classes primitivas necessrias para ter acesso ao console do ambiente .NET.
Para incluir um namespace em C#, utilizamos a clusula using seguida do nome do namespace.
A declarao de uma classe
O C# requer que toda a lgica do programa esteja contida em classes. Aps a declarao da classe usando a
palavra reservada class, temos o seu respectivo identificador. Para quem no est familiarizado com o conceito de
classe, apenas adiantamos que uma classe um tipo abstrato de dados que no paradigma de programao
orientada a objetos usado para representar objetos do mundo real. No exemplo acima, temos uma classe que
contm apenas o mtodo Main( ) e no recebe nenhum parmetro.
O Mtodo Main( )
Todo programa C# deve ter uma classe que defina o mtodo Main( ), que deve ser declarado como esttico
usando o modificador static, que diz ao runtime que o mtodo pode ser chamado sem que a classe seja
instanciada. atravs desse modificador que o runtime sabe qual ser o ponto de entrada do programa no
ambiente Win32, para poder passar o controle ao runtime .NET. O M maisculo do mtodo Main obrigatrio, e
seu valor de retorno void significa que o mtodo no retorna nenhum valor quando chamado.
Algumas variantes do mtodo Main( )
// Main recebe parmetros na linha de comando via o array
// args
static void Main(string[ ] args)
{
// corpo do mtodo
}
// Main tem como valor de retorno um tipo int
static int Main( )
{
// corpo do mtodo
}
A forma do mtodo Main( ) a ser usada vai depender dos seguintes fatores:
O programa vai receber parmetros na linha de comando? Ento esses parmetros sero armazenados no array
args.
Quando o programa finalizado, necessrio retornar algum valor ao sistema? Ento o valor de retorno ser do
tipo int.
Apostila de C# e ASP.Net
8 de 168
Um programa escrito em C# pode ter mais de uma classe que implementa o mtodo Main( ). Nesse caso, dever
ser especificado em tempo de compilao em qual classe se encontra o mtodo Main( ), que dever ser chamado
pelo runtime quando a aplicao for executada. Exemplo:
using System;
class class1
{
static void Main( )
{
Console.WriteLine("Mtodo Main( ) da classe 1");
}
}
class class2
{
static void Main( )
{
Console.WriteLine("Mtodo Main( ) da classe 2");
}
}
Alguns ltimos detalhes adicionais
Blocos de cdigo so agrupados entre chaves { }.
Cada linha de cdigo separada por ponto-e-vrgula.
Os comentrios de linha simples comeam com duas barras//.
Comentrios em bloco so feitos usando os terminadores /* (de incio) e */ (de fim).
/* Este um comentrio de bloco
Segue o mesmo estilo de C/C++
*/
O C# sensvel ao contexto, portanto int e INT so duas coisas diferentes. int uma palavra reservada que um
alias do tipo System.Int32. INT poderia ser um identificador, entretanto no recomendado usar como
identificadores de variveis o nome de um tipo ou palavra reservada como no exemplo citado.
Sempre declare uma classe onde todos os aspectos inerentes inicializao da aplicao sero implementados, e
obviamente, que conter o mtodo Main( ) tambm. No decorrer deste livro seguiremos fielmente essa regra nos
nossos exemplos.
Apostila de C# e ASP.Net
9 de 168
Palavras reservadas em C#
abstract
as
base
bool
break
byte
case
catch
char
checked
class
const
continue
decimal
default
delegate
do
double
else
enum
event
explicit
extern
false
finally
fixed
float
for
foreach
goto
if
implicit
in
int
interface
internal
is
lock
long
namespace
new
null
object
operator
out
override
params
private
protected
public
readonly
ref
return
sbyte
sealed
short
sizeof
stackalloc
static
string
struct
switch
this
throw
true
try
typeof
uint
ulong
unchecked
unsafe
ushort
using
virtual
volatile
void
while
console(backspace)
Apostila de C# e ASP.Net
10 de 168
O parmetro args um array de strings que recebe os parmetros passados quando a aplicao chamada na
linha de comando. A seguir mostramos uma das formas da varrer os parmetros recebidos:
foreach (string cmd in args)
{
int i = 0;
Console.WriteLine("Par {0}: {1}", i, cmd);
i++;
}
Para saber o nmero de argumentos que foram passados, usamos o mtodo Length( ) do array args da seguinte
forma:
numArgs = args.Length( );
Quando na linha de comando so recebidos parmetros numricos, estes devem ser convertidos de string para o
tipo numrico respectivo usando a classe Convert. Exemplo:
Convert.ToInt32(varString)
Variveis
So utilizadas para armazenar dados na memria do computador. Em C#, todas as variveis so declaradas dentro
do escopo de uma classe e podem ser dos seguintes tipos:
Locais: so declaradas no escopo de um mtodo, indexador ou evento e no possuem modificadores de acesso. A
sua declarao se limita ao tipo seguido do identificador da varivel.
Atributos de uma classe ou campos da classe: a varivel declarada como membro de uma classe.
A declarao deve ser efetuada como se segue:
[Modificador de acesso] [tipo atributo] <tipo da varivel> <identificador>
Exemplo:
public class App
{
public int varInt;
static void Main( )
{
int varLocal;
}
}
O Sistema de Tipos em C#
Em C#, todo tipo derivado da classe System.Object, que constitui o ncleo do sistema de tipos de C#.
Entretanto, os projetistas da linguagem, e no apenas da linguagem, mas de .NET como um todo, sabem
perfeitamente das implicaes de ter um sistema de tipos onde tudo um objeto: queda de desempenho. Para
resolver este problema, eles organizaram o sistema de tipos de duas formas:
Tipos Valor: variveis deste tipo so alocadas na pilha e tm como classe base System.ValueType, que por sua vez
deriva de System.Object.
Tipos Referncia: variveis deste tipo so alocadas na memria heap e tm a classe System.Object como classe
base.
Apostila de C# e ASP.Net
11 de 168
Apostila de C# e ASP.Net
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.
Os tipos valor so subdivididos em duas categorias:
1. Estruturas
2. Enumerados
Estruturas
Estruturas so usadas para implementar tipos simples chamados de primitivos em outras linguagens de
programao,
so criadas na pilha e ainda oferecem muito do potencial de uma classe a um custo menor. Os seguintes tipos so
implementados usando estruturas:
Tipos primitivos
Numricos: inteiros, ponto flutuante e decimal
Booleanos: verdadeiro e falso
Tipos definidos pelo usurio: estruturas propriamente ditas que permitem que o usurio crie seus prprios tipos.
Enumerados
So usados para implementar listas de valores constantes, os quais podem ser de qualquer tipo inteiro (long, int
etc.); porm no podem ser do tipo char. Cada constante tem um valor inteiro associado, o qual pode ser
sobrescrito quando assim definido na lista enumerada. Os valores inteiros associados a cada constante da lista
enumerada comeam a partir de zero.
Tipos Referncia
Os seguintes tipos referncia fazem parte do namespace System e derivam diretamente do System.Object:
class
object
string
delegate
interface
Apostila de C# e ASP.Net
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";
O operador + concatena strings:
string a = "Bom " + "dia";
O [] operador acessa caracteres individuais de uma string:
char x = "teste"[2]; // x = 's';
O arroba (@) evita que seqncia de escape sejam processadas:
@"c:\Docs\Source\a.txt" // o mesmo que "c:\\Docs\\Source\\a.txt"
Operadores
Operadores aritmticos
Em C# temos os seguintes operadores aritmticos:
Operador Descrio
+
(Adio)
(Subtrao)
(Multiplicao)
(Diviso)
(Resto/Mdulo)
Operadores de atribuio
Em C# temos os seguintes operadores de atribuio:
Operador Descrio
=
+=
-=
*=
/=
%=
(Atribuio simples)
(Atribuio aditiva)
(Atribuio Subtrativa)
(Atribuio Multiplicativa)
(Atribuio de diviso)
(Atribuio de mdulo)
Operadores relacionais
Em C# temos os seguintes operadores relacionais:
Apostila de C# e ASP.Net
Operador Descrio
==
(Igualdade)
>
(Maior)
<
(Menor)
<=
(Menor igual)
>=
(Maior igual)
!=
(Diferente)
Operadores lgicos
Em C# temos os seguintes operadores lgicos:
Operador Descrio
&&
(E)
||
(OU)
14 de 168
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.
bool flagCheck = true;
if (flagCheck == true)
{
Console.WriteLine("O flag verdadeiro.");
}
else
{
Console.WriteLine("O flag falso.");
}
Exerccio:
using System;
class TesteIfElse
{
static void Main()
{
Console.WriteLine("Digite um dos seguintes nmeros: 1, 2, 3, 4");
int a = Int32.Parse(Console.ReadLine());
string mensagem = "Varivel a igual: ";
if (a==1)
{
Console.WriteLine(mensagem + a);
}
else if (a == 2)
{
Console.WriteLine(mensagem + a);
}
else if (a == 3)
{
Console.WriteLine(mensagem + a);
}
else
{
Console.WriteLine(mensagem + a);
}
Console.Read();
}
}
Apostila de C# e ASP.Net
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
Current value
Current value
Current value
of
of
of
of
n
n
n
n
is
is
is
is
1
2
3
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.
public class TestDoWhile
{
public static void Main ()
{
int x = 0;
do
{
Console.WriteLine(x);
x++;
} while (x < 5);
}
}
/* Output:
0
1
2
3
4
*/
Apostila de C# e ASP.Net
19 de 168
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
}
Para criar uma instncia:
Tipo Referncia = new Tipo();
No nosso exemplo:
ClasseTeste teste = new ClasseTeste();
Podemos criar uma referncia sem criar um objeto:
Tipo Referncia;
ClasseTeste teste;
Apostila de C# e ASP.Net
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 meiotermo entre public e protected, uma vez que o membro pode ser acessado por todas as classes definidas
na mesma unidade (pblico para as classes da mesma unidade), porm no pode ser acessado por classes
definidas em outras unidades (protected para unidades definidas em outras unidades).
Estruturas (Structs)
Um tipo struct um tipo de valor normalmente usado para encapsular pequenos grupos de variveis relacionadas,
como as coordenadas de um retngulo ou as caractersticas de um item em um inventrio. O exemplo a seguir
mostra uma declarao de struct simples:
public struct Livro
{
public decimal preco;
public string
titulo;
public string
autor;
}
As estruturas tambm podem conter de construtores constantes de campos , de mtodos de , propriedades,
indexadores, de operadores , eventos e aninhados tipos, embora se vrios membros forem necessrios, voc deve
considerar tornar o tipo de uma classe em vez disso.
As estruturas podem implementar uma interface, mas elas no herdam de outra estrutura. Por esse motivo, struct
membros no podem ser declarados como protegido.
Apostila de C# e ASP.Net
24 de 168
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; }
}
private int idade;
public int Idade
{
get { return idade; }
set { idade = value; }
}
}
Constantes (Constants)
A palavra-chave const usada para modificar uma declarao de um campo ou varivel local. Ela especifica que o
valor do campo ou a varivel local constante, o que significa que ele no pode ser modificado.
Exemplo:
public class TesteConstante
{
static void Main()
{
const int c = 1984;
Console.WriteLine("Minha constante = {0}", c);
}
}
// Sada: Minha constante = 1984
Apostila de C# e ASP.Net
28 de 168
Figura 01
O resultado a representao grfica da Classe Produto conforme imagem da Figura 02.
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
{
public class Produto
{
private long _id;
private string _descricao;
private decimal _preco;
}
}
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
Listagem 02
public class Produto
{
private long _id;
public long Id
{
get { return _id; }
set { _id = value; }
}
private string _descricao;
public string Descricao
{
get { return _descricao; }
set { _descricao = value; }
}
private decimal _preco;
public decimal Preco
{
get { return _preco; }
set { _preco = value; }
}
}
33 de 168
Apostila de C# e ASP.Net
34 de 168
Apostila de C# e ASP.Net
35 de 168
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
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:
public partial class Produto
{
private long _id
private string _descricao
private decimal _preco
//Mtodos get e set omitidos
}
public partial class Produto
{
public void IncluirProduto()
{
//cdigo omitido
}
public DataTable ObterProduto(long id)
{
//cdigo omitido
}
}
Apostila de C# e ASP.Net
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
Listagem 02
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Projeto_OOP
{
public partial class Produto
{
}
}
Listagem 03
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Projeto_OOP
{
public partial class Produto
{
private long _id;
public long Id
{
get { return _id; }
set { _id = value; }
}
private string _descricao;
public string Descricao
{
get { return _descricao; }
set { _descricao = value; }
}
private decimal _preco;
public decimal Preco
{
get { return _preco; }
set { _preco = value; }
}
public Produto()
{
}
}
}
39 de 168
Apostila de C# e ASP.Net
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.
Exemplo: [modificador] tipo_de_retorno nome (tipo parmetro)
public class Operacoes
{
public int Soma(int n1, int n2)
{ return n1 + n2; }
}
Descrio
public
O tipo ou membro pode ser acessado por qualquer outro cdigo no mesmo assembly ou
outro conjunto que faz referncia a ele.
private
O tipo ou membro s pode ser acessado pelo cdigo na mesma classe ou struct.
protected
O tipo ou membro s pode ser acessado pelo cdigo no mesmo classe ou struct, ou em
uma classe derivada.
internal
O tipo ou membro pode ser acessado por qualquer cdigo no mesmo assembly, mas no
no outro conjunto.
protected internal
O tipo ou membro pode ser acessado por qualquer cdigo no mesmo assembly, ou por
qualquer classe derivada em outro assembly.
Exemplo:
// public class:
public class Tricycle
{
// protected method:
protected void Pedal() { }
// private field:
private int wheels = 3;
// protected internal property:
protected internal int Wheels
{
get { return wheels; }
}
}
Apostila de C# e ASP.Net
41 de 168
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.
Para a classe Clientes poderamos definir as seguintes propriedades:
Nome
CPF
RG
Identidade
Endereo
Cidade
CEP
Fone
E-Mail
Crdito
Para a
Apostila de C# e ASP.Net
43 de 168
Observe que a nossa classe Clientes possui apenas as propriedades e mtodos comuns a qualquer Cliente, Este
um dos princpios da utilizao de classes: nas classes de primeiro nvel definimos apenas as propriedades e
mtodos comuns, os quais devero ser utilizados pelas classes dos demais nveis.
Na Figura abaixo temos uma viso geral da classe Clientes.
Exemplo de Herana
using System;
public class Conta
{
public virtual double Calculo()
{
return (6*15);
}
}
public class Conta1 : Conta
{
public override double Calculo()
{
return (6*5);
}
}
Apostila de C# e ASP.Net
44 de 168
Modificadores de classe
Os seguintes modificadores podem ser usados em classes, no C#:
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
abstract
Descrio
abstract
override
virtual
new
Virtual
A palavra-chave virtual usada para modificar um mtodo, propriedade, indexador ou declarao de evento e
permitir que ser substitudo em uma classe derivada. Por exemplo, esse mtodo pode ser substitudo por qualquer
classe que herda a ele:
public virtual double Area()
{ return x * y; }
Base
A palavra-chave base usada para acessar membros da classe base da dentro uma classe derivada:
Chame um mtodo na classe base que foi substitudo por outro mtodo.
Especifica o construtor de classe base deve ser chamado durante a criao de instncias da classe
derivada.
Um acesso de classe base permitido apenas em um construtor, um mtodo de instncia ou um acessador de
propriedade de instncia.
Exemplo:
public class Person
{
protected string ssn = "444-55-6666";
protected string name = "John L. Malgraine";
public virtual void GetInfo()
{
Console.WriteLine("Name: {0}", name);
Console.WriteLine("SSN: {0}", ssn);
}
}
Apostila de C# e ASP.Net
45 de 168
Override
O modificador de override necessrio para estender ou modificar a implementao abstrata ou virtual de um
mtodo herdado, propriedade, indexador ou evento.
Exemplo:
abstract class ShapesClass
{
abstract public int Area();
}
class Square : ShapesClass
{
int side = 0;
public Square(int n)
{
side = n;
}
// Area method is required to avoid
// a compile-time error.
public override int Area()
{
return side * side;
}
Apostila de C# e ASP.Net
46 de 168
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();
}
Classe implementando interface:
class InterfaceImplementer : IMyInterface
{
static void Main()
{
InterfaceImplementer iImp = new InterfaceImplementer();
iImp.MethodToImplement();
}
public void MethodToImplement()
{
Console.WriteLine("MethodToImplement() called.");
}
}
Apostila de C# e ASP.Net
48 de 168
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
Apostila de C# e ASP.Net
51 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.
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
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();
}
}
}
Apostila de C# e ASP.Net
53 de 168
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.
Controle
Label
TextBox
Label
TextBox
Label
Label
ComboBox
Button
Propriedade
Text
Name
Text
Name
Text
Name
Text
Name
Name
Text
Valor
Valor 1:
textValor1
Valor 2:
textValor2
Resultado:
labelResultado
Operao
CmbOperacao
BtCalcular
Calcular
Apostila de C# e ASP.Net
54 de 168
Passo 3: Vamos adicionar uma classe ao projeto que ser responsvel por ter as propriedades e mtodos da
calculadora. Clique com o boto direito do mouse sobre o nome do projeto no Solutio Explorer e escolha Add |
New Item.... Selecione Class na caixa de dilogo e d o nome de Calculadora.cs e clique em Add. Feito isso, a
classe exibida em nossa janela para iniciarmos a codificao das suas propriedades, atributos e mtodos
conforme o cdigo abaixo:
class Calculadora
{
private Double _valor1;
public Double Valor1
{
get { return _valor1; }
set { _valor1 = value; }
}
private Double _valor2;
public Double Valor2
{
get { return _valor2; }
set { _valor2 = value; }
}
public enum Operacao { Soma, Subtracao, Multiplicacao, Divisao }
public Calculadora()
{
}
public Calculadora(Double V1, Double V2)
{
this._valor1 = V1;
this._valor2 = V2;
}
public Double Somar()
{
return this._valor1 + this._valor2;
}
public Double Subtrair()
{
return this._valor1 - this._valor2;
}
Apostila de C# e ASP.Net
55 de 168
Passo 4: Com a classe pronta, vamos voltar ao formulrio FormCalculadora pra implementarmos o cdigo abaixo
nos eventos que seguem:
public partial class FormCalculadora : Form
{
public FormCalculadora()
{
InitializeComponent();
cmbOperacao.DataSource = Enum.GetValues(typeof(Calculadora.Operacao));
}
private void btnCalcular_Click(object sender, EventArgs e)
{
Double V1 = Convert.ToDouble(textValor1.Text);
Double V2 = Double.Parse(textValor2.Text);
Calculadora calc = new Calculadora(V1, V2);
Double resultado = calc.Calcular((Calculadora.Operacao)cmbOperacao.SelectedItem);
labelResultado.Text = "Resultado: " + resultado.ToString("N2");
}
Passo 5: Resta agora fazer a chamada do formulrio FormCalcuuladora no item do menu Calculadora no
formulrio FormPrincipal. Para isto, d um duplo clique no item do menu e proceda com o cdigo abaixo e execute
a aplicao para ver o resultado.
private void calculadoraToolStripMenuItem_Click(object sender, EventArgs e)
{
FormCalculadora frmCalc = new FormCalculadora();
FrmCalc.ShowDialog(this);
}
Apostila de C# e ASP.Net
56 de 168
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
-ClassProduto
-DSProduto
Projeto WinForm
-FormPrincipal
-FormConsProduto
-FormCadProduto
Passo 01: Acessando a opo de menu File|New Project, obteremos acesso a caixa de dialogo representada pela
figura 01. Selecione Class Library para iniciarmos um projeto. Preencha a propriedade Name como Produto.
Finalizando clique no boto OK.
Figura 01
Apostila de C# e ASP.Net
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 Original_Id
{
get { return _Original_Id; }
set { _Original_Id = value; }
}
public decimal Original_Preco
{
get { return _Original_Preco; }
set { _Original_Preco = value; }
}
public string Original_Descricao
{
get { return _Original_Descricao; }
set { _Original_Descricao = value; }
}
Apostila de C# e ASP.Net
public decimal Preco
{
get { return _Preco; }
set { _Preco = value; }
}
public string Descricao
{
get { return _Descricao; }
set { _Descricao = value; }
}
public int Id
{
get { return _Id; }
set { _Id = value; }
}
/// Altera um produto existente
public void Alterar()
{
}
/// Cria um novo produto
public void Incluir()
{
}
/// Exclui um produto
public void Excluir()
{
}
public DataTable ObterProduto(int Id_Produto)
{
}
/// Retorna Vrios produtos, com base nas iniciais do campo descrio
public DataTable ObterProduto(string Descricao)
{
}
}
}
58 de 168
Apostila de C# e ASP.Net
59 de 168
Com os Fields (campos) da nossa Classe Criados precisamos encapsular os campos criando assim as Properties,
como segue na figura abaixo:
Figura 02
Passo 03: Um recurso bastante interessante do Visual Studio 2008, extendendo-se naturalmente ao C#.Net, a
possibilidade de exibirmos uma Classe em forma de diagrama (figura 02). De forma inversa, podemos inclusive
criar elementos, Fields(campos), Properties(propriedades) e Methods(mtodos) diretamente no diagrama.
Como exemplo dessas possibilidades, confira as figuras a seguir, observando como fcil e produtivo tal recurso.
Com objetivo de experimentar tal recurso, clique sobre o diagrama da classe com o boto direito do mouse,
fazendo opo Add. Com este menu de contexto ativo, escolha Field.
O resultado a declarao automtica no corpo da classe no local prprio, bastando alternar para a pgina de
cdigo da classe, observando a declarao abaixo.
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 :
SELECT
FROM
Produtos WHERE
(id = @id)
Repare a incluso do parmetro @id, que ser substitudo com o valor passado por parmetro no mtodo.
Existe duas maneiras de se alterar a instruo SQL deste mtodo. A primeira, representada pela figura 11,
acessar a caixa de propriedade deste mtodo, clicando sobre o mesmo com o boto direito do mouse e
manipulando diretamente na propriedade CommandText.
Aproveitando o ensejo, altere tambm o nome do mtodo para ObterProdutoID em GetMethodName, evidenciando
sua habilidade para retornar um registro baseado na pesquisa sobre o campo Id.
Figura 11
A outra maneira sugerida, conforme podemos observar na figura 12, clicando nas reticncias da propriedade
CommandText, ter acesso ao utilitrio Query Builder, onde temos recursos avanados para montagem de consultas
Apostila de C# e ASP.Net
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.
UPDATE
WHERE
(id = @Original_id) AND
(descricao = @Original_descricao) AND
(preco = @Original_preco)
Variao do comando Delete levando-se em conta as mesmas condies do Update, ou seja, concorrncia de
dados.
Apostila de C# e ASP.Net
68 de 168
Figura 19
Passo 08: J que toda implementao do DataSet DSProduto est finalizada, com mtodos necessrios a atender
nossa classe ClassProduto, vamos agora fazer uso dos mtodos deste DataSet em nossa classe, visando assim dar
funcionalidaes aos mtodos da classe classProduto para que aplicativos possam fazer uso. Observe o cdigo em
questo na listagem 02.
/// Altera um produto existente
/// </summary>
public void Alterar()
{
DSProdutoTableAdapters.ProdutosTableAdapter
Produtos = new DSProdutoTableAdapters.ProdutosTableAdapter();
Produtos.Update(_Descricao, _Preco, _Original_Id, _Original_Descricao, _Original_Preco);
}
/// Cria um novo produto
public void Incluir()
{
DSProdutoTableAdapters.ProdutosTableAdapter
Produtos = new DSProdutoTableAdapters.ProdutosTableAdapter();
Produtos.Insert(_Id, _Descricao, _Preco);
}
Apostila de C# e ASP.Net
69 de 168
Apostila de C# e ASP.Net
70 de 168
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.
Construa uma Nova Aplicao no Menu File New Project.
Figura 01
O Nome do Form criado automaticamente dever ser FormPrincipal.cs. Adicione ao FormPrincipal os seguintes
componentes.
Apostila de C# e ASP.Net
Controle
Origem (Toolbox)
MenuStrip
Menus e ToolBars
Propriedade
Valor
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
71 de 168
Apostila de C# e ASP.Net
72 de 168
Origem (Toolbox)
MenuStrip
Menus e ToolBars
Button
Commom Controls
Button
Button
Button
Button
Commom Controls
Commom Controls
Commom Controls
Commom Controls
Propriedade
Valor
Name
ButtonPesquisar
Text
Pesquisar
Name
ButtonIncluir
Text
Incluir
Name
ButtonAlterar
Text
Alterar
Name
ButtonExcluir
Text
Excluir
Name
Button_Sair
Text
Sair
Label
Commom Controls
Text
TextBox
Commom Controls
Name
TextBox_Descricao
DataGridView
Data
Name
GridConsulta
GroupBox
Containers
Dock
Top
Name
GroupBox_1
Text
GroupBox
Containers
Dock
Fill
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
Consulta de Produtos
Figura 07
Ficando assim nossa Consulta.Sendo necessrio ao Evento dos Botes Incluir e Alterar, vamos criar o Formulrio
de Cadastro de Produtos. Da Mesma forma em que Implementamos os Outros Forms, iremos criar esse. O Nosso
Formulario dever ficar assim:
Figura 08
Apostila de C# e ASP.Net
Agora sim poderemos prosseguir com os Cdigos do Form de Consulta.
private void ButtonIncluir_Click(object sender, EventArgs e)
{
FormCadastro_Produtos frmCadProduto = new FormCadastro_Produtos();
frmCadProduto.set_Opcao("I");
frmCadProduto.ShowDialog(this);
}
private void ButtonAlterar_Click(object sender, EventArgs e)
{
DataGridViewRow linha = new DataGridViewRow();
linha = GridConsulta.CurrentRow;
FormCadastro_Produtos frmCadProduto = new FormCadastro_Produtos();
frmCadProduto.set_Opcao("A");
frmCadProduto.Preencher(linha.Cells["Id"].Value.ToString(),
linha.Cells["Descricao"].Value.ToString(),linha.Cells["Preco"].Value.ToString());
frmCadProduto.ShowDialog(this);
}
private void ButtonExcluir_Click(object sender, EventArgs e)
{
/*O Cdigo Referente Excluso de Produtos, fica para exercicio, podemos nos
basear nos eventos acima para atingir nosso objetivo. */
}
Na sequncia exercitaremos o Cadastro de Produtos.
75 de 168
Apostila de C# e ASP.Net
Cadastro de Produtos
using
using
using
using
using
using
using
using
System;
System.Collections.Generic;
System.ComponentModel;
System.Data;
System.Drawing;
System.Linq;
System.Text;
System.Windows.Forms;
namespace Projeto_Cliente
{
public partial class FormCadastro_Produtos : Form
{
private string stOpcao;
private int _Old_id;
private string _Old_Descricao;
private decimal _Old_Preco;
// C#, utilizando conceitos de OO, ou seja, atributos sempre privados
public FormCadastro_Produtos()
{
InitializeComponent();
}
public void set_Opcao(string prstOpcao)
{
this.stOpcao = prstOpcao;
//this seta o prprio objetos
}
public void Limpar()
{
//Instancia um Objeto Controle que da Classe FormCadProduto
//foreach roda itens dentro de arrays
Control controles = this;
foreach (Control ctr in controles.Controls)
{
if (ctr.GetType().ToString().Equals("System.Windows.Forms.TextBox"))
{
((TextBox)ctr).Text = "";
}
}
76 de 168
Apostila de C# e ASP.Net
77 de 168
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
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
System;
System.Collections.Generic;
System.Linq;
System.Text;
long _id;
string _descricao;
decimal _preco;
List<Movimento> _movimento;
long _oldid;
string _olddescricao;
decimal _oldpreco;
5- Mtodo Construtor da Classe Produto, que cria uma List da classe Movimento.
public Produto()
{
this.Movimento = new List<Movimento>();
}
Nota: Este mtodo necessrio em funo do projeto em questo, contemplar um relacionamento entre as
Classes Produto e Movimento. Na Prtica manipulamos uma coleo de objetos Movimento para cada
representao de objeto Produto. Isso ocorrer quando da incluso de um Produto, podermos tambm
incluir um ou mais objetos Movimento. Os comentrios relativo a Incluso de Produto, implementado na
classe Produto Partial que expressa a Lgica de Negcio da classe daro luz a este tpico.
Apostila de C# e ASP.Net
83 de 168
6- Os mtodos descritos abaixo definem Get(s) e Set(s) para os membros privados da classe,
comentados no tpico 4.
Nota: Para criar esses mtodos, no necessrio digit-los no corpo da classe, bastando apenas invocar os
recursos representados pela figuas abaixo, da seguinte forma: Clique com o boto direito do mouse, sobre
o nome do membro privado ID, faa a opo Refactro Encapsulate Field... e a caixa de dialogo
representada pela figura o7 ser exibida. Pronto, basta clicar no boto OK e os mtos Set e Get para este
membro privado ser criado. Repita os paos para os campos privados restantes.
Figura 06
Figura 07
7- Mtos Set e Get para o campo privado ID, criado a partir do tpico 7.
public long Id
{
get { return _id; }
set { _id = value; }
}
Apostila de C# e ASP.Net
84 de 168
8- Restante dos mtos Set e Get para os campos privados restantes da Classe Produto (Modelo).
public string Descricao
{
get { return _descricao; }
set { _descricao = value; }
}
public decimal Preco
{
get { return _preco; }
set { _preco = value; }
}
public long OldId
{
get { return _oldid; }
set { _oldid = value; }
}
public string OldDescricao
{
get { return _olddescricao; }
set { _olddescricao = value; }
}
public decimal OldPreco
{
get { return _oldpreco; }
set { _oldpreco = value; }
}
public List<Movimento> Movimento
{
get { return _movimento; }
set { _movimento = value; }
}
Apostila de C# e ASP.Net
85 de 168
Apostila de C# e ASP.Net
86 de 168
4.4Define e cria um objeto do tipo SqlCommand tendo como parmetro a instruo SQL sqlUltimoNumero e o
objeto de conexo conn implementado e executado no passo 4.2.
SqlCommand cmdGerarChave = new SqlCommand(sqlUltimoNumero, conn);
4.5Cria varivel Numrica Inteira que recebe o valor retornado do mtodo ExecuteScalar() do objeto
cmdGerarChave. Duas observaes importantes so: O Prprio mtodo ExecuteScalar(), utilizado quando
espera-se um nico valor de retorno, a outra observao o uso da Classe Int64 colocada entre parenteses
para converter o valor retornado pla instruo SQL.
Int64 ValorCampoOld = (Int64)cmdGerarChave.ExecuteScalar();
4.6Instruo SQL responsvel pela atualizao do campo UltimoNumero acrescido de um. Repare que por
questes de trtar a concorrncia de dados, a clusula Where da instruo compara no s o valor para o
campo NomeCampoChave, como o valor do campo UltimoNumero, obtido a partir da varivel ValorCampoOld,
que contem o valor deste campo lido anteriormente na tabela. Isso garante que somente ser executado o
comando Update, caso entre a leitura (Select) e o momento do Update, o registro no tenha sido modificado.
String sqlAtualizaNumero =
" Update GerarChave Set UltimoNumero = " +
" UltimoNumero + 1 " +
" Where NomeCampoChave = " + "'" + NomeCampo + "'" +
" AND UltimoNumero = " + Convert.ToString(ValorCampoOld);
4.7Define e cria um objeto do tipo SqlCommand tendo como parmetro a instruo SQL sqlAtualizaNumero e o
objeto de conexo conn implementado e executado no passo 4.2.
SqlCommand cmdAtualizaNumero = new SqlCommand(sqlAtualizaNumero, conn);
Apostila de C# e ASP.Net
87 de 168
4.8Executa o mtodo ExecuteNonQuery() para o objeto cmdAtualizaNumero em uma condio IF que verifica se
o retorno numrico zero. Caso seja, em funo do fato de que o instruo Update do comando
cmdAtualizaNumero no afetou o registro definido em sua clusula Where. O motivo para tanto foi descrito
no tpico 4.7.
Sendo verdadeiro a condio IF, o mtodo exutado recursivamente at retornar um valor (sucesso na
exucuo do comando Update).
if (cmdAtualizaNumero.ExecuteNonQuery() == 0)
{
RetornaChave(NomeCampo);
}
4.9Na sequncia, definido um objeto do tipo Long (Numrico Inteiro Longo), atribuido ao mesmo o valor da
vrivel ValorCampoOld mais um, e por fim, o mtodo retorna tal valor.
long ValorNovo;
ValorNovo = (ValorCampoOld + 1);
return ValorNovo;
4.10Encerra o bloco relativo ao mtodo RetornaChave.
}
Apostila de C# e ASP.Net
88 de 168
5.4Define uma string que recebe como atribuio a instruo Insrte para Produto. Repare nos parmetros
posicionados como valores a serem atribuidos aos campos da tabela Produto.
String sqlProduto = " Insert Into Produto Values(@Id, @Descricao, @Preco) ";
5.5Define o objeto do tipo SqlCommand para insero de Produto. Repare que o mtodo recebe como
parmetro sqlProduto contendo a instruo Insert, conn que representa o objeto de conexo, e por fim,
transacao, que representa o objseto de transao em curso.
SqlCommand cmdProduto = new SqlCommand(sqlProduto, conn, transacao);
5.6Atribuio dos membros pblicos da Classe Produto, a saber, Id, Descricao e Preco para os parmetros @Id,
@Descricao e @Preco pertencentes a instruo Insert contida no objeto cmdProduto.
cmdProduto.Parameters.AddWithValue("@Id", this._id);
cmdProduto.Parameters.AddWithValue("@Descricao", this._descricao);
cmdProduto.Parameters.AddWithValue("@Preco", this._preco);
5.7Executa o mtodo ExecuteNonQuery() para o objeto cmdProduto, instruindo o banco de dados na incluso
de um Produto. Este mtodo til para execuo de instrues Insert, Updade e Delete.
cmdProduto.ExecuteNonQuery();
5.8Cria um lao do tipo foreach, que navega pelos registros contidos no membro this.Movimento (objetos
Movimento). Para cada objeto Movimento montado uma instruo Insert tendo como valores os campos do
objeto Movimento da lista.
Observe que o primeiro parmetro de foreach um tipo Movimento e o segundo, aps in, representa a
coleo Movimento definida no modelo Produto.
foreach (Movimento Movimento in this.Movimento)
{
String sqlMovimento = " Insert Into Movimento Values(@Id, @ProdutoId, " +
" @Tipo_MovimentoId, @Data, @Quantidade, @Valor) ";
SqlCommand cmdMovimento = new SqlCommand(sqlMovimento, conn, transacao);
cmdMovimento.Parameters.AddWithValue("@Id", Movimento.Id);
cmdMovimento.Parameters.AddWithValue("@ProdutoId", Movimento.ProdutoId);
cmdMovimento.Parameters.AddWithValue("@Tipo_MovimentoId", Movimento.Tipo_movimentoid);
cmdMovimento.Parameters.AddWithValue("@Data", Movimento.Data);
cmdMovimento.Parameters.AddWithValue("@Quantidade", Movimento.Quantidade);
cmdMovimento.Parameters.AddWithValue("@Valor", Movimento.Valor);
cmdMovimento.ExecuteNonQuery();
}
5.9Executa o mtodo Commit() para o objeto transacao, instruindo o banco de dados concluir a incluso do
Produto e dos objetos Movimento em definitivo, encerrando a transao.
transacao.Commit();
Apostila de C# e ASP.Net
89 de 168
5.10Atribui uma string vazia para retorno do mtodo. Em seguida encerra o bloco try, desviando de catch.
return "";
}
5.11Caso ocorra erro entre o incio do bloco try e catch, as intrues deste ltimo bloco so executadas,
instruindo o banco de dados a encerrar cancelando a transao (transacao.Rollback();) e retornando pelo
mtodo, a mensagem de erro retornada pelo mtodo TrataErro da Classe ClasseErro tendo como parmetro
a propriedade Message da instncia de Exception representada pelo objeto Erro.
catch (Exception Erro)
{
transacao.Rollback();
conn.Close();
return ClasseErro.TrataErro(Erro.Message);
}
5.12Sempre executado, o bloco finally implementa o fechamento da conexo representada pelo objeto conn. Na
prtica, como observado no assunto Garbage Colector, sabemos que na verdade quem controla o destruir de
um objeto este mecanismo, ficando a cargo do mtodo simplesmente indicar que o recurso est liberado
para este. Isso tambm vale para os mtodos Open e Close das conexes de banco de dados, que so
gerenciadas pelo pooled de conexes da middleware Ado.Net.
finally
{
conn.Close();
}
}
5.13Os mtos AlterarProduto e ExcluirProduto no sero comentados pois sua lgica j foi analisada e comentada
nos mtodos anteriores.
public string AlterarProduto()
{
SqlConnection conn = new SqlConnection(strconn);
conn.Open();
SqlTransaction transacao = conn.BeginTransaction();
try
{
String sqlProduto = " Update Produto Set " +
" Descricao = @Descricao, " +
" Preco = @Preco Where " +
" Id = @Old_ID AND " +
" Descricao = @Old_descricao AND " +
" Preco = @Old_Preco ";
SqlCommand cmdProduto = new SqlCommand(sqlProduto, conn, transacao);
cmdProduto.Parameters.AddWithValue("@Descricao", this._descricao);
cmdProduto.Parameters.AddWithValue("@Preco", this._preco);
cmdProduto.Parameters.AddWithValue("@Old_ID", this._oldid);
cmdProduto.Parameters.AddWithValue("@Old_descricao", this._olddescricao);
cmdProduto.Parameters.AddWithValue("@Old_Preco", this._oldpreco);
Apostila de C# e ASP.Net
90 de 168
if cmdProduto.ExecuteNonQuery() == 0
{
transacao.Rollback();
conn.Close();
return Produto no Alterado. Ou o registro foi alterado ou excludo desde a obteno.;
}
transacao.Commit();
return "";
}
catch(Exception Erro){
transacao.Rollback();
conn.Close();
return ClasseErro.TrataErro(Erro.Message);
}
finally {
conn.Close();
}
}
public string ExcluirProduto()
{
SqlConnection conn = new SqlConnection(strconn);
conn.Open();
SqlTransaction transacao = conn.BeginTransaction();
try{
String sqlProduto =
" Delete Produto Where Id = @ID AND Descricao = @Descricao AND Preco = @Preco ";
SqlCommand cmdProduto = new SqlCommand(sqlProduto, conn, transacao);
cmdProduto.Parameters.AddWithValue("@Old_ID", this._oldId);
cmdProduto.Parameters.AddWithValue("@Old_descricao", this._olddescricao);
cmdProduto.Parameters.AddWithValue("@Old_Preco", this._oldpreco);
if cmdProduto.ExecuteNonQuery() == 0
{
transacao.Rollback();
conn.Close();
return Produto no Excludo. Ou o registro foi alterado ou excludo desde a obteno.;
}
transacao.Commit();
return "";
}
catch(Exception Erro){
transacao.Rollback();
conn.Close();
return ClasseErro.TrataErro(Erro.Message);
}
finally{
conn.Close();
}
}
Apostila de C# e ASP.Net
91 de 168
5.14Mtodo responsvel po retornar um registro da tabela Produto, baseado no valor de sua chave-primria.
O mtodo retorna um tipo DataTable, ideal para acomodar registros de uma tabela. Para implementar este
mecanismo necessrio criar alm de um objeto SqlCommand, um objeto SqlAdapter e por fim um objeto
DataSet. Utilizamos o mtodo Fill deste ltimo para preencher o ojeto Table com os valres retornados pelo
command cmdproduto.
public DataTable RetornaProduto(long Id)
{
SqlConnection conn = new SqlConnection(strconn);
conn.Open();
String sqlProduto = " Select * From Produto Where Produto.Id = @Id ";
SqlCommand cmdProduto = new SqlCommand(sqlProduto, conn);
cmdProduto.Parameters.AddWithValue("@Id", Id);
SqlDataAdapter da = new SqlDataAdapter();
da.SelectCommand = cmdProduto;
DataSet ds = new DataSet();
da.Fill(ds);
return ds.Tables[0];
}
5.15Os mtodos RetornaProduto sobrecarregados e o mtodo RetornaMovimento, no sero comentados j que
so semelhantes ao mtodo anterior, devidamente comentado e explicado.
public DataTable RetornaProduto(string Descricao)
{
SqlConnection conn = new SqlConnection(strconn);
conn.Open();
String sqlMovimento = " Select * From Produto Where Produto.Descricao Like @Descricao ";
SqlCommand cmdMovimento = new SqlCommand(sqlMovimento, conn);
cmdMovimento.Parameters.AddWithValue("@Descricao", Descricao + "%");
SqlDataAdapter da = new SqlDataAdapter();
da.SelectCommand = cmdMovimento;
DataSet ds = new DataSet();
da.Fill(ds);
return ds.Tables[0];
}
public DataTable RetornaProduto(Decimal Preco)
{
SqlConnection conn = new SqlConnection(strconn);
conn.Open();
String sqlProduto = " Select * From Produto Where Produto.Preco >= @Preco";
SqlCommand cmdProduto = new SqlCommand(sqlProduto, conn);
cmdProduto.Parameters.AddWithValue("@Preco", Preco);
SqlDataAdapter da = new SqlDataAdapter();
da.SelectCommand = cmdProduto;
DataSet ds = new DataSet();
da.Fill(ds);
return ds.Tables[0];
}
Apostila de C# e ASP.Net
92 de 168
Apostila de C# e ASP.Net
Cdigo Fonte da Classe Movimento (Model)
using
using
using
using
System;
System.Collections.Generic;
System.Linq;
System.Text;
namespace NameSpaceSQL
{
public class Movimento
{
private long _id;
private long _produtoId;
private long _tipo_movimentoid;
private DateTime _data;
private Decimal _quantidade;
private Decimal _valor;
public Movimento() { }
public long Id
{
get { return _id; }
set { _id = value; }
}
public long ProdutoId
{
get { return _produtoId; }
set { _produtoId = value; }
}
public long Tipo_movimentoid
{
get { return _tipo_movimentoid; }
set { _tipo_movimentoid = value; }
}
public DateTime Data
{
get { return _data; }
set { _data = value; }
}
public Decimal Quantidade
{
get { return _quantidade; }
set { _quantidade = value; }
}
public Decimal Valor
{
get { return _valor; }
set { _valor = value; }
}
}
}
93 de 168
Apostila de C# e ASP.Net
Cdigo Fonte da Classe ListaMovimento (Model)
using
using
using
using
System;
System.Collections.Generic;
System.Linq;
System.Text;
namespace NameSpaceSQL
{
public class ListaMovimento
{
public ListaMovimento()
{
}
public ListaMovimento(
long Id, long ProdutoId,
long Tipo_movimentoid,
DateTime Data,
Decimal Quantidade,
Decimal Valor,
string Descricao_Movimento,
string Descricao_Produto)
{
}
private
private
private
private
private
private
private
private
long _id;
long _produtoId;
long _tipo_movimentoid;
Decimal _quantidade;
DateTime _data;
Decimal _valor;
string _Descricao_Movimento;
string _Descricao_Produto;
public long Id
{
get { return _id; }
set { _id = value; }
}
public long ProdutoId
{
get { return _produtoId; }
set { _produtoId = value; }
}
public long Tipo_movimentoid
{
get { return _tipo_movimentoid; }
set { _tipo_movimentoid = value; }
}
94 de 168
Apostila de C# e ASP.Net
public DateTime Data
{
get { return _data; }
set { _data = value; }
}
public Decimal Quantidade
{
get { return _quantidade; }
set { _quantidade = value; }
}
public Decimal Valor
{
get { return _valor; }
set { _valor = value; }
}
public string Descricao_Movimento
{
get { return _Descricao_Movimento; }
set { _Descricao_Movimento = value; }
}
public string Descricao_Produto
{
get { return _Descricao_Produto; }
set { _Descricao_Produto = value; }
}
}
}
95 de 168
Apostila de C# e ASP.Net
Cdigo Fonte da Classe ClasseErro
using
using
using
using
System;
System.Collections.Generic;
System.Linq;
System.Text;
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 <<<.";
}
}
}
}
96 de 168
Apostila de C# e ASP.Net
97 de 168
Figura 01
2- Inicialmente a janela Soluction Explore dever ficar como o exibido na figura 02.
Figura 02
3- D um duplo clique sobre Default.aspx na rvore da Soluction Explore visualizando a pgina no modo Design.
A rea de aderncia agora pode receber controles para compor a pgina. Clique na aba que define o modo Source
observando o cdigo resltante.
Apostila de C# e ASP.Net
98 de 168
Figura 03
4- Visando ter um modelo que sirva de base para todas as pginas de nosso projeto, vamos adicionar agora uma
Master Page. Clique sob o n raiz do projeto escolhendo Add New Item escolhedo o Template Master Page. A
figura 04 nos orienta neste sentido. Observe ainda o cdigo fonte (aba Source) resultante.
Figura 04
<%@ Master Language="C#" AutoEventWireup="true" CodeFile="PaginaPadrao.master.cs"
Inherits="PaginaPadrao" %>
<!DOCTYPE html PUBLIC
"-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title>Untitled Page</title>
<asp:ContentPlaceHolder id="head" runat="server"> </asp:ContentPlaceHolder>
</head>
<body>
<form id="form1" runat="server">
<div>
<asp:ContentPlaceHolder id="ContentPlaceHolder1" runat="server">
</asp:ContentPlaceHolder>
</div>
</form>
</body>
</html>
Apostila de C# e ASP.Net
99 de 168
5- Adicione os diretrios Css, Img e Js contendo respectivamente o arquivo de folha de estilo, as imagens a serem
aplicadas ao projeto, e por fim, o arquivo contendo as intrues JavaScript. Conforme demonstrado na figura 05
clique em Refresh Folder para que a janela Soluction Explore possa refletir a nova estrutura de diretrios.
Figura 05
Figura 06
6- Aplique sob a pgina Master Page um controle Image oriundo da janela Tool Box, configurando a propriedade
ImageURL conforme figuras 07 e 08.
Figura 07
Apostila de C# e ASP.Net
100 de 168
Figura 08
7- Observe, clicando na aba source da pgina, o cdigo fonte resultante. Especial ateno a tag Image e suas
propriedades descita no cdigo fonte da pgina.
Atente tambm para o resultado visual da pgina Master Page.
<%@ Master Language="C#" AutoEventWireup="true" CodeFile="PaginaPadrao.master.cs"
Inherits="PaginaPadrao" %>
//. . . Cdigo omitido aqui
<asp:ContentPlaceHolder
id="head"
runat="server">
</asp:ContentPlaceHolder>
</head>
<body>
<form id="form1" runat="server">
<div align="center">
<div style="position: relative; width: 800px; height:100px">
<asp:Image
ID="ImageTopo" runat="server"
Height="80px" Width="800px"
ImageUrl="~/Img/CabecaCursoCSharp.gif"
style="z-index: 1;
left: 0px; top: 0px;
position: relative;
border: 1px solid #808080;"
/>
<asp:ContentPlaceHolder id="ContentPlaceHolder1" runat="server">
</asp:ContentPlaceHolder>
</div>
</div>
</form>
</body>
</html>
Apostila de C# e ASP.Net
101 de 168
Figura 09
8- Adicione uma nova pgina ao projeto definindo seu nome como Index.apsx. Para tanto, clicando no boto
direito do mouse sob o n raiz do projeto escolhendo Add New Item. Repare neste caso, o checkbox Select
master page assinulado, gerando a caixa de dialogo representada pela figura 11. Nesta, selecione uma Master
Page para servir de Template para a pgina Index.
Figura 10
Figura 11
Apostila de C# e ASP.Net
102 de 168
9- Adicione um controle Menu oriundo da caixa de dialogo ToolBox Navigation. Utilize o Munu Tasks localizado
na parte superior esquerda na forma de uma seta, selecionando a opo Edit Menu Items..., representada pela
figura 12. Adicione menus e itens de menu conforme ilustrado na sequncia representada pelas figuras 12, 13, 14,
15, 16 e 17.
Figura 12
Figura 13
Figura 14
Apostila de C# e ASP.Net
Figura 15
Figura 16
Figura 17
103 de 168
Apostila de C# e ASP.Net
104 de 168
10- Agora acresscente a tag Div antes da tag Menu, conforme listagem parcial do cdigo fonte da pgina Index
provendo a configurao que colocar o objeto Menu centralizado na pgina.
<div align="center"
style="border: 1px solid #808080;
width: 800px;
height:500px">
<asp:Menu ID="MenuSistema" runat="server" BackColor="#B5C7DE"
DynamicHorizontalOffset="2" Font-Names="Verdana" Font-Size="0.8em"
ForeColor="#284E98" Orientation="Horizontal" StaticSubMenuIndent="10px"
style="margin-left: 0px" Width="800px">
<StaticSelectedStyle BackColor="#507CD1" />
<StaticMenuItemStyle HorizontalPadding="5px" VerticalPadding="2px" />
<DynamicHoverStyle BackColor="#284E98" ForeColor="White" />
<DynamicMenuStyle BackColor="#B5C7DE" />
<DynamicSelectedStyle BackColor="#507CD1" />
<DynamicMenuItemStyle HorizontalPadding="5px" VerticalPadding="2px" />
<StaticHoverStyle BackColor="#284E98" ForeColor="White" />
<Items>
<asp:MenuItem Text="Cadastro" Value="Cadastro">
<asp:MenuItem Text="Produtos" Value="Produtos"></asp:MenuItem>
<asp:MenuItem Text="Pedidos" Value="Pedidos"></asp:MenuItem>
<asp:MenuItem Text="Clientes" Value="Clientes"></asp:MenuItem>
</asp:MenuItem>
<asp:MenuItem Text="Relatrios" Value="Relatrios">
<asp:MenuItem Text="Lista de Produtos" Value="Lista de Produtos">
</asp:MenuItem>
<asp:MenuItem Text="Movimentos" Value="Movimentos">
</asp:MenuItem>
</asp:MenuItem>
<asp:MenuItem Text="Utilitrios" Value="Utilitrios">
<asp:MenuItem Text="Envio de Email" Value="Envio de Email">
</asp:MenuItem>
</asp:MenuItem>
</Items>
</asp:Menu>
11- Execute o projeto neste momento, acionando o menu Debug Start Debugging, observando seu
funcionamento conforme imagem da figura 18.
Figura 18
Apostila de C# e ASP.Net
105 de 168
12- Conforme j orientado em passos anteriores, adicione mais uma pgina aspx, tendo como Template a pgina
Master Page denominada PaginaPadrao. Se orientando pelo design representado pela figura 19 e pela listagem
abaixo aplique e configure propriedades para os controles definidos na listagem do cdigo fonte da pgina
CadastroProduto.aspx.
Figura 19
<%@ Page Language="C#" MasterPageFile="~/PaginaPadrao.master" AutoEventWireup="true"
CodeFile="CadastroProduto.aspx.cs" Inherits="CadastroProduto" Title="Untitled Page" %>
<asp:Content ID="Content1" ContentPlaceHolderID="head" Runat="Server"> </asp:Content>
<asp:Content ID="Content2" ContentPlaceHolderID="ContentPlaceHolder1" Runat="Server">
<div align="center" style="border: 1px solid #808080; width: 800px; height:470px">
<asp:Label ID="LabelTituloPagina" runat="server" Text="CADASTRO DE PRODUTOS"
style="z-index: 1; left: 0px; top: 80px; position: absolute; width: 800px; text-align: center"
</asp:Label>
<asp:Label ID="LabelDescricao" runat="server" Text="Descrio do Produto"
style="z-index: 1; left: 50px; top: 180px; position: absolute; width: 200px; text-align: left"
</asp:Label>
<asp:TextBox ID="TextBoxDescricao" runat="server"
style="z-index: 1; left: 50px; top: 200px; position: absolute; width: 350px;"
</asp:TextBox>
<asp:Label ID="LabelPreco" runat="server" Text="Preo do Produto"
style="z-index: 1; left: 50px; top: 260px; position: absolute; width: 200px; text-align: left"
</asp:Label>
<asp:TextBox ID="TextBoxPreco" runat="server"
style="z-index: 1; left: 50px; top: 280px; position: absolute; width: 150px;"
</asp:TextBox>
<asp:Button ID="ButtonCancelar" runat="server"
style="z-index: 1; left: 50px; top: 370px; position: absolute; width: 100; height: 25px"
Text="Cancelar" />
<asp:Button ID="ButtonConfirmar" runat="server"
style="z-index: 1; left: 150px; top: 370px; position: absolute; width: 100; height: 25px"
Text="Confirmar" />
<asp:Label ID="LabelErro" runat="server"
style="z-index: 1; left: 0px; top: 530px; position: absolute; width: 800px; text-align: center" >
</asp:Label>
</div>
</asp:Content>
Apostila de C# e ASP.Net
106 de 168
Nota: Vale ressaltar a tag Div, novamente aqui sendo configurada para centralizar os controles nela
acomodada. Note tambm a propriedade position: absolute definida como propriedade de style para todos os
componentes internos a Tag Div. Isso proporciona que todos os controles obedecero suas posies
definidas pelas propriedades top e left, mas com relao a margem esquerda da Tag Divi e no do browser
que hora ir exibi-los.
13- Crie agora respectivamente as pginas ConsultaProduto.aspx e ConsultaMovimento.aspx. Tomo por base as
imagens das figuras 20 e 21. Os detalhes sobre a configurao dos controles destas pginas podem ser
observados nas listagens de cdigo fonte que seguem as imagens. As notas referentes a pgina aspx anterior
valem para essas.
Figura 20
<div align="center" style="border: 1px solid #808080; width: 800px; height:450px">
<asp:Label ID="LabelTituloPagina" runat="server" Text="CONSULTA DE MOVIMENTOS"
style="z-index: 1; left: 0px; top: 80px; position: absolute;
width: 800px; text-align: center" >
</asp:Label>
<asp:Label ID="LabelDescricaoProduto" runat="server" Text="Descrio"
style="z-index: 1; left: 20px; top: 150px; position: absolute; width: 70px;" >
</asp:Label>
<asp:Label ID="LabelPeriodo" runat="server" Text="Perodo"
style="z-index: 1; left: 300px; top: 150px; position: absolute" >
</asp:Label>
<asp:Label ID="LabelEntreData" runat="server" Text=""
style="z-index: 1; left: 410px; top: 170px; position: absolute; width: 11px;" >
</asp:Label>
<asp:TextBox ID="TextBoxDescricaoProduto" runat="server"
style="z-index: 1; left: 20px; top: 170px; position: absolute; width: 250px;" >
</asp:TextBox>
<asp:TextBox ID="TextBoxDataIni" runat="server"
style="z-index: 1; left: 300px; top: 170px; position: absolute; width: 100px;" >
</asp:TextBox>
Apostila de C# e ASP.Net
107 de 168
Apostila de C# e ASP.Net
108 de 168
Figura 21
<div align="center" style="border: 1px solid #808080; width: 800px; height:450px">
<asp:Label ID="LabelTituloPagina" runat="server" Text="CONSULTA DE MOVIMENTOS"
style="z-index: 1; left: 0px; top: 100px; position: absolute;
width: 800px; text-align: center">
</asp:Label>
<asp:Label ID="LabelDescricaoProduto" runat="server" Text="Descrio"
style="z-index: 1; left: 40px; top: 150px; position: absolute">
</asp:Label>
<asp:Label ID="LabelPeriodo" runat="server" Text="Perodo"
style="z-index: 1; left: 320px; top: 150px; position: absolute">
</asp:Label>
<asp:Label ID="LabelEntreData" runat="server" Text=""
style="z-index: 1; left: 430px; top: 170px; position: absolute">
</asp:Label>
<asp:TextBox ID="TextBoxDescricaoProduto" runat="server"
style="z-index: 1; left: 40px; top: 170px; position: absolute; width: 250px;">
</asp:TextBox>
<asp:TextBox ID="TextBoxDataIni" runat="server"
style="z-index: 1; left: 320px; top: 170px; position: absolute; width: 100px;">
</asp:TextBox>
<asp:TextBox ID="TextBoxDataFin" runat="server"
style="z-index: 1; left: 450px; top: 170px; position: absolute; width: 100px;">
</asp:TextBox>
<asp:Button ID="ButtonPesquisar" runat="server"
style="z-index: 1; left: 580px; top: 165px; position: absolute;
width: 80px;" Text="Pesquisar" />
<asp:Button ID="ButtonVoltar" runat="server"
style="z-index: 1; left: 680px; top: 165px; position: absolute;
width: 80px;" Text="Votar" />
<asp:GridView ID="GridView1" runat="server"
style="z-index: 1; left: 1px; top: 240px; position: absolute;
height: 90px; width: 798px">
</asp:GridView>
</div>
Apostila de C# e ASP.Net
109 de 168
14- Neste ponto iremos retornar a pgina Index, selecionando o Menu Task do controle Menu selecionando a
opo Edit Menu Items..., conforme imagem da figura 22.
Figura 22
15- Conforme observado na figura 23, selecione o item de menu Produtos definindo sua propriedade NavigateUrl
para chamar a pgina ConsultaProduto.aspx.
Figura 23
16- Objetivando definir a prieira pgina a ser exibida quando da execuo do projeto, com o boto direito do
mouse sobre o diretrio raiz do projeto, selecione no menu de contexto a opo Start Options..., e em seguida
proceda conforme observado nas figuras 24, 25 e 26.
Figura 24
Apostila de C# e ASP.Net
110 de 168
Figura 25
Figura 26
17- Teste a execuo da pgina ConsultaProduto.aspx, a partir da execuo do menu da pgina Index. Veja a
figura 27 que ilustra este tpico.
Figura 27
18- O fraguimento de cdigo abaixo o contedo do arquivo de Folha de Estilo denominado Estilo.css que servir
para configurar os aspectos visuais dos controles de nossa pgina. Numa etapa a seguir aplicaremos esses estilos
aos controles do projeto.
.Botao {
font-family: verdana,helvetica;
font-size: 11px;
font-weight: bold;
color:#004080;
background-color: #DAD7CF;
}
Apostila de C# e ASP.Net
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.
<link href="\css\estilo.css" type="text/css" rel="stylesheet" />
20- Aplique estilo aos controles Label, TextBox e Button da pgina CadastroProduto, em modo Design,
procedendo da seguinte forma:
20.1 Selecione o label com a propriedade text definida como Descrio do Produto, e em sua propriedade
(precione F4 caso a caixa de dialogo Properties no esteja sendo exibida) CssClass escolhendo a Classe
LabelText conforme ilustrado nas figuras 28 e 29..
Apostila de C# e ASP.Net
Figura 28
112 de 168
Figura 29
20.2 Aplique o mesmo para os controles TextBox e Button, escolhendo respectivamente as Classes
CaixaTexto e Botao. Por fim veja o resultado refletido na pgina CadastroProduto.aspx conforme figura 30.
Figura 30
20.3 Proceda assim para todos os formulrio do projeto, e aproveite para alterar algumas Classes da
Folha de Estilo para ver o efeito.
Apostila de C# e ASP.Net
113 de 168
21- Como ajuste final, visando corrigir incompatibilidade em algumas funcionalidades em alguns browsers, aplique
os trechos de cdigo abaixo conforme orientao.
21.1 A tag abaixo deve ser aplicada dentro da Tag Head da Master Page.
<style type="text/css">
.adjustedZIndex{z-index: 1; }
</style>
21.2 Deve ser aplicado como propriedade de Style do objeto Menu na pgina Master Page.
DynamicMenuStyle BackColor="#B5C7DE" CssClass="adjustedZIndex"/>
21.3 Aplicado ao evento Page_PreInit da Master Page.
protected void Page_PreInit(object sender, EventArgs e)
{
if (Page.Request.ServerVariables["http_user_agent"].ToLower().Contains("safari"))
{
Page.ClientTarget = "uplevel";
}
}
22- Adicione o fraguimento de cdigo descrito abaixo dentro da Tag Head da Master Page, para podermos utilizar
funes de JavaScript em nossas pginas. Veja no Anexo 1 desta apostila uma abordagem mais prounda sobre
JavaScript e sua aplicao em pginas aspx.
<script
language="javascript"
type="text/javascript"
src="JS/FuncoesJavaScript.js">
</script>
22- Aplicando funes JavaScript a controles do projeto
22.1- Primeiro iremos criar um arquivo contendo funes JavaScript (ver listagem abaixo), na sequncia
referenci-lo em nossas pginas ou na pagina Mestre do projeto. Desta forma, poderemos fazer uso das
referidas funes em eventos JavaScript dos controles Asp.Net contidos em nossas pginas.
Crie um arquivo com formato texto padro, nomeando-o como FuncoesJavaScript.JS, salvando-o no diretrio
JS do projeto web. O cdigo do contedo do arquivo em questo exibido na listagem 01.
function FormataData(input)
{
if (input.value.length==10)
{
event.keyCode=0;
}
var tecla = event.keyCode;
if (tecla > 47 && tecla < 58){
input.value=input.value;
}
else
{
event.keyCode=0;
}
Apostila de C# e ASP.Net
if ((input.value.length==2)||(input.value.length==5))
{
input.value=input.value + "/" ;
}
}
function SomenteNumeros(input)
{
var tecla = event.keyCode;
if (tecla > 47 && tecla < 58){
input.value=input.value;
}
else
{
event.keyCode=0;
}
}
function Formatar(src, mask)
{
var i = src.value.length;
var saida = mask.substring(0,1);
var texto = mask.substring(i)
if (texto.substring(0,1) != saida)
{
src.value += texto.substring(0,1);
}
}
function FormatarCnpj(src, mask)
{
if (src.value.length==18)
{
event.keyCode=0;
}
var tecla = event.keyCode;
if (tecla > 47 && tecla < 58){
src.value=src.value;
}
else
{
event.keyCode=0;
}
var i = src.value.length;
var saida = mask.substring(0,1);
var texto = mask.substring(i)
if (texto.substring(0,1) != saida)
{
src.value += texto.substring(0,1);
}
}
114 de 168
Apostila de C# e ASP.Net
115 de 168
22.2- Outra maneira de injetar referncia a mtodos de JavaScript a controles de Asp.Net, utilizando a
propriedade Attributes de um controle, usando o mtodo Add do mesmo para acrescentar chamada a uma
funo JavaScript. No exemplo abaixo, ser acrescentado ao controle no lado Client-Side o uso da funo
FormataData quando ocorrer o evento onKeypress de java excript para os controles TextBoxDataIni e
TextBoxDataFin. O evento da pgina ideal para codificar o proposto no pargrafo anterior Page_Load,
pois assim, ao carregar da pgina o fraguimento de cdigo renderizado no lado Client-Side (Browser).
protected void Page_Load(object sender, EventArgs e)
{
TextBoxDataIni.Attributes.Add("onkeypress", "return FormataData(this);");
TextBoxDataFin.Attributes.Add("onkeypress", "return FormataData(this);");
}
22.3- No formulrio (ou pgina se preferir) Index.Aspx, acione o Menu Task do controle Menu conforme
Figura 31 clicando em Edit Menu Items. Emseguida selecione o item Movimentos atribuindo a propriedade
NavigateUrl o formulrio ConsultaMovimento.Aspx. As Figuras 32 e 33 ilustram estes passos.
Figura 31
Figura 32
Apostila de C# e ASP.Net
116 de 168
Figura 33
22.4- Execute o site, testando a funo JavaScript conforme ilustrado na Figura 34 representando o
formulrio ConsultaMovimento.Aspx em execuo.
Figura 34
22.5- Por fim, estude tambm o contedo do Anexo 2 desta apostila, que trata de uma outra forma de formatar
controles de Aspx com a adoo de Expresses Regulares.
Apostila de C# e ASP.Net
117 de 168
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
5- Declaraes (referncias as NameSpaces necessrias ao cfigo fonte do projeto.)
using
using
using
using
using
using
using
using
System;
System.Data;
System.Configuration;
System.Linq;
System.Web;
System.Web.Security;
System.Web.UI;
System.Web.UI.HtmlControls;
Apostila de C# e ASP.Net
using
using
using
using
using
using
119 de 168
System.Web.UI.WebControls;
System.Web.UI.WebControls.WebParts;
System.Xml.Linq;
System.Data;
System.Collections.Generic;
System.Collections.ObjectModel;
public
public
public
public
public
public
long Id;
string Descricao;
decimal Preco;
long OldId;
string OldDescricao;
decimal OldPreco;
8- Mtodo que retorna um DataTable (collection) contendo um registro da tabela Produo baseado na chave primria passada
como parmetro. Tambm preenche os campos pblicos que representam o registro produto.
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.
Apostila de C# e ASP.Net
120 de 168
10- Mtodo que encapsula o mtodo RetornaProduto da Classe Produto, sobrecarregado pelo parmetro string, que retorna um
DataTable contendo uma lista de registros da tabela Produto
Produto.Id = Produto.RetornaChave("ID_PRODUTO");
12.3 Preenche os campos Descricao e Preco, da instncia de Produto com os valores obtidos pelos parmetros do
mtodo InserirProdutoMovimento.
Produto.Descricao = Descricao;
Produto.Preco = Preco;
12.4 Identico ao item 13.2, mas para o campo Id da instncia de Movimento.
Movimento.Id = Produto.RetornaChave("ID_MOVIMENTO");
12.5 Preenche o restante dos campos da instncia de Movimento. So valores arbitrados para concluso do exemplo.
Movimento.ProdutoId = Produto.Id;
Movimento.Tipo_movimentoid = 1;
Movimento.Quantidade = 0;
Movimento.Valor = 0;
Movimento.Data = DateTime.Now.Date;
Produto.Movimento.Add(Movimento);
13.6 Finalizado a lgica do mtodo, invoca a execuo do mtodo de negcio InserirProdutoMovimento, que retorna
uma string contendo a mensagem de erro caso ocorram. Por fim encerra o bloco de cdigo do mtodo.
return Produto.InserirProdutoMovimento();
}
Apostila de C# e ASP.Net
121 de 168
15- Mtodo que encapsula a chamda ao mtodo AlterarProduto da Classe Produto. Repare os parmetros OldId,
OldDescricao e OldPreco, que servem para serem referenciados na clusula Where da instruo Update. Assim,
temos garantia de execuo da instruo Update na condio de Concorrncia Otimista.
Este mtodo tambm retorna uma string com a mensagem de eero, retornado pelo mtodo subjacente caso
exista.
public string AlterarProduto( string Descricao,
decimal Preco,
long OldId,
string OldDescricao,
decimal OldPreco
)
{
Produto.Descricao = Descricao;
Produto.Preco = Preco;
Produto.OldId = OldId;
Produto.OldDescricao = OldDescricao;
Produto.OldPreco = OldPreco;
return Produto.AlterarProduto();
}
16- O mesmo que o item anterior sendo que para a excluso de Produto.
public string ExcluirProduto( long OldId,
string OldDescricao,
decimal OldPreco
)
{
bool Sucesso = false;
Produto.OldId = OldId;
Produto.OldDescricao = OldDescricao;
Produto.OldPreco = OldPreco;
return Produto.ExcluirProduto();
}
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
7.5.2 Finalizando, na propriedade DataSourceID, remova a referncia ao ObjectDataSource1, que a
partir deste momento no mais tem importncia, j que como informado, s tem utilidade para
configurarmos o GridView em tempo de projeto. Responda No para caixa de dialogo da figura 16 para
no perder a configurao de colunas at aqui alcanada.
Remova tambm a Tag ObjectDataSource no cdigo fonte da pgina (listado a aprtir da imagem da
figura 16). Para tanto, saia do modo Design e clique na aba Source da pgina ConsultaProduto
Figura 16
<asp:ObjectDataSource ID="ObjectDataSource1" runat="server"
SelectMethod="ModeloProduto" TypeName="ProdutoController_SQL">
</asp:ObjectDataSource>
Apostila de C# e ASP.Net
128 de 168
2- Procedimento para o evento Click do objeto ButtonPesquisar. Primeiro preenchido a propriedade DataSource
do GridView com dados retornados do mtodo ObterProduto da classe ProdutoController. Repare o valor da
propriedade Text do controle TextBoxDescricaoProduto passado com o parmetro.
Por fim, aplicado o mtodo DataBind (funciona como um Refresh) para o controle GridView, para que os dados
retornado pelo mtodo ObterProduto possam ser exibidos.
protected void ButtonPesquisar_Click(object sender, EventArgs e)
{
GridViewProdutos.DataSource = Prod.ObterProduto(TextBoxDescricaoProduto.Text);
GridViewProdutos.DataBind();
}
3- O cdigo acionado para o evento Click do objeto ButtonIncluir implementa:
protected void ButtonIncluir_Click(object sender, EventArgs e)
{
3.1 - Atribui para varivel PaginaRetorno, do tipo Session, o nome da pgina aspx ConsultaProduto. Esta
varivel pode ser acessada por outra pgina dentro da seo, possibilitando a lgica desta pgina utiliza-la
como parmetro para um possvel mtodo de retorno (navegabilidade) de pgina.
Session["PaginaRetorno"] = "ConsultaProduto.aspx";
3.2 Define o valor da varivel Operao, do tipo Session. Esta varivel servir de Flag para o processo de
manuteno de Produto, na pgina aspx CadastroProduto.
Session["Operacao"] = "Incluir";
3.3 Usando o objeto Response, redireciona (mtodo Redirect) o fluxo para a pgina aspx CadastroProduto.
Response.Redirect("CadastroProduto.aspx");
3.4 Encerra o bloco de cdigo do procedimento ButtonIncluir_Click.
}
Apostila de C# e ASP.Net
129 de 168
Apostila de C# e ASP.Net
130 de 168
2.1 Preenche a varivel de seo OldProduto com o DataTable resultante do mtodo GetProduto.
Session["OldProduto"] = Produto.GetProduto(Convert.ToInt64(Session["PKProduto"]));
2.2 Preenche a propriedade Text do objeto TextBoxDescricao com o campo Descricao do objeto Produto. Este
objeto foi carregado com o registro obtido pelo mtodo GetProduto junto ao mtodo subjacente na Classe
Produto da NameSpaceSQL.
TextBoxDescricao.Text = Produto.Descricao;
2.3 O memso que o item anterior, mas para o objeto TextBoxPreco. Repare a funo ToString da Classe Convert
ajustando o valor do campo Preco de Produto que do tipo Decimal (ponto flutuante).
TextBoxPreco.Text = Convert.ToString(Produto.Preco);
2.4 Encerram respectivamente a funo If e o bloco do procedimento Page_Load.
}
3- Procedimento referente ao evento Click do objeto ButtonConfirmar. Comentando:
3.1- Declarao do procedimento e inio do bloco do procedimento.
protected void ButtonConfirmar_Click(object sender, EventArgs e)
{
3.2- Estrutura If veificando se a varivel de seo Operacao igual a Incluir. Se for, executa o mtodo
InserirProdutoMovimento (que mapeia o mesmo mtodo na camada Model Produto) retornando a mensagem
de erro (se houver) para varvel de classe MsgErro.
if (Session["Operacao"].Equals("Incluir"))
{
MsgErro = Produto.InserirProdutoMovimento(TextBoxDescricao.Text,
decimal.Parse(TextBoxPreco.Text));
}
Apostila de C# e ASP.Net
131 de 168
3.3- Verifica em else if (primeira condio else da estrutura If) se Operacao igual a Alterar. Sendo, passa
para o mtodo SetOld (seu parmetro tipo DataTable) da instncia de ProdutoController o contedo da
varivel de escopo Session, convertendo-o para um tipo DataTable.
O mtodo SetOldProduto armazena nos campos pblicos da Classe ProdutoController relativo aos campos que
sero utilizados na chamada ao mtodo AlterarProduto, que encapsulando o mesmo mtodo na Classe
Produto, utilizar para os parmetros da clusula Where do comando Update.
Em seguida chama o Mtodo AlterarProduto passando os devidos valores para seus parmetros. Aqui,
novamente, atribuido para varivel MsgErro, a mensagem de erro resultante da execuo do mtodo caso
exista.
else if (Session["Operacao"].Equals("Alterar"))
{
Produto.SetOldProduto((DataTable)Session["OldProduto"]);
MsgErro = Produto.AlterarProduto(TextBoxDescricao.Text,
decimal.Parse(TextBoxPreco.Text),
Produto.OldId,
Produto.OldDescricao,
Produto.OldPreco);
}
3.4- O mesmo que o item 3.3, mas para operao de excluso.
else if (Session["Operacao"].Equals("Excluir"))
{
Produto.SetOldProduto((DataTable)Session["OldProduto"]);
MsgErro = Produto.ExcluirProduto(Produto.OldId,
Produto.OldDescricao,
Produto.OldPreco);
}
3.5- Atribui a propriedade Text do controle LabelErro, o valor da varivel MsgErro. Este controle exibe por
intermdio de sua propriedade Text, na parte inferior da pgina a mensagem de erro resultante da execuo
dos mtodos de negcio.
LabelErro.Text = MsgErro;
MsgErro = "";
}
4- Utilizando como parmetro o valor da varivel de seo PaginaRetorno, invoca o mtodo Redirect do objeto
Response para orientar o fluxo para o formulrio ConsultaProduto, neste caso.
protected void ButtonCancelar_Click(object sender, EventArgs e)
{
Response.Redirect(Session["PaginaRetorno"].ToString());
}
5- Encerra o bloco de cdigo da Classe CadastroProduto.
}
Apostila de C# e ASP.Net
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 descrevese os principais mecanismos de segurana.
Apostila de C# e ASP.Net
135 de 168
SSL
O SSL (Secure Socket Layer) [Netscape 1996] quando aplicado a pequenos dispositivos oferece autenticao,
integridade de dados e privacidade de servios. Atualmente, a soluo para enviar informao confidencial para
Web Services utilizar um mecanismo de segurana SSL sobre HTTP tambm conhecido como HTTPS (Hypertext
Transfer Protocol Secure). Este mecanismo protege informaes confidenciais e fcil de ser configurado. Tem
como desvantagem ser mais lento do que as transaces HTTP no encriptadas pelo que no adequado para
taxas de transferncias de dados elevadas.
XML SIGNATURE
A XML Signature [IETF e W3C 2000] uma iniciativa conjunta da IETF (Internet Engineering Task Force) e do
W3C para especificar uma sintaxe XML e regras de processamento para criao e representao digital de
assinaturas. As vantagens na utilizao da XML Signature, ao contrrio de outras normas de assinaturas digitais,
esto baseadas na independncia da linguagem de programao, fcil interpretao humana e independncia do
fabricante. Esta tecnologia tambm permite assinar digitalmente subconjuntos de um documento XML.
XML ENCRYPTION
A XML Encryption [IETF e W3C 2002] especifica um processo para encriptao de dados e sua representao em
formato XML. Os dados podem ser dados arbitrrios (incluindo um documento XML), elementos XML ou contedos
de elementos XML. Um documento XML que utiliza a XML Encryption pode ser visto por qualquer utilizador, mas
apenas o proprietrio da chave de descodificao conseguir compreender o contedo codificado.
WS-SECURITY
O WS-Security (Web Services Security) uma iniciativa conjunta de empresas como Microsoft, IBM e Verisign
destinada ao uso da XML-Signature e da XML-Encryption para fornecer segurana s mensagens SOAP. O WSSecurity um esforo destinado a fazer com que os Web Services trabalhem melhor em um ambiente global. O
WS-Security tambm inclui alguns importantes componentes como encaminhamento, confiana e tratamento de
transaes.
SAML
O SAML (Security Assertion Markup Language) [OASIS 2001] uma norma emergente para a troca de informao
sobre autenticao e autorizao. O SAML soluciona um importante problema para as aplicaes da prxima
gerao, que a possibilidade de utilizadores transportarem seus direitos entre diferentes Web Services. Isto
importante para aplicaes que tencionam integrar um nmero de Web Services para formar uma aplicao
unificada.
Limitaes associados aos Web Services
Apesar da sua grande popularidade e relativa simplicidade, o SOAP tem vrias limitaes, que por sua vez os Web
Services tambm sofrem essas limitaes pois utilizam o SOAP. As limitaes so descritas em seguida:
Segurana e privacidade nenhuma das verses do SOAP define qualquer tipo de segurana. Isto devido ao
SOAP utilizar HTTP, mas para implementar mecanismos de segurana ao nvel da rede pode utilizar o protocolo
SSL no HTTP (tambm conhecido como HTTPS) para garantir a confidencialidade, a integridade e a autenticao
do cliente, do servidor e da comunicao cifrada. Como no existe um suporte para segurana, que inclui a
privacidade, nas normas que compem os Web Services, tem levado cada projeto a procurar diferentes solues
para resolver o problema da segurana o que se torna incompatvel com a promessa de implementar uma
normalizao a nvel global.
Mensagens e encaminhamento para suportar as funcionalidades das mensagens assncronas tradicionais
Qualidade de servio e fiabilidade para garantir tempos de resposta e detectar excepes
Processamento transaccional para suportar comunicao transaccional, para associar essa comunicao
transaccional com as transaces locais e para participar em transaces distribudas
Gesto para controlar o estado e comportamento dos Web Services
Desempenho para optimizar a execuo dos Web Services que tem implicaes ao nvel do desenho das
aplicaes, chamadas remotas, caractersticas da rede e armazenamento/processamento dos documentos
Interoperabilidade suportar a interoperao sem problemas o grande objetivo dos Web Services e do SOAP,
ou seja, fornecerem uma plataforma de integrao entre aplicaes e diferentes linguagens e implementados em
qualquer sistema operativo. Assim esta tecnologia seria uma tecnologia normalizada mas, no entanto, existem
rivalidades entre fornecedores. Por exemplo, o AXIS (implementao SOAP do projeto Apache) no compatvel
com .Net da Microsoft, por isso gera interfaces em dois formatos, uma para consumo prprio e outra diferente
para o .Net ser compatvel com o Axis.
Para resolver este problema existe vrias abordagens para resolver este problema como o SOAPBuilders
Interoperability Lab que fornece uma plataforma para testar a interoperabilidade dos produtos.
Apostila de C# e ASP.Net
136 de 168
Integrao de sistemas
Muitos consideram que os Web services corrigem um grande problema da informtica: a falta de integrao de
sistemas.
Os Web services permitem que a integrao de sistemas seja realizada de maneira compreensvel, reutilizvel e
padronizada.
uma tentativa de organizar um cenrio cercado por uma grande variedade de diferentes aplicativos,
fornecedores e plataformas.
O futuro dos Web Services
Acredita-se que no futuro as empresas iro listar seus Web services em diretrios pblicos (UDDI), de onde
podero ser vendidos como servios para outras empresas, instituies ou usurios comuns...
Tecnologias Utilizadas
Para a representao e estruturao dos dados nas mensagens recebidas/enviadas utilizado o XML (eXtensible
Markup Language). As chamadas s operaes, incluindo os parmetros de entrada/sada, so codificadas no
protocolo SOAP (Simple Object Access Protocol, baseado em XML). Os servios (operaes, mensagens,
parmetros, etc.) so descritos usando a linguagem WSDL (Web Services Description Language). O processo de
publicao/pesquisa/descoberta de Web Services utiliza o protocolo UDDI (Universal Description, Discovery and
Integration).
XML
Extensible Markup Language (XML) a base em que os Web Services so construdos. O XML fornece a descrio,
o armazenamento, o formato da transmisso para trocar os dados atravs dos Web Services e tambm para criar
tecnologias Web Services para a troca dos dados.
A sintaxe de XML usada nas tecnologias dos Web Services especifica como os dados so representados
genericamente, define como e com que qualidades de servio os dados so transmitidos, pormenoriza como os
servios so publicados e descobertos. Os Web Services descodificam as vrias partes de XML para interagir com
as vrias aplicaes.
SOAP
O SOAP (Simple Object Access Protocol) baseia-se numa invocao remota de um mtodo e para tal necessita de
especificar o endereo do componente, o nome do mtodo e os argumentos para esse mtodo. Estes dados so
formatados em XML com determinadas regras e enviados normalmente por HTTP para esse componente. No
define ou impe qualquer semntica, quer seja o modelo de programao, quer seja a semntica especfica da
implementao. Este aspecto extremamente importante, pois permite que quer o servio, quer o cliente que
invoca o servio sejam aplicaes desenvolvidas sobre diferentes linguagens de programao. Por esta razo, o
SOAP tornou-se uma norma aceite para se utilizar com Web Services, uma tecnologia construda com base em XML
e HTTP. Desta forma, pretende-se garantir a interoperabilidade e intercomunicao entre diferentes sistemas,
atravs da utilizao da linguagem XML e do mecanismo de transporte HTTP ou outro como, por exemplo, SMTP.
O SOAP permite que os documentos XML de envio e de recepo sobre a Web suportem um protocolo comum de
transferncia de dados para uma comunicao de rede eficaz, ou seja, o SOAP providencia o transporte de dados
para os Web Services. Em relao a Web, o SOAP um protocolo de RPC que funciona sobre HTTP (ou SMTP, ou
outro) de forma a ultrapassar as restries de segurana/firewalls normalmente impostas aos sistemas clssicos de
RPC (RMI, DCOM, CORBA/IIOP) suportando mensagens XML. Em vez de usar HTTP para pedir uma pgina HTML
para ser visualizada num browser, o SOAP envia uma mensagem de XML atravs do pedido HTTP e recebe uma
resposta, se existir, atravs da resposta do HTTP. Para assegurar corretamente a transmisso da mensagem de
XML, o servidor de HTTP, tais como Apache ou IIS (Microsoft Internet Information Server), recebe mensagens
SOAP e deve validar e compreender o formato do documento XML definido na especificao SOAP v1.1.
WSDL
a sigla de Web Services Description Language, padro baseado em XML para descrever o servio como no COM, onde
ele traz os mtodos do Web Service. Funciona como uma espcie de TypeLibrary do Web Service, alm de ser usado
para a validao das chamadas dos mtodos.
O WSDL (Web Services Description Language) uma especificao desenvolvida pelo W3C que permite descrever os
Web Services segundo um formato XML. O WSDL extensvel para permitir a descrio dos servios e suas mensagens,
independentemente dos formatos de mensagem e dos protocolos de rede que sejam usados. No entanto, comum usarse o MIME (Multipurpose Internet Mail Extensions) e o HTTP/SOAP. O WSDL descreve os servios disponibilizados rede
atravs de uma semntica XML, este providencia a documentao necessria para se chamar um sistema distribudo e o
procedimento necessrio para que esta comunicao se estabelea. Enquanto que o SOAP especifica a comunicao
entre um cliente e um servidor, o WSDL descreve os servios oferecidos.
Apostila de C# e ASP.Net
137 de 168
UDDI
Protocolo desenvolvido para a organizao e registro de Web Services.
O UDDI (Universal Description Discovery and Integration) uma iniciativa em desenvolvimento no mbito do
consrcio industrial UDDI promovido originalmente pela IBM, Microsoft e Arriba, com objetivo de acelerar a
interoperabilidade e utilizao dos Web Services, pela proposta de um servio de registo de nomes de
organizaes e de descrio do servio.
Um registro UDDI contm trs tipos de informao: informaes gerais de cada organizao, tais como o nome,
morada, telefone e contatos; informaes de organizaes e servios por categorias de negcios; informaes
tcnicas sobre os servios providenciados pelas organizaes.
O UDDI providencia trs funes principais, conhecidas como publicao, descoberta e ligao:
1) publicao: permite que uma organizao divulgue o(s) seu(s) servio(s);
2) descoberta: permite que o cliente do servio, procure e encontre um determinado servio;
3) ligao (bind): permite que o cliente do servio, possa estabelecer a ligao e interagir com o servio.
WS-I
o consrcio que garante a integrao entre os Web Services para garantir sempre que os Web Services possam
conversar entre-si.
Iniciativas em curso
O sucesso que os Web Services possam vir a apresentar passa necessariamente pela vontade da indstria, pela
partilha e abertura dos processos de normalizao e das prprias especificaes da resultantes. Parte significativa
desse processo tem sido desenvolvida no mbito do W3C. No entanto, dever-se- tambm referir outros esforos e
consrcios que tm vindo a ser desenvolvidos, designadamente o UDDI, o ebXML, ou o XML/EDI. Por exemplo, o
ebXML um esforo patrocinado pela UN/CEFACT e pela OASIS, cujo objetivo a produo de um conjunto de
especificaes para permitir colaboraes de negcio eletrnico. O standard ebXML pode ser visto como uma
extenso s funcionalidades de descrio, publicao e descoberta de servios (definidas no mbito do UDDI), ao
tratar os seguintes aspectos: como especificar os processos de negcio; como identificar os Web Services
participantes e respectivas colaboraes; ou, que padres de negociao existem na colaborao entre os
participantes. Estes aspectos, so tratados nomeadamente nas seguintes especificaes:
1) esquemas para especificao de processos de negcio, BPSS (business process specification schema);
2) acordos de protocolos de colaborao, CPA (collaboration protocol agreement);
3) ou perfis de protocolos de colaborao, CPP (collaboration protocol profile).
Contribuio das empresas
As principais empresas, para alm de promoverem e participarem ativamente nos vrios consrcios de
normalizao, tm vindo a incorporar nas suas prprias infra-estruturas de desenvolvimento e suporte de
aplicaes implementaes das normas ligadas aos Web Services. Entre outras, merece referncia a plataforma da
Microsoft, .Net , da Sun, Java ONE (Open Net Environment), da Hewlett-Packard, e-speak e da IBM, IBM
Web Services .
Novos Modelos de Negcio
S o futuro dir quem tem razo: se os cpticos ou conservadores, se os que arriscam e concretizam a sua viso.
Com o conceito dos Web Services talvez o mais importante nem seja a tecnologia em si, mas toda uma discusso
volta dos fatores econmico-polticos que este paradigma poder suscitar, bem como os modelos de negcio que
podero emergir. Parece natural a emerso de novos portais, no para as pessoas consultarem e usarem, mas
para as aplicaes, i.e., para os servios se registarem/publicarem de modo a tornarem-se conhecidos,
descobertos e usados. Esses portais de servios (tecnicamente consiste em servios de registos UDDI e/ou ebXML)
podero ser definidos a nvel global, regional, para domnios de negcio horizontais ou verticais.
Novos Requisitos Tecnolgicos
No entanto e naturalmente, novos problemas e requisitos tecnolgicos so colocados com o conceito dos Web
Services. Desde logo, ao nvel da modelao destes servios e dos processos de negcio em que aqueles
participam. Aspectos como a composio de servios, coordenao de fluxos de trabalho, identificao e
privacidade, segurana, negociao, contratos e pagamentos, tratamento de excepes, categorizao e
taxonomias de servios, etc., devero ser adequadamente investigados e tratados de forma que este paradigma
possa vir a apresentar um largo consenso e sucesso.
Apostila de C# e ASP.Net
138 de 168
Vantagens e Desvantagens
Os Web Services so modelos que surgiram para o desenvolvimento de aplicaes tpicas de negcio eletrnico,
envolvendo e suportando o estabelecimento da colaborao e negociao de forma aberta, distribuda e dinmica
entre distintos parceiros. Os Web Services podem no futuro representar um sucesso significativo por causa de
existir um esforo significativo, por parte da maioria dos parceiros industriais, na normalizao das tecnologias
envolvidas. As tecnologias subjacentes aos Web Services (tais como HTTP, SOAP, WSDL, UDDI, XML) so abertas,
amplamente divulgadas e consensuais. Por outro lado, existe potencial para haver uma real independncia das
linguagens de programao (Java, C++, VB, Delphi, C#), das arquiteturas de computadores e sistemas operativos,
o que permite uma evoluo mais suave e econmica para este modelo computacional.
No entanto, existe crticas que demonstram medos ou falsas expectativas que os investimentos em Web Services
podem suscitar. Uma dessas crticas diz respeito ao fato do SOAP menos eficiente do que os sistemas de RPC
existentes. Por exemplo, as mensagens (com os respectivos envelopes e descrio de tipos) trocadas entre as
partes so descritas em formato de texto/XML enquanto que nos sistemas clssicos de RPC so trocadas em
formato binrio. No entanto, esta desvantagem compensada significativamente pela facilidade de interoperao
entre os servios, sem os problemas conhecidos de segurana/firewalls, e pela facilidade de se esconder os
detalhes proprietrios das infra-estruturas de suporte.
Apostila de C# e ASP.Net
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
14
23
24
Define um mtodo pblico que implementa um parmetro do tipo String, retornando um tipo
DataTable (Collection).
26
27
Apostila de C# e ASP.Net
143 de 168
Passo 06
Finalizando a implementao, altere o cdigo do arquivo WSProduto.asmx , definindo o novo nome da Classe.
Originalmente o nome era Service, aqui estamos renomeando para WSProduto conforme linhas de cdigo abaixo.
Verso Original
<%@ WebService Language="C#" CodeBehind="~/App_Code/Service.cs" Class="Service" %>
Verso Modificada
<%@ WebService Language="C#" CodeBehind="~/App_Code/Service.cs" Class="WSProduto" %>
Passo 07
Fazendo valer o benefcio fornecido pela ferramente, em implementar um aplicativo de teste de consumo de
mtodos de nosso WebService, utilize a opo de menu Debug | Start Debuggin para executar o teste.
Baseado na imagem da Figuras 07, clique no link RetornaProduto, e em seguida, agora se orientando pela imagem
da Figura 08, preencha o campo Descricao com a letra C clicando no boto Invoke para que o mtodo seja
executado no WebService. A Listagem 04 exibe em formato XML o pacote de dados retornado pelo mtodo,
exibindo os registros da tabela Produto que tem descrio iniciada com a letra C passado como parmetro.
Nota: Apesar da afirmao anterior, na prtica, nosso WebService no acessa a tabela Produto no banco de
dados. Na verdade ela submete uma chamado ao mtodo relativo na Camada de Negcio, e esse sim interge com
a base de dados.
Figura 07
Figura 08
Apostila de C# e ASP.Net
Listagem 04
<DataTable>
<xs:schema id="NewDataSet">
<xs:element name="NewDataSet" msdata:IsDataSet="true"
msdata:MainDataTable="Table" msdata:UseCurrentLocale="true">
<xs:complexType>
<xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:element name="Table">
<xs:complexType>
<xs:sequence>
<xs:element name="Id" type="xs:long" minOccurs="0"/>
<xs:element name="Descricao" type="xs:string" minOccurs="0"/>
<xs:element name="Preco" type="xs:decimal" minOccurs="0"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:choice>
</xs:complexType>
</xs:element>
</xs:schema>
<diffgr:diffgram>
<NewDataSet>
<Table diffgr:id="Table1" msdata:rowOrder="0">
<Id>1</Id>
<Descricao>Celular Sony 2233</Descricao>
<Preco>223.00</Preco>
</Table>
<Table diffgr:id="Table2" msdata:rowOrder="1">
<Id>3</Id>
<Descricao>Cmera Fuji 3.7</Descricao>
<Preco>350.00</Preco>
</Table>
<Table diffgr:id="Table3" msdata:rowOrder="2">
<Id>9</Id>
<Descricao>Caneta Lazer</Descricao>
<Preco>109.00</Preco>
</Table>
<Table diffgr:id="Table4" msdata:rowOrder="3">
<Id>15</Id>
<Descricao>Celular Xing Ling</Descricao>
<Preco>113.00</Preco>
</Table>
<Table diffgr:id="Table5" msdata:rowOrder="4">
<Id>112</Id>
<Descricao>Cadeira Sem Brao para Micro</Descricao>
<Preco>44.00</Preco>
</Table>
<Table diffgr:id="Table6" msdata:rowOrder="5">
<Id>113</Id>
<Descricao>Cadeira ComBrao para Micro</Descricao>
<Preco>100.00</Preco>
</Table>
</NewDataSet>
</diffgr:diffgram>
</DataTable>
144 de 168
Apostila de C# e ASP.Net
145 de 168
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.
public partial class ConsultaProduto : System.Web.UI.Page
{
//ProdutoController_SQL Prod = new ProdutoController_SQL();
WSProduto.WSProduto WSProduto = new WSProduto.WSProduto();
protected void ButtonPesquisar_Click(object sender, EventArgs e)
{
//GridViewProdutos.DataSource = Prod.ObterProduto(TextBoxDescricaoProduto.Text);
GridViewProdutos.DataSource =
WSProduto.RetornaProduto(TextBoxDescricaoProduto.Text);
GridViewProdutos.DataBind();
}
. . . Cdigo restante da classe omitido aqui.
Apostila de C# e ASP.Net
150 de 168
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
3.
4.
5.
6. }
Comentando o cdigo fonte da Listagem 01
Linha
Descrio
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
3.
Session["NomeRelatorio"] = "CrystalReportListaMovimento.rpt";
4.
5.
6.
7.
8.
Session["DataTableRelatorio"] = Prod.ObterListaMovimento(TextBoxDescricaoProduto.Text,
DateTime.Parse(TextBoxDataIni.Text),
DateTime.Parse(TextBoxDataFin.Text)
);
9.
10.
Response.Redirect("ExibirRelatorio.aspx");
11. }
Comentando o cdigo fonte da Listagem 02
Linha
Descrio
Atribui a varivel de seo (Session) o DataTable (coleo de registros) retornado pelo mtodo.
10
Passo 13
Execute o projeto e verifique o resultado.
Apostila de C# e ASP.Net
160 de 168
Cancelamento de um postBack
Conforme caracterstica do prprio javascript, podemos utilizar o evento onclick para cancelar a ocorrncia de um
postBack, bastando retornar do evento um valor boolean.
Assim podemos, ao invs de fazer uso da funo alert, utilizar a funo confirm do javascript para gerar uma
mensagem de confirmao em botes, por exemplo. Veja:
Button1.attributes.add("onclick","return confirm('Tem certeza ?')")
Apostila de C# e ASP.Net
161 de 168
Mas se no existe nenhum evento de servidor com o mesmo nome, fique a vontade, insira o evento na tag
normalmente, o webcontrol, ao no reconhecer o atributo, renderizar o atributo no client exatamente como
estiver e desta forma ir gerar o evento no javascript.
Um exemplo disso so os eventos omouseover e onmouseout no objeto Image, veja como fica, neste exemplo
preenchendo a linha de status do browser :
<asp:Image id="Image1" runat="server"
ImageUrl="SNAG-0002.jpg" onmouseover="javascript:window.status='testando 1,2,3'"
onmouseout="javascript:window.status=''">
</asp:Image>
Apostila de C# e ASP.Net
162 de 168
Apostila de C# e ASP.Net
163 de 168
Apostila de C# e ASP.Net
164 de 168
Apostila de C# e ASP.Net
Quarta parte: \.[A-Za-z0-9]{2,}: deve encontrar duas ou mais seqncias de
antecedidos por ponto.
165 de 168
caracteres alfanumricos
Quinta parte: (\.[A-Za-z0-9])?: pode encontrar ou no uma seqncia contendo os caracteres que esto entre os
parnteses.
Por fim, a funo test ir validar a expresso, retornando um booleano que ir indicar se a string passada por
parmetro est validada dentro da expresso.
Para entender melhor, a Tabela 01 traz os sinalizadores utilizados nas expresses regulares e seus respectivos
significados.
Tabela 01: Sinalizadores de expresses regulares
Sinalizador
Exemplo
Descrio
Sinalizadores
No faz distino
e minsculas
Pesquisa global de
de um padro
gi
Caracteres literais
\n
Encontra um
linha.
caractere de quebra de
\r
Encontra um
carro.
caractere de retorno de
\t
Encontra um
horizontal.
caractere de tabulao
\v
Encontra um
vertical.
caractere de tabulao
\f
Encontra um
pgina.
indicador de quebra de
\xxx
Encontra o caractere
pelo valor octal xxx.
ASCII expresso
\xdd
\uxxxx
"\u00A3"
encontra""
Encontra somente no
incio da string
Encontra somente no
final da string.
\b
\B
night" mas no
em "Land" mas no
really cool."
Classes de caracteres
Apostila de C# e ASP.Net
[xyz]
166 de 168
[^xyz]
\w
\W
\d
Encontra qualquer
Equivale a [0-9].
\D
\s
\S
/\w/ encontra
"200" em "200%"
em "200%"
dgito de 0 a 9.
/\D/ encontra
Padres de repeties
{x}
Encontra exatamente
um padro.
x ocorrncias de
{x,}
Encontra x ou mais
padro.
ocorrncias de um
/\s{2,}/ encontra no
espao.
{x,y}
Encontra de x at y
padro.
ocorrncias de um
/\d{2,4}/ encontra
4 dgitos.
Encontra zero ou
Equivale {0,}.
ocorrncia.
mais ocorrncias.
ocorrncias.
/\d{5}/ encontra 5
/a\s?b/ encontra
"a b".
dgitos.
mnimo 2 caracteres de
no mnimo 2 mas no mais que
"ab" ou
Agrupamento de padres
()
|
/(ab)|(cd)|(ef)/
Apostila de C# e ASP.Net
167 de 168
Existem alguns mtodos para efetuar a validao e outras operaes tendo como base a expresso regular
construda, os quais esto descritos na Tabela 02.
Tabela 02: Mtodos de validao em expresses regulares
Mtodo
Descrio
exec
Executa pesquisas em
test
Indica se a string
match
Executa uma pesquisa em uma string e retorna um array das informaes obtidas ou
nulo se nada for encontrado.
search
replace
split
um array de substrings.
lastIndex
Armazena a posio da ltima pesquisa bem sucessida realizada na string. Se nada for
encontrado, a propriedade lastIndex ser colocada como 1.
$n
n representa o numero de 1 a 9
Armazena os nove mais recentes pesquisa dentro de parnteses encontradas. Por
exemplo, se o padro usado por uma regular expression para a ltima pesquisa foi /
(Hello)(\s+)(world)/ e a string pesquisada foi Hello world o contedo de RegExp.$2
poderia ser qualquer caractere entro Hello e world.
source
Armazena a copia do
Sabendo utilizar os caracteres especiais nas expresses regulares j 50%, os outros 50% ficam por conta da
lgica para montar a expresso.
Para fixar bem o assunto vamos a mais um exemplo: validao de datas. Voc j deve ter visto pela Internet
alguns scripts medonhos, com algumas dezenas ou centenas de linhas de cdigo para validar datas, aqueles que
voc olha e nem sabe direito como funciona. Vamos simplificar um pouco isso, seguindo o cdigo do quadro 03.
function validaData(data){
var er = RegExp("(0[1-9]|[012][0-9]|3[01])/(0[1-9]|1[012])/[12][0-9]{3}");
if(er.test(data)){
var barras = data.split("/");
var dia = barras[0];
var mes = barras[1];
var ano = barras[2];
var d = new Date(ano, mes-1, dia);
if(dia != d.getDate()){
return false;
else if(mes != (d.getMonth() + 1)){
return false;
}else if(ano != d.getFullYear()){
return false;
}else{
return true;
}
}else{
return false;
}
}
Listagem 03 Validao de datas com Expresso Regular.
Apostila de C# e ASP.Net
168 de 168
Na segunda linha temos a declarao da nossa expresso regular, vamos entender como ela funciona.
Primeira parte: (0[1-9]|[012][0-9]|3[01]): valida os dias indicando que expresso ir considerar como vlido tudo
o que se iniciar com 0 e vier seguido de um dgito entre 1 e 9, ou (pipe (|) o operador lgico or) iniciar com 2
ou 3 e vier seguido de um dgito entre 0 e 9, ou ento iniciar com 3 e vier seguido por 0 ou 1. Isto ir validar os
dias entre 1 e 31.
Segunda parte: (0[1-9]|1[012]): agora a validao dos meses, que deve ser considerado os que iniciarem com
zero, seguidos por um dgito entre 1 e 9, ou iniciar com 1, seguido de 0, 1 ou 2.
Terceira parte: [12][0-9]{3}: aqui ir validar o ano, que dever iniciar com 1 ou 2 e aps isso ter uma seqncia
de 3 dgitos entre 1 e 9, desta forma, valida os anos entre 1000 e 2999.
As barras indicam o formato da data, que deve estar como dd/MM/aaaa. Mas no se pode validar tudo apenas
com expresso regular, pois temos os anos bissextos e os meses com 30 ou 31 dias. Por isso temos a segunda
parte, que ir criar uma varivel do tipo data passando os parmetros de dia, ms e ano e depois verificar se
cada parte da data criada confere com a data informada.
A questo de informar mes-1 e depois comparar o ms com d.getMonth() + 1 se d pelo motivo do JavaScript
tratar o ms iniciando de 0, e no por 1, ou seja, o JavaScript conta os meses de 0 a 11.
Enfim, Expresses Regulares se resume basicamente a isto, no muito complicado, basta dar uma olhada mais
atentamente para entender.