Exemplo de Aplicação Introdução ao ASP.NET – Módulo 07 – ADO.NET

Bom dia a todos.

Segue o exemplo implementado da aula de número 07 – Acesso a Dados utilizando SqlClient. Logo estarei disponibilizando o mesmo exemplo utilizando Entity Framework 6.0.

Segue descrição:

Projeto Veiculos DB

Está solução está dividida em 6 projetos, sendo eles:

1- FFB.Modulo7.Projeto: Projeto do tipo Web Application responsável por exibir ao usuário a interface Web com os formulários de consulta, adição, edição e remoção de dados (CRUD)

2- FFB.Modulo7.Entidades: Projeto do tipo Class Library que contém as Entidades (classes de domínio) da nossa solução. As entidades seguem a metodologia POCO (Plain Old CLR Objects) permitindo assim o uso das entidades através de uma framework de ORM (Object Relation-Mapping ou Mapeamento de Objeto Relacional, por exemplo Entity Framework ou NHibernate).

3- FFB.Modulo7.DAO: Projeto do tipo Class Library que contém apenas a interface IDAO (Interface com os métodos básicos a serem implementados por todas as classes DAO). Este projeto está a parte para permitir a implementação de outra camada DAO utilizando outras tecnologias, mantendo o baixo acoplamento entre a camada Controle e a de acesso a dados e com isto permitir a troca rápida e até em tempo de execução da camada de persistência.

4- FFB.Modulo7.ADONET.DAO: Projeto do tipo Class Library que contém a implementação de persistência utilizando as classes de acesso a dados do ADO.NET (SqlClient).

5- FFB.Modulo7.ADONET.DAO.Teste: Projeto do tipo Unit Test que realiza os testes unitários para a camada de acesso a dados.

6- FFB.Modulo7.Controle: Projeto do tipo Class Library que contém as classes de controle que realizam a chamada as camadas DAO.

Segue o diagrama da estrutura básica de dependências do Projeto

Imagem

 

Configuração:

