Easy-Net 008 Oiujklpm
Easy-Net 008 Oiujklpm
NET
Neste artigo os principais fundamentos de
desenvolvimento de projetos web serão
apresentados. Tratará de demonstrar a
arquitetura de um projeto do tipo Web
Application e Web Site, manutenção,
características básicas, algumas das suas
funcionalidades e utilizações.
Resumo do DevMan
Como o aplicativo será voltado para a web, este projeto deverá ter uma
especificação e um planejamento de design adequado para atender ao conjunto
de requisitos necessários para o desenvolvimento de todo o projeto de uma
forma clara, coerente e concisa.
Templates de projeto
Web Application
Algumas das pastas não estão visíveis na janela Solution Explorer, mas estão
presentes na estrutura de pastas do local onde está salvo o projeto.
Web Site
Quando criamos um projeto web site, o Visual Studio 2010 cria em uma pasta
separada o arquivo da solução do projeto (arquivo .sln), tal local reservado,
que não aparece no projeto web site, normalmente, por padrão é a pasta
\Visual Studio 2010\Projects, onde contém as definições do projeto. Além
disso, o web site é criado em outro local, por padrão, é na pasta \Visual Studio
2010\WebSites, com as definições de arquivos e pastas semelhantes às
da Figura 4, descrita anteriormente. Na Tabela 2 podemos visualizar algumas
das pastas e arquivos juntamente com suas definições.
Conclusão
Para concluir, vale lembrar que o tipo de projeto web a ser utilizado deverá ser
escolhido por quem o desenvolve tomando por base o planejamento inicial do
site e quais as características que ele deverá possuir, levando em conta, layout,
design, desenvolvimento, segurança, manutenção, backups, detecção e
correção de erros entre outros planejamentos.
Links
Asp.Net MVC 2
http://msdn.microsoft.com/en-us/library/ff520618(VS.100).aspx
Aplicações Windows
Forms, Class Libraries e
Arquivos TXT
Entre diversos assuntos, o artigo trata da
criação de arquivos de texto com uma
codificação específica para que possa ser
lido por programas de outras plataformas e
outros idiomas. Além disto, novidades da
linguagem C# na versão 4 são introduzidas
e também alguns aspectos práticos da
programação como leitura de configurações
da aplicação e o trabalho um pouco mais
avançado na criação de interfaces de
programas para o Windows.
Do que trata o artigo
O artigo pode servir como referência e consulta para temas como gravação e
leitura de arquivos. Criação de projetos compartimentados onde as
funcionalidades estão divididas em diversos projetos. Criação de interfaces
Windows usando os componentes nativos da plataforma e também o trabalho
com classes com a linguagem C#.
Ainda que existam editores de textos profissionais, pode ser necessário criar
um editor personalizado, ou ainda, executar a leitura ou gravação de arquivos
de texto para diversas finalidades como, por exemplo, troca de informações
entre aplicações legadas.
Resumo do DevMan
Com o tempo, a maior parte das informações trocadas entre os programas era
feita através de arquivos de texto e, ainda hoje, muitas das comunicações
feitas entre os programas, quer estejam no mesmo computador, distribuídos
numa rede ou pela Internet é feita desta forma, ou seja, usando arquivos de
texto puro.
Quando se diz “texto puro” deve-se entender um arquivo que contém apenas
o texto, sem formatação alguma. Quando editamos um arquivo em um
programa como o Microsoft Word por exemplo, além do texto digitado, são
armazenados os dados de formatação referente ao tipo da fonte, tamanho,
parágrafos etc.
Com o Visual Studio isto é bem simples de se conseguir já que uma mesma
“solution” pode ter vários projetos, inclusive interligados ou não. E como a
palavra de ordem para os desenvolvedores é “flexibilidade” uma maneira de
se implementar esta é mantendo a aplicação configurável, ou seja, permitindo
que se altere parâmetros que mudem um ou outro aspecto de seu
comportamento.
Inicialmente, persistir dados, quer seja texto ou não, para sua posterior
recuperação era uma tarefa bem complexa. Nas primeiras linguagens de
programação era necessário lidar com problemas como encontrar espaço livre
no disco, alocar este espaço para o arquivo, transferir dados da memória para
o disco, certificar que os dados foram gravados corretamente etc.
Hoje isto tudo ficou bem mais fácil. O framework .net possui classes que
simplificam bastante a tarefa. Por exemplo, o código a seguir executa a
gravação de um arquivo de texto:
TextWriter tw = File.CreateText(@"d:\arquivo.txt");
tw.Write("Texto gravado no arquivo.");
tw.Close();
A classe “TextWriter” cria um objeto que faz a gravação. O método estático
“CreateText” da classe “File” que está contida na biblioteca “System.IO”
retorna um objeto para a gravação. Para gravar o arquivo texto, usamos o
método “Write”. Este objeto é em seguida fechado. Note que somente irá
funcionar com dados de texto, do tipo string. Se você precisar gravar dados
binários deve usar outro tipo de objeto como o código a seguir demonstra:
// fecha o writer
bw.Close();
// fecha o objeto que escreve no arquivo
fs.Close();
Nota do DevMan
TextReader tr = File.OpenText(@"d:\arquivo.txt");
Console.WriteLine(tr.ReadToEnd());
tr.Close();
br.Close();
fs.Close();
Estes passos são os mais básicos para fazer leitura, a seguir, existem algumas
considerações a serem feitas para escrever arquivos de texto.
A questão da codificação
Os arquivos de texto não são todos iguais. Considere questões como alfabeto
suportado pelo idioma, controle de quebra de linha e retorno de parágrafo
(sempre que um parágrafo termina, o novo deve começar em uma nova linha
na primeira coluna).
Para resolver estes problemas o sistema operacional grava junto com o texto
informações sobre como deverá formatar o texto e qual o conjunto de
caracteres a ser usado. Este processo é chamado de “Codificação”
(“Encoding” em inglês).
Nota do DevMan
Métodos no C# 4 – novidades
Um dos principais pontos em que se percebe isto foi o suporte aos parâmetros
opcionais dentro dos métodos. Estes, são parâmetros que podem ser omitidos
na assinatura de um método tendo um valor default estabelecido caso o
parâmetro não seja passado. Para poder usar um parâmetro como opcional,
estes devem estar sempre no final da lista de parâmetros do método como, por
exemplo:
Neste caso, o método deve obrigatoriamente receber dois parâmetros que são
os números para o cálculo. O terceiro parâmetro pode ser omitido que, neste
caso, o seu valor padrão será ‘+’.
Ou assim:
Os programas que são feitos dentro do framework .net são fáceis de serem
configurados pois usam arquivos de configuração no formato XML.
Estes arquivos não são gerados automaticamente. Para fazer isto você deve
usar o menu “Project >> Properties” e gerar pelo menos uma configuração.
Mesmo com um assistente para gerar estas configurações você vai precisar
fazer ajustes finos no arquivo de configurações abrindo e editando
manualmente para que seja possível acessar usando o código:
string val =
ConfigurationManager.AppSettings["ParmetroDeConfiguracao"];
using System.Configuration;
Estrutura
Para criar o aplicativo, tudo será feito em uma solução do Visual Studio 2010
usando a linguagem C# 4.0. As funcionalidades de ler e gravar o arquivo
serão realizadas por uma biblioteca (DLL) contida em um projeto do tipo
“Class library”. Este projeto será chamado “EditorLib”. A interface será
elaborada em uma aplicação Windows Forms chamada “Editor” que fará
referência ao projeto “EditorLib”.
Nota do DevMan
Criando a aplicação
Crie uma solução vazia no Visual Studio 2010 através da opção de menu “File
>> New >> Project” e escolha a opção “Other Project Types >> Visual Studio
Solution” na janela “New Project” e escolha “Blank Solution”. Veja os
detalhes na Figura 1.
Figura 1. Criando solução em branco
Projeto “EditorLib”
Esta classe armazenará os dados do arquivo e deverá ter seu código como
naListagem 1. Observe na linha 1 a inclusão da biblioteca “Sytem.Text” nas
cláusulas “Using”. Isto se faz necessário para que possamos ter uma
propriedade que armazena o tipo da codificação do arquivo. Na linha 5
declaramos a classe com a acessibilidade “public” para poder ser referenciada
fora do projeto. Nas linhas 7 a nove temos as propriedades do arquivo que
são:
1 using System.Text;
2
3 namespace EditorLib
4 {
5 public class Arquivo
6 {
7 public string Nome { get; set; }
8 public string Conteudo { get; set; }
9 public Encoding CodificacaoDoTexto { get; set; }
10 }
11 }
12
Esta classe só armazena. Para manipular os dados crie outra classe no projeto
chamada “ArquivoDisco”. Observe a declaração da classe e as bibliotecas que
devem ser importadas na Listagem 2.
Esta classe manipula arquivos no disco, por isso deve conter uma referência a
“System.IO”. Também fará a codificação do texto via classe “Encoding”, por
isso contém uma referência para “System.Text” na linha 2 e por fim, como faz
tratamento de “Exceptions” que são erros que podem acontecer durante a
execução, incluímos na linha 3 uma referência para “System”. Os métodos
serão do tipo “static” ou seja, não necessitam de uma instância da classe para
serem executados. Isto foi feito porque nenhum dado específico é armazenado
pela classe, logo não há a necessidade de instância da mesma. Este tipo de
classe é muito comum. É muito usado quando precisamos apenas executar
operações com dados vindos de outros objetos. A seguir, seguem as
descrições dos métodos que foram criados.
1 using System.IO;
2 using System.Text;
3 using System;
4
5 namespace EditorLib
6 {
7 public class ArquivoDisco
8 {
...
Lendo os arquivos
Da linha 26 até a linha 33 um laço “switch” verifica a string que foi usada
como parâmetro de codificação. Em cada linha é inicializado o objeto stream
de leitura passando o nome do arquivo a ser carregado e a codificação correta.
Nota do DevMan
Existem várias maneiras de se fazer estas operações sendo que você pode
experimentá-las quando achar conveniente. O uso de inicialização direta dos
objetos, sem uso de um construtor deve ser feito com cuidado porque podem
existir parâmetros importantes que fiquem sem ser inicializados. Nesta
implementação não foram feitas verificações como se o arquivo existe, se o
usuário tem permissões etc., para poder simplificar a demonstração,
entretanto, faça isto sempre que puder.
9 /// <summary>
10 /// Abre o arquivo recebendo opcionalmente uma codificação
11 /// </summary>
12 /// <param name="nome"></param>
13 /// <param name="erro"></param>
14 /// <param name="codificacao"></param>
15 /// <returns></returns>
16 public static Arquivo AbrirArquivo(string nome, out string
erro, string codificacao = "ASCII")
17 {
18 // inicializa variável para mensagens de erro
19 erro = string.Empty;
20
21 try
22 {
23 // objeto que faz a leitura
24 StreamReader sr = null;
25
26 // verifica qual a codificação será usada
27 switch (codificacao)
28 {
29 case "ASCII": sr = new StreamReader(nome, new
ASCIIEncoding()); break;
30 case "UTF8": sr = new StreamReader(nome, new
UTF8Encoding()); break;
31 case "UNICODE": sr = new StreamReader(nome, new
UnicodeEncoding()); break;
32 default: sr = new StreamReader(nome, new
UTF8Encoding()); break;
33 }
34
35 // cria um objeto para receber o texto
36 Arquivo arquivoRetorno = new Arquivo
37 {
38 Nome = nome,
39 Conteudo = sr.ReadToEnd(),
40 CodificacaoDoTexto = sr.CurrentEncoding
41 };
42
43 // fecha o objeto de leitura
44 sr.Close();
45 return arquivoRetorno;
46 }
47 catch (Exception ex)
48 {
49 // captura a mensagem de erro
50 erro = string.Format("Não foi possível abrir o
arquivo. {0}", ex.Message);
51 }
52
53 return null;
54 }
Gravando o arquivo
56 /// <summary>
57 /// Grava o arquivo de texto.
58 /// </summary>
59 /// <param name="objArquivo"></param>
60 /// <param name="erro"></param>
61 /// <param name="codificacao"></param>
62 /// <returns></returns>
63 public static bool GravarArquivo(Arquivo objArquivo, out
string erro, string codificacao = "ASCII")
64 {
65 // inicializa variável para mensagem de erro
66 erro = string.Empty;
67
68 try
69 {
70 // objeto stream para gravar
71 StreamWriter sr = null;
72 // objeto para manipular o arquivo
73 FileStream fs = new FileStream(objArquivo.Nome,
74 FileMode.OpenOrCreate, FileAccess.Write,
FileShare.None);
75
76 // configura a codificação a ser usada
77 switch (codificacao)
78 {
79 case "ASCII": sr = new StreamWriter(fs,
Encoding.ASCII); break;
80 case "UTF8": sr = new StreamWriter(fs,
Encoding.UTF8); break;
81 case "UNICODE": sr = new StreamWriter(fs,
Encoding.Unicode); break;
82 default: sr = new StreamWriter(fs,
Encoding.ASCII); break;
83 }
84
85 // grava o texto no arquivo
86 sr.Write(objArquivo.Conteudo);
87 // fecha os objetos
88 sr.Close();
89 fs.Close();
90 return true;
91 }
92 catch (Exception ex)
93 {
94 // captura mensagens de erro
95 erro = string.Format("Não foi possível gravar o
arquivo. {0}", ex.Message);
96 }
97
98 return false;
99 }
Aplicação Windows
Para demonstrar e consumir o código criado até aqui, usaremos uma aplicação
do tipo Windows Forms. Adicione na sua solution do Visual Studio como fez
anteriormente, observando o tipo de projeto conforme na Figura 4. Configure
as propriedades do formulário principal como na Tabela 1.
Propriedade Valor
(Name) frmPrincipal
Size 640; 480
Text Editor de Texto
1. ToolStrip;
2. TextBox;
3. OpenFileDialog;
4. SaveFileDialog.
UTF8
UNICODE
Nota do DevMan
Código da aplicação
1 using System.Configuration;
2 using System.Windows.Forms;
3
4 namespace Editor
5 {
6 public partial class frmPrincipal : Form
7 {
8 EditorLib.Arquivo objArq;
9
10
...
Do jeito que está fica muito difícil para acessar os dados de configuração.
Edite o arquivo de configurações clicando na janela “Solution Explorer” no
ícone “app.config”. Tome cuidado para clicar no ícone correspondente ao
projeto correto. Altere seu conteúdo para que fique como o daListagem 6.
Nas linhas 8 a 10 inserimos a configuração que armazena o filtro a ser usado
nas caixas de diálogo para abrir e gravar os arquivos.
A Listagem 7 demonstra como ler esta configuração. Note que este arquivo
de configuração em tempo de projeto chama-se “app.config”, após o “build” o
mesmo é copiado para a basta “bin\debug” (ou “bin\release”) e é renomeado
para <nome do projeto>.config.
89 /// <summary>
90 /// Criando um arquivo novo
91 /// </summary>
92 /// <param name="sender"></param>
93 /// <param name="e"></param>
94 private void newToolStripButton_Click(object sender,
System.EventArgs e)
95 {
96 // antes de criar um arquivo novo
97 // verifica se já existe algum arquivo
98 // carregado no editor.
99 if (objArq != null)
100 {
101 // pede confirmação da operação
102 if (MessageBox.Show("Descartar modificações do arquivo
atual?",
103 "Confirmação", MessageBoxButtons.YesNo,
MessageBoxIcon.Question) ==
104 System.Windows.Forms.DialogResult.Yes)
105 {
106 textBox1.Text = string.Empty;
107 objArq = null;
108 }
109 }
110 }
Gravação do texto
O passo seguinte é gravar o texto usando a codificação que foi escolhida. Para
incluir o código da Listagem 9, dê um clique duplo no botão . Este método
começa verificando se o objeto do arquivo já foi instanciado. Na linha 55 se
ainda não foi, o objeto está nulo. Neste caso é necessário obter um nome para
o arquivo através do controle “SaveFileDialog” que é exibido na linha 59.
Este controle verifica se o arquivo já existe e se pode ser sobrescrito. Caso não
seja validado o nome do arquivo, a propriedade “FileName” ficará vazio. Isto
é inspecionado na linha 61. Continuando, é criada uma instância para o objeto
da classe “Arquivo” e são passados o nome e o conteúdo (linhas 68 até 72).
Caso o arquivo já tenha sido instanciado, atualiza-se o texto como na linha 76.
47 /// <summary>
48 /// Grava o arquivo
49 /// </summary>
50 /// <param name="sender"></param>
51 /// <param name="e"></param>
52 private void saveToolStripButton_Click(object sender,
System.EventArgs e)
53 {
54 // verifica se foi criado algum arquivo
55 if (objArq == null)
56 {
57 // se não foi criado ainda um nome
58 // abre a caixa de diálogo para salvar
59 saveFileDialog1.ShowDialog();
60
61 // verifica se um nome válido foi digitado
62 if (string.IsNullOrEmpty(saveFileDialog1.FileName))
63 {
64 return;
65 }
66
67 // cria o objeto para gravar
68 objArq = new EditorLib.Arquivo
69 {
70 Conteudo = textBox1.Text,
71 Nome = saveFileDialog1.FileName
72 };
73 }
74 else
75 {
76 objArq.Conteudo = textBox1.Text;
77 }
78
79 // variável para receber erros
80 string erro = string.Empty;
81
82 // invoca o método para gravar
83 if (!EditorLib.ArquivoDisco.GravarArquivo(objArq,
84 out erro, cmbEncoding.Text))
85 {
86 MessageBox.Show(erro);
87 }
88 else
89 {
90 textBox1.Focus();
91 }
92 }
Na linha 38 caso tenha havido erro, o objeto estará nulo, neste caso, na linha
40, é exibida a mensagem de erro retornada pelo método, caso contrário, na
linha 44, o texto que foi lido é carregado no controle TextBox.
14 /// <summary>
15 /// Abre a caixa de dialogo para abrir o arquivo
16 /// </summary>
17 /// <param name="sender"></param>
18 /// <param name="e"></param>
19 private void openToolStripButton_Click(object sender,
System.EventArgs e)
20 {
21 // mostra a caixa de diálogo
22 openFileDialog1.ShowDialog();
23
24 // se nenhum arquivo foi retornado, sai da rotina
25 if (string.IsNullOrEmpty(openFileDialog1.FileName))
26 {
27 return;
28 }
29
30 // variável que receberá as mensagens de erro
31 string erro = string.Empty;
32 // invoca método da biblioteca
33 objArq =
EditorLib.ArquivoDisco.AbrirArquivo(openFileDialog1.FileName,
34 out erro,
35 cmbEncoding.Text);
36
37 // verifica se houve algum erro
38 if (objArq == null)
39 {
40 MessageBox.Show(erro);
41 }
42 else
43 {
44 textBox1.Text = objArq.Conteudo;
45 }
46 }
Conclusão
XML
O artigo descreve técnicas básicas para ler
e criar documentos XML que são a base
para várias das aplicações modernas,
conectadas ou não. Através de exemplos
práticos será possível iniciar o uso e
entendimento destes documentos com o
framework .net.
Do que trata o artigo
O artigo descreve técnicas básicas para ler e criar documentos XML que são a
base para várias das aplicações modernas, conectadas ou não. Através de
exemplos práticos será possível iniciar o uso e entendimento destes
documentos com o framework .net.
Sempre que se precisar ler ou escrever documentos XML, este artigo poderá
ser usado como um ponto de partida para a execução das tarefas. Como as
tarefas serão expostas em classes separadas, estas poderão ser usadas
posteriormente em outros projetos e ter suas funcionalidades expandidas. Os
documentos XML têm um número grande de aplicações sendo a base para os
Webservices e também para a plataforma WPF da Microsoft que usa uma
variação desta linguagem para montar interfaces com o usuário mais
aprimoradas.
Resumo do DevMan
O sistema operacional UNIX procurou fazer isto bem feito usando os arquivos
de texto que, sob o ponto de vista de segurança da rede e compatibilidade com
outros programas são quase inofensivos, mas têm limitações quando se
pretende descrever sua estrutura.
Documentos XML
Nota do DevMan
Outros browsers também fazem este trabalho, mas servem apenas para
visualizar o conteúdo e não editar. Existem vários programas que permitem
fazer isto, além de você poder usar um editor de textos básico como o bloco
de notas do Windows. Existem também editores mais especializados que além
de editar o XML validam o seu conteúdo.
Estrutura
Além dos elementos citados até aqui, um arquivo XML deve ser validado. Ou
seja, toda a sua estrutura deve estar correta quanto à abertura e fechamento das
TAGS. Também existem tipos de conteúdo que não são corretamente
processados tais como caracteres de marcação como “<, >, &”, neste caso
você deve usar os códigos HTML usados para estes símbolos para evitar erros
de validação do XML.
2. Atributos. São elementos que são passados dentro (não entre) as TAGS para
armazenar valores adicionais, geralmente referentes à própria TAG. No nó
“pedido” do XML anterior, existe um atributo “id” passando o número do
pedido que está referenciado no documento.
Nota do DevMan
Para permitir um uso tão extenso do XML foi necessário criar uma biblioteca
específica para trabalhar com estes tipos de arquivo. Dentro da biblioteca
“System.Xml” existe um número enorme de classes usadas para criar,
gerenciar e ler documentos deste tipo. Existem classes que permitem ler o
conteúdo sem conhecer a estrutura. Outras, para formatar o documento ao
realizar a escrita no disco.
// declara um documento
XmlDocument xmlDoc = new XmlDocument();
// carrega o documento do disco
xmlDoc.Load(@"d:\teste.xml");
// declara um documento
XmlDocument xmlDoc = new XmlDocument();
// cria uma string contendo um xml
string sConteudo = @"
<disco id='1'>
<titulo>Money for nothing</titulo>
<artista>Dire Straits</artista>
</disco>";
// carrega o documento da string
xmlDoc.LoadXml(sConteudo);
Por outro lado, você pode gravar os dados no disco após criar o conteúdo.
Alterando o código anterior, você pode gravar o conteúdo no disco:
// declara um documento
XmlDocument xmlDoc = new XmlDocument();
// cria uma string contendo um xml
string sConteudo = @"
<disco id='1'>
<titulo>Money for nothing</titulo>
<artista>Dire Straits</artista>
</disco>";
// carrega o documento da string
xmlDoc.LoadXml(sConteudo);
// grava o conteúdo do xml no disco
xmlDoc.Save(@"d:\disco.xml");
1 // declara um documento
2 XmlDocument xmlDoc = new XmlDocument();
3 // declara e cria o nó raiz
4 XmlNode noPrincipal = xmlDoc.CreateNode(XmlNodeType.Element,
"disco", "");
5 // cria um elemento atributo
6 XmlAttribute xmlAtr = xmlDoc.CreateAttribute("id");
7 // seta o valor do atributo
8 xmlAtr.Value = "1";
9 // adiciona o atributo ao no principal
10 noPrincipal.Attributes.Append(xmlAtr);
11 // cria um nó secundário
12 XmlNode noSecundario = xmlDoc.CreateNode(XmlNodeType.Element,
"titulo", "");
13 // configura o valor
14 noSecundario.InnerText = "Money for Nothing";
15 // adiciona o no secundário para o principal
16 noPrincipal.AppendChild(noSecundario);
17 // cria outro nó
18 noSecundario = xmlDoc.CreateNode(XmlNodeType.Element,
"artista", "");
19 // configura o valor
20 noSecundario.InnerText = "Dire Straits";
21 // adiciona ao nó principal
22 noPrincipal.AppendChild(noSecundario);
23 // adiciona o nó principal ao documento
24 xmlDoc.AppendChild(noPrincipal);
25 // grava o texto
26 xmlDoc.Save(@"d:\disco1.xml");
Aplicação de exemplo
Criando o projeto
1 using System;
2 using System.Collections.Generic;
3 using System.Xml;
4
5 namespace Easy8XML
6 {
7 // classe que gera xml
8 public class CriaXml
...
2. Um "array" de duas dimensões que contém o nome da TAG que será gerada
e o seu conteúdo representado pelo parâmetro ”dados”;
Nota do DevMan
Você percebeu que para gerar um arquivo XML foram necessários outros
métodos além do que foi explicado. Você poderia ter feito o trabalho com um
único método, mas teria um código mais extenso. Por outro lado, é uma boa
prática procurar dividir as tarefas específicas em métodos separados. Isto
aumenta a reusabilidade do seu código.
Nota do DevMan
1 using System.Text;
2 using System.Windows.Forms;
3 using System.Xml;
4
5 namespace Easy8XML
6 {
7 public class LerXml
8 {
9
...
Como o método principal desta classe irá retornar uma lista de nós que será
usado no controle “TreeView” que faz parte da biblioteca
“System.Windows.Forms”, precisamos declarar esta na classe, ainda que não
possua nenhum componente visual.
Na linha 43, obtemos a lista de nós XML dentro do elemento atual. Na linha
45 percorremos os nós que foram encontrados fazendo a chamada recursiva
para o método e por fim, adicionamos o controle “TreeNode” ao elemento
inicial, passado para o método.
Nota do DevMan
Definindo a interface
Propriedade Valor
(Name) frmPrincipal
Size 640; 480
Text Demonstração XML
Propriedade Valor
Dock Fill
Tabela 2. Propriedades do controle TabControl
Criando o XML
Compare o seu design com a Figura 5. Note que foram deixados apenas dois
botões no controle “ToolStrip”.
Se você ainda não sabe como inserir os botões padrão no controle “ToolStrip”
basta clicar sobre ele com o botão direito do mouse e escolher a opção “Insert
Standard Items” conforme demonstrado na Figura 6.
Figura 6. Inserindo componentes padrão do controle ToolStrip
Para evitar isto, que pode causar erros de referência a valores nulos, você deve
tratar o evento “CurrentCellDirtyStateChanged” do controle. Dê um duplo
clique no inspetor de eventos do controle “DataGridView” conforme
demonstrado na Figura 7. A Listagem 12 mostra o código necessário.
Feito este tratamento, podemos escrever o código que chama a classe para
fazer a gravação do documento XML. Dê um clique duplo no botão gravar e
escreva o código da Listagem 13.
Lendo o XML
Uma vez que o trabalho principal de leitura do XML foi feito em uma classe
em separado, resta ao formulário apenas popular o controle com o resultado
deste trabalho. Dê um duplo clique sobre o botão “Abrir” e insira o código
da Listagem 16.
Conclusão
Ainda é possível executar muitas outras tarefas tais como, serializar classes
inteiras no formato XML, persistir uma tabela de dados carregada na memória
com um único comando e mais interessante ainda, usar a novíssima linguagem
de consultas LINQ para trabalhar com estes documentos. Estes temas poderão
ser abordados em próximos artigos. Aguardo ansiosamente o feedback pois
este assunto é muito vasto e interessante. Como sugestão, ficam os links para
você poder se aprofundar.
Links
Este artigo é o segundo de uma série que vai abordar as principais novidades
presentes no Visual Studio 2010. Nesta segunda etapa, será visto o
visualizador de ajuda, object browser, gerações de código a partir do uso,
breakpoints, ferramentas de arquitetura e code snippets.
Esta série de artigos serve como um excelente guia para aqueles que estão
iniciando o uso do Visual Studio 2010 e precisam de uma forma rápida e
prática aprender os principais recursos e novidades desta versão.
Resumo do DevMan
Object Browser
Breakpoints
Ferramentas de arquitetura
Code snippets
Conclusão
Links
Visual Studio
http://www.microsoft.com/visualstudio
WebMatrix e ASP.NET
Razor
Neste artigo será apresentada a nova
ferramenta da Microsoft para construção de
aplicações web de pequeno e médio porte
para usuários iniciantes ou novos no
universo de aplicações para internet – o
WebMatrix. Como modelo de programação
de apoio, este artigo apresentará o
ASP.NET Razor.
Do que trata o artigo
Resumo do DevMan
Conhecendo o WebMatrix
Nota do DevMan
• SQL Server CE: além do IIS Express, o WebMatrix traz em seu conjunto
de ferramentas uma versão compacta do SQL Server. A exemplo do IIS
Express, o SQL Server CE não disponibiliza todos os recursos de outras
versões, entretanto as básicas, necessárias para a construção de aplicações
pequenas e médias, estão presentes. Esta versão é mais leve e oferece suporte
nativo ao ASP.NET. Para acessar o banco de dados, basta referenciar o
arquivo com a extensão “sdf”. Da mesma forma como se dá o gerenciamento
do IIS Express pelo WebMatrix, dá-se o gerenciamento de bancos de dados,
ou seja, tudo em um único ambiente;
ASP.NET Razor
Sem dúvida alguma, um dos fatores que contribuirão em maior escala para o
sucesso do WebMatrix é o suporte nativo do mesmo ao ASP.NET Razor.
ASP.NET Razor é uma view engine criada pela Microsoft com o objetivo de
fornecer ao desenvolvedor maior poder no processo de construção de suas
páginas. Originalmente, o ASP.NET Razor foi projetado para ser utilizado
como view engine padrão do ASP.NET MVC (e este pôde ser comprovado
com o lançamento da versão 3 RC da framework), entretanto, a comunidade
técnica foi surpreendida quando, ao disponibilizar a versão Beta 1 do
WebMatrix, a Microsoft trouxe a possibilidade de construir aplicações
pequenas e médias utilizando o ASP.NET Razor de forma desacoplada da
estrutura MVC.
01 @{
02 Layout = "~/_SiteLayout.cshtml";
03 Page.Title = "Inserção de Usuário";
04 var bd = Database.Open("StarterSite");
05
06 if(IsPost)
07 {
08 string email = Request["txtEmail"];
09 string senha = Request["txtSenha"];
10
11 if(email.IsEmpty())
12 {
13 ModelState.AddError("E-mail", "Por favor, informe seu
e-mail.");
14 }
15 if(senha.IsEmpty())
16 {
17 ModelState.AddError("Senha", "Por favor, informe sua
senha.");
18 }
19
20 if(ModelState.IsValid)
21 {
22 var resultado = bd.Query("INSERT INTO tbUsuarios
(Email, Senha) VALUES (@0, @1)", email, senha);
23 Response.Redirect("~/ListUsers");
24 }
25
26 }
27 }
28
29 @Html.ValidationSummary("Erros encontrados:")
30
31
32
33 <div style="width:800px; margin-top:15px;">
34 <form method="post" action="">
35 <table>
36 <tr>
37 <td>
38 Informe seu e-mail:
39 </td>
40 </tr>
41 <tr>
42 <td>
43 <input type="text" id="txtEmail" name="txtEmail" />
44 </td>
45 </tr>
46 <tr>
47 <td>
48 Informe sua senha:
49 </td>
50 </tr>
51 <tr>
52 <td>
53 <input type="password" id="txtSenha" name="txtSenha"
/>
54 </td>
55 </tr>
56 <tr>
57 <td>
58 <input type="submit" id="btnAdicionar"
value="Adicionar" />
59 </td>
60 </tr>
61 </form>
62 </table>
63
64 </div>
Página para listar Usuários
01 @{
02 Layout = "~/_SiteLayout.cshtml";
03 Page.Title = "Usuários cadastrados";
04 var bd = Database.Open("StarterSite");
05
06 var linhas = bd.Query("SELECT * FROM tbUsuarios ORDER BY
IDUsuario DESC");
07
08 }
09
10 <p> </p>
11
12 <div>
13 <table>
14 <tr>
15 <td>
16 @foreach(var item in linhas) {
17 <table>
18 <tr>
19 <td>
20 @item.Email
21 </td>
22 </tr>
23 <tr>
24 <td>
25 <a href="@href("~/Edit",
@item.IDUsuario)" target="_self">Editar usuário</a>
|
26 <a href="@href("~/Remove",
@item.IDUsuario)" target="_self">Remover usuário</a>
27 </td>
28 </tr>
29 <tr>
30 <td>
31 <hr size="1" />
32 </td>
33 </tr>
34 </table>
35 }
36 </td>
37 </tr>
38 </table>
39 </div>
• Linha 13: Criamos a query para selecionar os dados do usuário com base em
UsuarioID;
01 @{
02 Layout = "~/_SiteLayout.cshtml";
03 Page.Title = "Atualizando dados do usuário";
04
05 var bd = Database.Open("StarterSite");
06 var UsuarioID = UrlData[0];
07
08 if(UsuarioID.IsEmpty())
09 {
10 Response.Redirect(@href("~/ListUsers"));
11 }
12
13 var varQuery = "SELECT * FROM tbUsuarios WHERE IDUsuario =
@0";
14 var registro = bd.QuerySingle(varQuery, UsuarioID);
15
16 var Email = registro.Email;
17 var Senha = registro.Senha;
18
19 if(IsPost)
20 {
21 Email = Request["txtEmail"];
22 if(String.IsNullOrEmpty(Email))
23 {
24 ModelState.AddError("E-mail", "Por favor, informe seu
e-mail.");
25 }
26
27 Senha = Request["txtSenha"];
28 if(String.IsNullOrEmpty(Senha))
29 {
30 ModelState.AddError("Senha", "Por favor, informe sua
senha.");
31 }
32
33 if(ModelState.IsValid)
34 {
35 bd.Execute("UPDATE tbUsuarios SET Email = @0, Senha =
@1 WHERE IDUsuario = @2", Email, Senha, UsuarioID);
36 Response.Redirect(@href("~/ListUsers"));
37 }
38 }
39 }
40
41 @Html.ValidationSummary("Erros encontrados:")
42
43 <div style="width:800px; margin-top:15px;">
44 <form method="post" "action=">
45 <table>
46 <tr>
47 <td>
48 Informe seu e-mail:
49 </td>
50 </tr>
51 <tr>
52 <td>
53 <input type="text" id="txtEmail" name="txtEmail"
value="@Email" />
54 </td>
55 </tr>
56 <tr>
57 <td>
58 Informe sua senha:
59 </td>
60 </tr>
61 <tr>
62 <td>
63 <input type="password" id="txtSenha" name="txtSenha"
value="@Senha" />
64 </td>
65 </tr>
66 <tr>
67 <td>
68 <input type="submit" id="btnAtualizar"
value="Atualizar" />
69 </td>
70 </tr>
71 </form>
72 </table>
73
74 </div>
01 @{
02 Layout = "~/_SiteLayout.cshtml";
03 Page.Title = "Removendo usuário";
04
05 var bd = Database.Open("StarterSite");
06 var UsuarioID = UrlData[0];
07
08 if(UsuarioID.IsEmpty())
09 {
10 Response.Redirect(@href("~/ListUsers"));
11 }
12
13 var varQuery = "SELECT * FROM tbUsuarios WHERE IDUsuario =
@0";
14 var registro = bd.QuerySingle(varQuery, UsuarioID);
15
16 var Email = registro.Email;
17 var Senha = registro.Senha;
18
19 if(IsPost)
20 {
21 if(ModelState.IsValid)
22 {
23 bd.Execute("DELETE tbUsuarios WHERE IDUsuario = @0",
UsuarioID);
24 Response.Redirect(@href("~/ListUsers"));
25 }
26 }
27 }
28
29 <h1 style="color:Red;">Confirme os dados antes de remover</h1>
30
31 <div style="width:800px; margin-top:15px;">
32 <form method="post" "action=">
33 <table>
34 <tr>
35 <td>
36 Código do usuário:
37 </td>
38 </tr>
39 <tr>
40 <td>
41 @UsuarioID
42 </td>
43 </tr>
44 <tr>
45 <td>
46 E-mail do usuário:
47 </td>
48 </tr>
49 <tr>
50 <td>
51 @Email
52 </td>
53 </tr>
54 <tr>
55 <td>
56 <input type="submit" id="btnRemover"
value="Remover" />
57 </td>
58 </tr>
59 </form>
60 </table>
61
62 </div>
Página modelo
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>CRUD WebMatrix e Razor - @Page.Title</title>
<link href="@href("~/Styles/Site.css")" rel="stylesheet" />
</head>
<body>
<div id="page">
<div id="header">
<p class="site-title">FabricioSanchez.com.br / .NET
Interior</p>
<div id="login">
@if (WebSecurity.IsAuthenticated) {
<p>
Welcome <a
href="@href("~/Account/ChangePassword")" title="Change
password">@WebSecurity.CurrentUserName</a>!
<a
href="@href("~/Account/Logout")">Logout</a>
</p>
} else {
<ul>
<li><a
href="@href("~/Account/Register")">Register</a></li>
<li><a
href="@href("~/Account/Login")">Login</a></li>
</ul>
}
</div>
<ul id="menu">
<li><a href="@href("~/")">Home</a></li>
<li><a href="@href("~/Create")">Inserir
usuário</a></li>
<li><a href="@href("~/ListUsers")">Editar
usuário</a></li>
<li><a href="@href("~/ListUsers")">Remover
usuário</a></li>
</ul>
</div>
<div id="main">
<div id="content">
<h1>@Page.Title</h1>
@RenderBody()
</div>
<div id="footer">
© @DateTime.Now.Year - Minha página
</div>
</div>
</div>
</body>
</html>
Testando
Conclusão