1- Baixar e instalar o SQL Server 2008 Management Studio (http://www.microsoft.com/en-us/download/details.aspx?id=7593)

2- Após a instalação do Management Studio, deve-se verificar se a máquina contém alguma instância do SQL Server, para isto, na tela inicial da aplicação, aonde se pede o nome do Servidor, clique em BROWSE FOR MORE, expanda DATABASE ENGINE para ver o nome da instância instalada. Se nenhum aparecer, proceder com a instalação abaixo:

3- Baixar e instalar o SQL Server 2008, 2012 ou 2014 Express, Developer ou Professional. Por padrão o Express é instalado junto ao Visual Studio. Segue o link ensinando como verificar qual versão você já tem instalado do SQL na sua máquina: http://support.microsoft.com/kb/321185/pt-br

4- Executar o script abaixo para criar a base de dados

USE [master]
GO
/****** Object:  Database [VeiculosDB]    Script Date: 06/22/2014 11:07:44 ******/
CREATE DATABASE [VeiculosDB]
GO
IF (1 = FULLTEXTSERVICEPROPERTY('IsFullTextInstalled'))
begin
EXEC [VeiculosDB].[dbo].[sp_fulltext_database] @action = 'enable'
end
GO
ALTER DATABASE [VeiculosDB] SET ANSI_NULL_DEFAULT OFF
GO
ALTER DATABASE [VeiculosDB] SET ANSI_NULLS OFF
GO
ALTER DATABASE [VeiculosDB] SET ANSI_PADDING OFF
GO
ALTER DATABASE [VeiculosDB] SET ANSI_WARNINGS OFF
GO
ALTER DATABASE [VeiculosDB] SET ARITHABORT OFF
GO
ALTER DATABASE [VeiculosDB] SET AUTO_CLOSE OFF
GO
ALTER DATABASE [VeiculosDB] SET AUTO_CREATE_STATISTICS ON
GO
ALTER DATABASE [VeiculosDB] SET AUTO_SHRINK OFF
GO
ALTER DATABASE [VeiculosDB] SET AUTO_UPDATE_STATISTICS ON
GO
ALTER DATABASE [VeiculosDB] SET CURSOR_CLOSE_ON_COMMIT OFF
GO
ALTER DATABASE [VeiculosDB] SET CURSOR_DEFAULT  GLOBAL
GO
ALTER DATABASE [VeiculosDB] SET CONCAT_NULL_YIELDS_NULL OFF
GO
ALTER DATABASE [VeiculosDB] SET NUMERIC_ROUNDABORT OFF
GO
ALTER DATABASE [VeiculosDB] SET QUOTED_IDENTIFIER OFF
GO
ALTER DATABASE [VeiculosDB] SET RECURSIVE_TRIGGERS OFF
GO
ALTER DATABASE [VeiculosDB] SET  ENABLE_BROKER
GO
ALTER DATABASE [VeiculosDB] SET AUTO_UPDATE_STATISTICS_ASYNC OFF
GO
ALTER DATABASE [VeiculosDB] SET DATE_CORRELATION_OPTIMIZATION OFF
GO
ALTER DATABASE [VeiculosDB] SET TRUSTWORTHY OFF
GO
ALTER DATABASE [VeiculosDB] SET ALLOW_SNAPSHOT_ISOLATION OFF
GO
ALTER DATABASE [VeiculosDB] SET PARAMETERIZATION SIMPLE
GO
ALTER DATABASE [VeiculosDB] SET READ_COMMITTED_SNAPSHOT OFF
GO
ALTER DATABASE [VeiculosDB] SET HONOR_BROKER_PRIORITY OFF
GO
ALTER DATABASE [VeiculosDB] SET  READ_WRITE
GO
ALTER DATABASE [VeiculosDB] SET RECOVERY FULL
GO
ALTER DATABASE [VeiculosDB] SET  MULTI_USER
GO
ALTER DATABASE [VeiculosDB] SET PAGE_VERIFY CHECKSUM
GO
ALTER DATABASE [VeiculosDB] SET DB_CHAINING OFF
GO
EXEC sys.sp_db_vardecimal_storage_format N'VeiculosDB', N'ON'
GO
USE [VeiculosDB]
GO
/****** Object:  Table [dbo].[Marca]    Script Date: 06/22/2014 11:07:46 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[Marca](
	[Id] [int] IDENTITY(1,1) NOT NULL,
	[Nome] [nvarchar](max) NOT NULL,
PRIMARY KEY CLUSTERED
(
	[Id] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
/****** Object:  Table [dbo].[Modelo]    Script Date: 06/22/2014 11:07:46 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[Modelo](
	[Id] [int] IDENTITY(1,1) NOT NULL,
	[Nome] [nvarchar](max) NOT NULL,
	[Marca_Id] [int] NOT NULL,
PRIMARY KEY CLUSTERED
(
	[Id] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
/****** Object:  Table [dbo].[Moto]    Script Date: 06/22/2014 11:07:46 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[Moto](
	[Id] [int] IDENTITY(1,1) NOT NULL,
	[AnoFabricacao] [int] NOT NULL,
	[AnoModelo] [int] NOT NULL,
	[Chassi] [nvarchar](20) NOT NULL,
	[Cor] [nvarchar](max) NOT NULL,
	[Modelo_Id] [int] NOT NULL,
PRIMARY KEY CLUSTERED
(
	[Id] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
/****** Object:  Table [dbo].[Carro]    Script Date: 06/22/2014 11:07:46 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[Carro](
	[Id] [int] IDENTITY(1,1) NOT NULL,
	[AnoFabricacao] [int] NOT NULL,
	[AnoModelo] [int] NOT NULL,
	[Chassi] [nvarchar](20) NOT NULL,
	[Cor] [nvarchar](max) NOT NULL,
	[QtdPortas] [int] NOT NULL,
	[Modelo_Id] [int] NOT NULL,
PRIMARY KEY CLUSTERED
(
	[Id] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
/****** Object:  ForeignKey [FK__Modelo__Marca_Id__0519C6AF]    Script Date: 06/22/2014 11:07:46 ******/
ALTER TABLE [dbo].[Modelo]  WITH CHECK ADD FOREIGN KEY([Marca_Id])
REFERENCES [dbo].[Marca] ([Id])
GO
/****** Object:  ForeignKey [FK__Moto__Modelo_Id__0EA330E9]    Script Date: 06/22/2014 11:07:46 ******/
ALTER TABLE [dbo].[Moto]  WITH CHECK ADD FOREIGN KEY([Modelo_Id])
REFERENCES [dbo].[Modelo] ([Id])
GO
/****** Object:  ForeignKey [FK__Carro__Modelo_Id__09DE7BCC]    Script Date: 06/22/2014 11:07:46 ******/
ALTER TABLE [dbo].[Carro]  WITH CHECK ADD FOREIGN KEY([Modelo_Id])
REFERENCES [dbo].[Modelo] ([Id])
GO

5- Alterar a String de Conexão no Arquivo Web.Config e também no App.Config no projeto do Teste unitário, alterando a tag Data Source = para o nome doServidor\Instância caso tenha. Por exemplo connectionString=“Data Source=NOMEMAQUINA\SqlExpress;Initial Catalog=VeiculosDB;Integrated Security=True”

O projeto foi compilado no Visual Studio 2010 utilizando a .Net Framework 4.0

Segue link para download
-Slides: Modulo7
Exemplo: https://www.dropbox.com/s/dr2yrok7kynfn3d/FFB.Modulo7.Projeto.rar 

 

Publicado em ASP.NET, C#, LINQ, MasterPage, Orientação a Objeto, Sem categoria, System.Data.SqlClient, VS2010 | Marcado com , , , , , , | Deixe um comentário

PhotoOrganizer – Brincando com Diretórios e Arquivos através do System.IO

Pessoal, bom dia

Uma coisa boa de quem sabe programar, ou quer aprender, é sempre poder criar ferramentas para resolver os seus problemas sem ter de recorrer a programas da internet que por vezes não funcionam, carregam vírus e trojans ou não servem totalmente a nossa necessidade.

Pensando nisto surgiu a minha problemática:
Eu e minha esposa mantemos um Ateliê de Artes e Artigos de festa infantis (https://www.facebook.com/AtelieFlordePapel) eu sou o responsável por realizar todas as artes e para isto preciso salvar muitas imagens da internet. Um belo dia meu HD do notebook já estava quase cheio e verifiquei que eu tinha muitos arquivos repetidos, surgiu a ideia, vou criar uma aplicação para MOVER meus arquivos repetidos para um diretório a parte e de lá eu analiso e excluo eles.

A ideia é interessante, criei o Projeto PhotoOrganizer no #VS2013, porém, por que criar uma código que só funciona com foto, vamos fazer de forma que aceite qualquer tipo de arquivo.

Agora, vamos estudar a forma de comparação:

  1. Realizar a comparação através de nome dos arquivos: Não dá certo, A comparação que quero fazer é de conteúdo, nome não me diz nada.
  2. Comparar o Conteúdo do arquivo: Através da analise dos binários do arquivo eu consigo saber se eles são iguais, porém, é uma varredura um pouco mais lenta dependendo do tamanho do arquivo, precisamos criar uma verificação preliminar
  3. Comparar o Tamanho dos arquivos: Opa, agora sim…verifico se os arquivos tem o mesmo tamanho, se tiverem já é um possível sinal que são iguais, e trata-se de uma comparação bem mais rápida de ser feita. Caso eles tenham o mesmo tamanho eu passo para a comparação dos binário

Vamos agora programar:

O interessante deste projeto é que vamos estudar as classes e métodos do Namespace System.IO, biblioteca responsável por permitir trabalhar com arquivos físicos ou em memória, diretórios de arquivos…lendo, criando e apagando.

Para carregar um arquivo em memória no C# devemos instanciar a classe FileInfo, conforme exemplo:

FileInfo Finfo = new FileInfo("C:\\Temp\\Arquivo.jpg");

Através dela podemos, ler, deletar, mover, copiar um arquivo

Para carregar um diretório em memória, e capturar o arquivos que nele contém, utilizamos a classe DirectoryInfo, conforme exemplo:

DirectoryInfo dInfo = new DirectoryInfo("c:\\temp");
foreach (FileInfo fInfo in dInfo.GetFiles("*.jpg"))
{
// Faz alguma coisa com o arquivo
}

com isto montamos dois métodos principais, sendo o primeiro o responsável por comparar o tamanho dos arquivos:


private bool validaPorTamanho(FileInfo fInfoComparador, FileInfo fInfoComparado)
{
return fInfoComparador.Length.Equals(fInfoComparado.Length);
}

O segundo método é o principal , responsável por comparar os arquivos através do seu array de bytes


private bool validaPorConteudo(FileInfo afInfoComparador, FileInfo afInfoComparado)
{
// Indicador booleano de igualdade dos arquivos
bool abolArquivosIguais = true;

// Instância do Arquivo original

StreamReader lstremArquivoComparador = null;

// Instância do Arquivo a ser comparado

StreamReader lstremArquivoComparado = null;

// Array de Bytes do arquivo oringal

byte[] larrArquivoComparador = null;

// Array de Bytes do arquivo comparado

byte[] larrArquivoComparado = null;

try
{
//  Carrega os arquivos nas streams

lstremArquivoComparador = new StreamReader(afInfoComparador.FullName);

lstremArquivoComparado = new StreamReader(afInfoComparado.FullName);

/*Verifica se as stream não estão vázias
(pode acontecer caso o arquivo já tenha sido deletado)*/

if (lstremArquivoComparador != null && lstremArquivoComparado != null)
{
// Carrega os arrays de bytes
larrArquivoComparador = new byte[(int)lstremArquivoComparador.BaseStream.Length];
lstremArquivoComparador.BaseStream.Read(larrArquivoComparador, 0, (int)lstremArquivoComparador.BaseStream.Length);

larrArquivoComparado = new byte[(int)lstremArquivoComparado.BaseStream.Length];
lstremArquivoComparado.BaseStream.Read(larrArquivoComparado, 0, (int)lstremArquivoComparado.BaseStream.Length);

// Verifica novamente se os arrays tem o mesmo tamanho
if (larrArquivoComparador.Length == larrArquivoComparado.Length)
{
abolArquivosIguais = true;

// Realiza a comparação lendo binário a binário dos arquivos
for (int i = 0; i < larrArquivoComparador.Length; i++)
{
if (larrArquivoComparador[i] != larrArquivoComparado[i])
abolArquivosIguais = false;
}
}
else
{
abolArquivosIguais = false;
}
}
else { abolArquivosIguais = false; }
}
catch (Exception)
{
}
finally
{
// Ao final da execução, libera os arquivos
if (lstremArquivoComparador != null)
lstremArquivoComparador.Dispose();

if (lstremArquivoComparado != null)
lstremArquivoComparado.Dispose();
}
return abolArquivosIguais;
}

e agora vamos criar o método que sequenciar as comparações:


private bool comparaArquivos(FileInfo afInfoComparador, FileInfo afInfoComparado)
{
bool abolArquivosIguais = false;
abolArquivosIguais = this.validaPorTamanho(afInfoComparador, afInfoComparado);

if (abolArquivosIguais)
abolArquivosIguais = this.validaPorConteudo(afInfoComparador, afInfoComparado);

return abolArquivosIguais;

}

Agora que temos nossos métodos principais, vamos estrutura nosso projeto, como não precisamos de uma interface vamos fazer uma Console Application. Segue a estrutura básica:

Sem Título-2Pronto, temos o nosso projeto pronto 🙂

A primeira verificação de arquivos repetidos da minha máquina deu quase 2GB de imagens e 5 GB de mp3 🙂

Para baixar o código fonte, segue o link:

https://www.dropbox.com/s/vyztzsl7qr1tpzp/PhotoOrganizer.rar

Lembrando que o código foi compilado em .Net Framework 4.5 no Visual Studio 2013

 

Publicado em .Net Framework 4.5, C#, LINQ, Orientação a Objeto, System.IO, VS2013 | Marcado com , , , , , , | Deixe um comentário

Exemplo de Aplicação Introdução ao ASP.NET – Módulo 06 – Validando entrada do usuário

Boa tarde Segue o exemplo da Módulo 06, “Validando entrada do usuário”, seguindo tudo que foi visto na sala de aula e no slide da aula em anexo:

  1. O que é validação de usuário
  2. Validação Client-Side e Server Side
  3. Overview dos controles de validação ASP.NET
  4. Controles básicos para validação
    1. #RequiredFieldValidator
    2. #CompareValidator
    3. #RangeValidator
  5. Controle #RegularExpressionValidator
  6. Controle #CustomValidator

Modulo6

O exemplo está disponível em: https://www.dropbox.com/s/cvoxm6vq44yjmbf/FFB.Modulo6.rar

A aplicação está implementada com os seguintes requisitos:

  • Visual Studio 2010+
  • Microsoft .Net Framework 4.0
  • Jquery

Qualquer dúvida, estou aqui disposto a ajudar 🙂 Slides: Modulo6 Obrigado

Publicado em ASP.NET, C#, MasterPage, Orientação a Objeto, Validação | Deixe um comentário

Exemplo de Aplicação Introdução ao ASP.NET – Módulo 05 – MasterPage e WebUserControl

Bom dia

Segue exemplo da aula de número 05, #MasterPage e #WebUserControls, seguindo tudo que foi visto na sala de aula e no slide da aula em anexo:

  1. O que é MasterPage
  2. Como Criar uma página com Master Page
  3. Nested MasterPage (Aninhadas)
  4. Master Type
  5. Troca dinâmica de Master Page em tempo de execução

O exemplo está disponível no link

https://www.dropbox.com/s/g8meqil5wvhhc25/FFB.Modulo5.rar

A aplicação está implementada com os seguintes requisitos:

  • Visual Studio 2010+
  • Microsoft .Net Framework 4.0
  • Jquery
  • Bootstrap

A mesma contém quatro MasterPages de exemplo:

  1. Site.Master: Default do VS2010
  2. Bootstrap.Master: Master Page utilizando a framework de interface ao usuário (UI) #Bootstrap
  3. Layout.Master: Cópia da Site.Master mudando apenas o CSS
  4. NestedMasterPage.master: MasterPage aninhada com a Site.Master

O exemplo poderá alternar dinamicamente entre as Master Page 1 e 2, para isto basta clicar no nome de cada uma delas no Menu Superior.

A demonstração do Master Type está na parte inferior de cada Master Page, informando o nome da página que está sendo acessada.

 

Qualquer dúvida, estou aqui disposto a ajudar 🙂

Slides:  Módulo 05 – Introdução a MasterPage e WebUserControl

obrigado

Publicado em ASP.NET, Bootstrap, C#, MasterPage, Orientação a Objeto | 1 Comentário

Exemplo de Aplicação Introdução ao ASP.NET – Módulo 04

Boa noite, Conforme prometido em sala de aula, segue os exemplos do que foi visto em sala neste módulo e também o PPT do Módulo 04

O que contempla o exemplo:

  • Aplicação ASP.NET utilizando C# e .Net Framework 4.0
  • A masterPage está utilizando a biblioteca BootStrap, para exemplo de como utilizar arquivos Javascript na página
  • 4 exemplos que demonstram como utilizar e executar Handle Client-Side, Eventos do lado Cliente utilizando
    • Javascript
    • Jquery
  • Projeto Class Library com classes (entidades) de exemplo demonstrando entidades
    • Uso de de atributos privados e Propriedades de encapsulamento
    • Entidades com Propriedades Auto-Implementada (get;set;)
  • Exemplo completo (Interface, Separação de Camada, Funcional) de uma aplicação WEB que persiste os dados do cliente em um arquivo XML (Serialização) .

Download do exemplo: https://www.dropbox.com/s/7y616f6ml3rh7ey/FFB.Modulo4.rar

Slide: Modulo4

 

Publicado em ASP.NET, C#, Orientação a Objeto | Deixe um comentário

Recuperando dados com Microsoft Dynamics CRM 2011

Olá a todos,

iniciando aqui uma série de pequenos posts sobre Microsoft Dynamics CRM 2011. O primeiro será sobre recuperação de dados utilizando o SDK disponibilizado pela microsoft no endereço:

http://www.microsoft.com/en-us/download/details.aspx?id=24004

A primeira forma de consultar é a que considero mais simples de todas, dado uma entidade que desejo recuperar através de seu identificador iremos usar a abordagem Late-Bound (para maior entendimento, sugiro este artigo http://msdn.microsoft.com/en-us/library/gg327971.aspx) para se conectar ao servidor do CRM e recuperar a entidade.

Nossa missão, recuperar o Número do Ticket (TicketNumber) da Ocorrência (Incident) cujo identificador único é “FE69CAF4-1693-E211-B951-00155D01C805”

Para começar, precisamos adicionar a referência ao SDK do CRM ao nosso projeto, para isto devemos referenciar a biblioteca “sdk\bin\microsoft.xrm.sdk.dll”.  Aproveitando também devermos adicionar as bibliotecas:

  • System.Runtime.Serialization
  • System.ServiceModel

A nossa classe de consulta deverá conter as seguintes referências no topo:

using Microsoft.Xrm.Sdk;
using Microsoft.Xrm.Sdk.Client;
using Microsoft.Xrm.Sdk.Query;
using System;
using System.ServiceModel.Description;

Abaixo segue o Código Fonte que realiza a conexão ao servidor CRM através do Organization.SVC (para pegar o endereço do serviço: Na tela do CRM, clicar em Configurações > Personalizações > Recursos do Desenvolvedor  > Serviço da Organização).

//Uri da organição

Uri clientUri = new Uri("http://crm/My/XRMServices/2011/Organization.svc");

//Credenciais para conexão
ClientCredentials clientCredentials = new ClientCredentials();

clientCredentials = new ClientCredentials();

clientCredentials.UserName.UserName = "****\\olavoneto";

clientCredentials.UserName.Password = "******";

//Identificador da ocorrência

Guid incidentId = new Guid("FE69CAF4-1693-E211-B951-00155D01C805");

//Abrindo a conexão ao Serviço

using (OrganizationServiceProxy serviceProxy = new OrganizationServiceProxy(clientUri, null, clientCredentials, null))

{

//Instânciação da entidade, definido o tipo da mesma

Entity entity = new Entity("incident");

//Instânciação do ColumnSet, informando que desejamos todas as colunas no resultado

ColumnSet columnSet = new ColumnSet(true);

//Recuperação da entidade

entity = serviceProxy.Retrieve("incident",incidentId,columnSet);

//Capturando o Ticket da ocorrência

string ticketNumber = entity["ticketnumber"].ToString();

}

Assim, desta forma simples conseguimos recuperar entidades do CRM através de seu identificador. Para o próximo post faremos consultas recuperando várias entidades ao mesmo tempo.

Publicado em C#, Dynamics CRM | Marcado com , , , , | Deixe um comentário

Controlando abertura de janelas com Windows Forms

Uma das questões que tenho visto muito no Fórum MSDN é que vários usuários tem dúvidas é de como controlar corretamente a abertura de janelas em suas aplicações Windows Forms. Claro, abrir uma janela é algo bem simples, mas falo em gerenciar o ciclo de vidas das janelas, permitindo que somente uma delas fique possa ser aberta e também capturando valores das janelas abertas.

1. Form MDI

Vamos ao primeiro exemplo, uma janela MDI(multiple document interface) que irá comportar todas as janelas da nossa aplicação e controlar a abertura das janelas de modo que somente uma instância de cada janela possa existir durante a execução da aplicação.

Para começar, vamos criar um projeto Windows Forms, por padrão o Visual Studio irá criar um Form de nome Form1.cs, Ele será nossa janela MDI, para isso vamos alterar a propriedade do Form IsMdiContainer p/ TRUE conforme a imagem abaixo:

Agora iremos criar um novo Form. Para o exemplo, irei criar uma janela com um formulário para cadastrar usuários, algo bem simples, pedindo apenas o nome  e a data de nascimento do usuário, segue abaixo o layout da janela.

Criado a janela que deverá ser aberta, agora é será definido como isto será feito. Para o exemplo vamos criar um pequeno menu utilizando o controle MenuStrip, definindo apenas um Item e um Sub-Item.

Agora vamos digitar o código que irá controlar a abertura do nosso form, deixando que apenas uma instância da janela exista durante a execução e eliminando a janela da memória quando ela não for mais necessária. Se você prestar atenção essa descrição lembra uma Pattern (Padrão de projeto) conhecido como Singleton. Basicamente utilizaremos o principio deste padrão no nosso código, conforme pode ser visto no código abaixo:

/// <summary>
/// Declaração da váriavel do Form
/// </summary>
private CadUsu frmCadUsu = null;

/// <summary>
/// Abertura da Janela de Cadastro de Usuário
/// Baseado no pattern Singleton
/// Verificando se a janela já existe
/// Instânciando o form caso ela não exista
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void usuárToolStripMenuItem_Click(object sender, EventArgs e)
{
 if (frmCadUsu == null)
 {
   frmCadUsu = new CadUsu();
   frmCadUsu.MdiParent = this;
   frmCadUsu.Disposed += new EventHandler(frmCadUsu_Disposed);
   frmCadUsu.Show();
 }
}
/// <summary>
/// Evento que será disparado quando a janela for fechada
/// Eliminando o objeto da memória
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
void frmCadUsu_Disposed(object sender, EventArgs e)
{
   frmCadUsu = null;
}

Veja que o código é bem simples, basicamente controlamos a variável que recebe a janela em questão. Se ela for nula, instanciamos a janela, informando qual o FormMdi Pai e criando o evento que será disparado quando a janela for fechada. Este evento limpa a variável da janela, para que então, ela possa ser aberta novamente.

2. Recuperando um valor digitado no Form aberto
Agora que criamos o Form e já estamos controlando a sua criação, vamos retornar um valor do Form Instanciado. Para isso, vamos inserir o seguinte código na nossa janela CadUsu:

/// <summary>
/// Retorna o valor digitado no controle txtNome
/// </summary>
public string NomeUsuario
{
   get { return txtNome.Text; }
}

/// <summary>
/// Retorna a data selecionada no DtpDatNasc
/// </summary>
public DateTime DataNascimento
{
   get { return dtpDatNasc.Value; }
}

private void btnFechar_Click(object sender, EventArgs e)
{
   this.Close();
}

Para finalizar nosso pequeno exemplo, vamos capturar os valores quando a janela for fechada. Para isso teremos que utilizar outro evento da janela aberta, o FormClosing. Este evento é disparado durante o fechamento da janela, mas antes do dispose dos controles em memória. O código ficará assim:


/// <summary>
/// Declaração da váriavel do Form
/// </summary>
private CadUsu frmCadUsu = null;

/// <summary>
/// Abertura da Janela de Cadastro de Usuário
/// Baseado no pattern Singleton
/// Verificando se a janela já existe
/// Instânciando o form caso ela não exista
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void usuárToolStripMenuItem_Click(object sender, EventArgs e)
{
  if (frmCadUsu == null)
  {
      frmCadUsu = new CadUsu();
      frmCadUsu.MdiParent = this;
      frmCadUsu.FormClosing += new FormClosingEventHandler(frmCadUsu_FormClosing);
      frmCadUsu.Disposed += new EventHandler(frmCadUsu_Disposed);
      frmCadUsu.Show();
   }
}

/// <summary>
/// Evento que será disparado durante o fechamento da janela
/// aonde iremos capturar os valores das propriedades
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
void frmCadUsu_FormClosing(object sender, FormClosingEventArgs e)
{
   //Verifica se algum valor foi digitado
   if (frmCadUsu.NomeUsuario.Length > 0)
      this.mostraDadosUsuarios(frmCadUsu.NomeUsuario,
   frmCadUsu.DataNascimento);
}

/// <summary>
/// Mostra os dados do usuário
/// </summary>
/// <param name="p"></param>
/// <param name="dateTime"></param>
private void mostraDadosUsuarios(string _Nome, DateTime _DatNasc)
{
   int idadeUsu = DateTime.Now.Subtract(_DatNasc).Days / 360;
   MessageBox.Show(string.Format("Olá {0}, \r\n Você tem: {1} Anos", _Nome, idadeUsu));
}

/// <summary>
/// Evento que será disparado quando a janela for fechada
/// Eliminando o objeto da memória
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
void frmCadUsu_Disposed(object sender, EventArgs e)
{
   frmCadUsu = null;
}

Ao final, teremos uma tela mostrando o resultado dos dados digitados:

Bom, é isso. Eu sei que não foi um post de assuntos novos, nem nada de muito complicado, mas espero que ele ajude a quem precisa 🙂


Publicado em C#, Windows Forms | 1 Comentário