Arquivo

Archive for the ‘ASP.Net e C#’ Category

Exportar para Excel: Desktop

Olá.

Uma das muitas dúvidas que vejo em fórum de discussão é como exportar para o Microsoft Excel os dados de um Grid. Seja uma aplicação Web ou Desktop. Nesse artigo pretendo mostrar isso, por hora vamos aprender a importar através de uma aplicação Desktop.

Para esse exemplo crie uma aplicação Windows Application e crie uma conexão com uma base de dados acessando uma tabela simples. Ao form adicione um DataGridView e um Button conforme exemplo a seguir:

Para realizar esse exemplo, precisamos adicionar uma referencia do Microsoft Excel ao nosso projeto, para isso acesse Project >> Add Reference e na guia “COM” selecione Microsoft Excel 14.0 Object Library

No evento OnClick do botão adicione o seguinte código:

            string fileName = "";

            // Criando componente para salvar o arquivo no computador
            SaveFileDialog saveFileDialog = new SaveFileDialog();
            saveFileDialog.CheckPathExists = true;
            saveFileDialog.AddExtension = true;
            saveFileDialog.ValidateNames = true;
            saveFileDialog.InitialDirectory = Environment.GetFolderPath(Environment.SpecialFolder.Desktop);
            saveFileDialog.DefaultExt = ".xls";
            saveFileDialog.Filter = "Microsoft Excel Workbook (*.xls)|*.xls";

            if (saveFileDialog.ShowDialog() == DialogResult.OK)
            {
                fileName = saveFileDialog.FileName;

                var excelApp = new Excel.Application();

                // Deixa o objeto visivel
                excelApp.Visible = true;

                // Criando uma planilha no excel
                excelApp.Workbooks.Add();

                int ContadorLinha = dgvPessoa.Rows.Count;
                int ContadorColuna = dgvPessoa.Columns.Count;

                // Criando cabeçalho
                for (int i = 1; i < ContadorColuna + 1; i++)
                {
                    excelApp.Cells[1, i] = dgvPessoa.Columns[i - 1].HeaderText;
                }

                // Criando rodapé
                for (int i = 0; i < ContadorLinha; i++)
                {
                    for (int j = 0; j < ContadorColuna; j++)
                    {
                        if (dgvPessoa.Rows[i].Cells[j].Value == null)
                            continue;

                        excelApp.Cells[i + 2, j + 1] = dgvPessoa.Rows[i].Cells[j].Value.ToString();
                    }
                }

                // Salvando as informações no Excel
                excelApp.ActiveWorkbook.SaveCopyAs(fileName);
                excelApp.ActiveWorkbook.Saved = true;
                excelApp.Quit();

                MessageBox.Show("Arquivo salvo com sucesso.");

Bem simples, o próprio código é explicativo. Caso você queria aprender mais sobre o tema acesse aqui.

Até o próximo.

Categorias:ASP.Net e C# Tags:,

Partial Class – Parte 2

No artigo anterior expliquei com que são partial class e como utiliza-las. Nessa segunda parte do artigo vamos utilizar Partial Class com Entity Framework.

Para esse exemplo criei 3 tabelas em uma base de dados SQL Server, o script está logo abaixo:

CREATE TABLE [dbo].[UF](
	[CD_UF] [nchar](2) NOT NULL,
	[DS_UF] [nchar](10) NULL,
 CONSTRAINT [PK_UF] PRIMARY KEY CLUSTERED
(
	[CD_UF] 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

CREATE TABLE [dbo].[MUNICIPIO](
	[CD_MUNICIPIO] [numeric](10, 0) NOT NULL,
	[NM_MUNICIPIO] [varchar](100) NULL,
	[CD_UF] [nchar](2) NULL,
 CONSTRAINT [PK_MUNICIPIO] PRIMARY KEY CLUSTERED
(
	[CD_MUNICIPIO] 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

SET ANSI_PADDING OFF
GO

ALTER TABLE [dbo].[MUNICIPIO]  WITH CHECK ADD  CONSTRAINT [FK_MUNICIPIO_UF] FOREIGN KEY([CD_UF])
REFERENCES [dbo].[UF] ([CD_UF])
GO

ALTER TABLE [dbo].[MUNICIPIO] CHECK CONSTRAINT [FK_MUNICIPIO_UF]
GO

CREATE TABLE [dbo].[PESSOA](
	[CD_PESSOA] [numeric](10, 0) NOT NULL,
	[NM_PESSOA] [varchar](100) NULL,
	[CD_MUNICIPIO] [numeric](10, 0) NULL,
 CONSTRAINT [PESSOA_PK] PRIMARY KEY CLUSTERED
(
	[CD_PESSOA] 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

SET ANSI_PADDING OFF
GO

ALTER TABLE [dbo].[PESSOA]  WITH CHECK ADD  CONSTRAINT [PESSOA_MUNICIPIO_FK] FOREIGN KEY([CD_MUNICIPIO])
REFERENCES [dbo].[MUNICIPIO] ([CD_MUNICIPIO])
GO

ALTER TABLE [dbo].[PESSOA] CHECK CONSTRAINT [PESSOA_MUNICIPIO_FK]
GO

Insira alguns valores nessa tabela para utilizarmos em nosso exemplo.

Com valores preenchidos, abra o Visual Studio e crie um projeto do tipo Library Class em C#. Coloquei o nome do projeto de PartialClassWithEntity. Clique com o botão direito sobre o projeto em Add New Item selecione ADO.NET Entity Data Model. Chamei o arquivo de Partial.edmx.

Em Entity Data Model selecione Generate from database e clique em next. Na próxima tela você precisa selecionar a conexão com a base de dados que criamos nossas tabelas anteriormente. Talvez seja necessário você criar a conexão. Com a conexão criada marque a opção – Yes, include the sensitive data in the connection string – e a opção Save entity connection settings in App.Config as e coloque um nome para sua conexão entity no meu caso está PartialEntity e clique em next.

Na próxima tela selecione as 3 tabelas que criamos anteriormente e clique em Finish para que as entidades sejam criadas conforme a imagem abaixo.

Com o projeto Library pronto vamos adicionar outro projeto a solução clique na solution e em add new project.

Selecione um projeto do Tipo Console em C# com o nome de ConsolePartial. Com o projeto criado clique com o botão direito sobre ele e em Add Reference, selecione a guia Projects e o projeto PartialClassWithEntity que possui o Entity Framework.

Volte em Add new Reference, porém selecione a guia NET e selecione a biblioteca System.Data.Entity. Também copie o arquivo App.config do projeto PartialClassWithFramework para o projeto ConsolePartial (copie não recorte).

No arquivo Program.cs escreva o seguinte código:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using PartialClassWithEntity;

namespace ConsolePartial
{
    class Program
    {
        static void Main(string[] args)
        {
            using (PartialEntity ef = new PartialEntity())
            {
                IQueryable iqbPessoa = from p in ef.PESSOA select p;

                foreach (PESSOA p in iqbPessoa)
                {
                    Console.WriteLine(string.Format("Nome Pessoa: {0} - Município/UF: {1}", p.NM_PESSOA, p.MUNICIPIO.NM_MUNICIPIO));
                }
            }
            Console.Read();
        }
    }
}

Executando o código será possível visualizar os dados que inserimos na tabela PESSOA, porém veja que não conseguimos trazer a descrição da UNIDADE FEDERATIVA (UF). É claro que podemos concatenar a descrição da unidade federativa como no exemplo abaixo:

Console.WriteLine(string.Format("Nome Pessoa: {0} - Município/UF: {1} - {2}", p.NM_PESSOA, p.MUNICIPIO.NM_MUNICIPIO, p.MUNICIPIO.UF.DS_UF));

Porém e se a entidade PESSOA já tivesse uma propriedade com o nome do município concatenado com o nome da unidade federativa?

Volte ao projeto PartialClassWithEntity (nosso projeto Library) e crie uma nova class chamada PESSOA, a classe deve ser criada conforme abaixo:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace PartialClassWithEntity
{
    public partial class PESSOA
    {
        public string NM_MUNICIPOUF
        {
            get { return MUNICIPIO.NM_MUNICIPIO + " - " + MUNICIPIO.UF.DS_UF; }
        }
    }
}

Veja que criamos uma propriedade chamada NM_MUNICIPIOUF que quando realizamos o get, ele concatena os campos NM_MUNICIPIO E DS_UF. Compile o projeto class e altere o projeto console com a linha abaixo:

Console.WriteLine(string.Format("Nome Pessoa: {0} - Município/UF: {1}", p.NM_PESSOA, p.NM_MUNICIPOUF));

Pronto, através da partial class criamos uma nova propriedade para nossa class do entity framework, sendo que essa propriedade não faz relação com nenhuma coluna da tabela PESSOA. Podemos criar outras propriedades que podem ser úteis, utilizo partial em várias vezes em projeto com EF.

Lembre que a class partial deve estar na mesma namespace da classe principal senão o compilador vai entender como sendo duas classes diferentes. Outro detalhe importante, veja que o foreach está dentro do Using, isto porque para que nossa propriedade NM_MUNICIPOUF seja populada o Entity precisa estar aberto, caso ele esteja fechado um exception irá acontecer. Veja abaixo a maneira de como o código não irá funcionar.

        static void Main(string[] args)
        {
            IQueryable<PESSOA> iqbPessoa = null;

            using (PartialEntity ef = new PartialEntity())
            {
                iqbPessoa = from p in ef.PESSOA select p;
            }

            foreach (PESSOA p in iqbPessoa)
            {
                Console.WriteLine(string.Format("Nome Pessoa: {0} - Município/UF: {1}", p.NM_PESSOA, p.NM_MUNICIPOUF));
            }

            Console.Read();
        }

Executando o código acima uma exception (The ObjectContext instance has been disposed and can no longer be used for operations that require a connection.) será exibida.

Espero que tenha gostado e até a próxima.

Partial Class – Parte 1

Olá.

Um recurso acho muito interessante no .Net é a partial class. Partial class é uma forma de dividir a definição de uma class em mais de um único arquivo físico, porém ao compilar nossa class, o compilador irá interpretar como se fosse uma única class, vamos fazer um exemplo.

Vamos criar um projeto no visual studio do tipo Console Application, vou colocar o nome de ConsolePartialClass no projeto.

Crie uma class, chame o arquivo de Pessoa e coloque as seguintes propriedades:

    public class Pessoa
    {
        public int intCodigoPessoa { get; set; }

        public string strNomePessoa { get; set; }
    }

Crie uma segunda class, chame o arquivo de “PessoaJuridica” mas a class chame de pessoa, conforme abaixo:

    public partial class Pessoa
    {
        public string strNomeFantasia { get; set; }
    }

Veja que no código acima utilizamos a palavra partial antes da palavra class para informar ao compilador que essa class faz uma “união” com a class Pessoa.

Acesse o arquivo Program e instancie a class Pessoa e você poderá ter acesso as 3 propriedades que criamos, veja a imagem abaixo:

Esse foi um exemplo simples de como utilizar. Uma forma legal por exemplo é criar 2 arquivos físico e separar as propriedades em um arquivo e os métodos em outro arquivo.

Existem algumas regras a serem observadas:

  • As classes partial não podem ter modificadores de acesso diferente;
  • A classe principal e a que recebem o partial tem que estar na mesma namespace;
  • O que você definir em uma das classes, essa definição estará disponível para as demais classes;
Entre outras regras. Para complementar o conhecimento recomendo a leitura desse artigo do MSDN.
No próximo artigo pretendo demonstrar como utilizar Partial Class com Entity Framework.
Aguardem e até a próxima.
Categorias:ASP.Net e C# Tags:

MS Chart no Visual Studio 2010

janeiro 31, 2011 5 comentários

A Microsoft no Visual Studio 2008 no .Net Framework 3.5 disponibilizou o MS Chart, ou seja, gráficos, porém o MS Chart deveria ser instalado a parte, não acompanha o VS 2008. Com o Visual Studio 2010 no .Net Framework 4.0 isso mudou e o MS Chart foi disponibilizado nativamente.

Existem vários tipos de Chart como Column, Line, Pie, Doughnut, Point, Area entre outros. Nesse artigo vou explicar como desenvolver um gráfico em Column.

Para esse exemplo criei um banco de dados no SQL Server com três tabelas com a seguinte estrutura.

Esse modelo é só um exemplo para que possamos utilizar o MS Chart, após criar as tabelas, insira registros nessa tabela. Fique a vontade para adicionar a quantidade de registros que desejar.

Com nossa base de dados criada e populada, abra o Visual Studio e crie um projeto do tipo Web Application, chame o projeto de MSChart.

Abra a página Default.aspx.Primeiro passo é registrar na página Default.aspx que ela irá utilizar o MS Chart, então é necessário adicionar a declaração de registro, você pode colocar ela entre as tags <%Page > e <!DOCTYPE>. Segue abaixo o código de registro.

<%@ Register Assembly=”System.Web.DataVisualization, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35″    Namespace=”System.Web.UI.DataVisualization.Charting” TagPrefix=”asp” %>

Com essa tag adicionada, acesse a toolbox, na guia Data procure pelo componente Chart e o arraste para sua página Default.aspx.

O componente é exibido na tela. No canto superior direito existe um botão com uma seta para direita, clique nele e você visualizara algumas opção. Selecione a opção Choose Data Source e selecione a opção New Data Source para que a janela Data Source Configuration Wizard seja exibida.

Selecione SQL Database e chame nosso data source de dsVenda, conforme imagem abaixo.

Na tela seguinte será necessário informar a conexão com a base de dados, caso ela não exista você terá que criar.

Com a conexão criada, clique em next, será solicitado um nome para nossa conexão, fique a vontade para utilizar qualquer nome, no meu caso utilizei PEDIDOSConnectionString, clique em next.

Na tela Configure the Select Statement selecione a opção Specify a custom SQL statement or stored procedure e clique no botão next.

Na tela seguinte na guia SELECT em SQL statement coloque a seguinte consulta:

SELECT C.NOMECATEGORIA,
       SUM(D.QUANTIDADE) TOTALVENDA
  FROM CATEGORIA C INNER JOIN
       PRODUTO P ON P.CODIGOCATEGORIA = C.CODIGOCATEGORIA INNER JOIN
       DETALHESPEDIDO D ON D.CODIGOPRODUTO = P.CODIGOPRODUTO
 GROUP BY C.NOMECATEGORIA

Clique em Next e em Test Query clique no botão Test Query para verificar se a consulta está sendo executada corretamente. Clique em finish.

Acesse novamente a página Default.aspx, clique no componente Chart no botão localizado no canto superior direito, na opção X Value Member selecione NOMECATEGORIA e na opção Y value Members selecione TOTALVENDA. As informações devem ficar igual a imagem abaixo:

Agora execute seu projeto e visualize o resultado. Acesse também o Source da página Default.aspx para que você veja as informações que foram inseridas no Chart.

Espero que tenham gostado e até a próxima.

Categorias:ASP.Net e C# Tags:,

Formatação de Data

Muitos programadores já tiveram a necessidade de trabalhar com formatação de data e de valores no padrão do Brasil. Normalmente criamos uma função para obter essas informações.

No .NET Framework existe uma namespace chamada Globalization que define as informações relacionadas a uma determinada cultura (país) incluindo idioma, país, região, calendário, formatos de datas, moedas e números.

Vou criar um exemplo trabalhando com a formatação de datas.

Primeiro vamos criar um objeto do tipo CultureInfo que fornece informações sobre uma cultura específica, no nosso caso será português do Brasil.

System.Globalization.CultureInfo ciBrazil = new System.Globalization.CultureInfo("pt-BR");

Nesse exemplo já instanciamos a class definindo em seu construtor a cultura português do Brasil (pt-BR).

Agora vamos instanciar outro objeto do tipo DateTimeFormatInfo que armazena os formatodos de exibição de datas de uma determinada cultura.

System.Globalization.DateTimeFormatInfo dtfi = ciBrazil.DateTimeFormat;

Com o DateTimeFormatInfo vamos conseguir capturar a descrição do dia da semana ou do mês em português.

Crie um exemplo simples, em uma página ASP.Net coloque um botão e uma label, no evento click do botão coloque o seguinte código:

System.Globalization.CultureInfo ciBrazil = new System.Globalization.CultureInfo("pt-BR");

System.Globalization.DateTimeFormatInfo dtfi = ciBrazil.DateTimeFormat;

this.lblTeste.Text = string.Format("Hoje é {0} dia {1} de {2} do ano de {3}.", 
             ciBrazil.TextInfo.ToTitleCase(dtfi.GetDayName(DateTime.Today.DayOfWeek)),
             DateTime.Now.Day.ToString("00"),
             ciBrazil.TextInfo.ToTitleCase(dtfi.GetMonthName(DateTime.Today.Month)),
             DateTime.Now.Year);

Execute o exemplo e você terá o resultado.

Pesquise mais sobre esse namespace aqui.

Obrigado e até a próxima.

Web Site ou Web Application eis a questão

Atualmente onde trabalho tinha uma aplicação Web Site. Após algumas reuniões entre os desenvolvedores, decidimos migrar essa aplicação para Web Application. Qual a diferença? Quais as vantagens? Essas foram algumas das perguntas a quais pretendo informar agora.

Ambas têm suas vantagens e desvantagem, cabe a você desenvolvedor decidir qual utilizar para seu tipo de projeto.

Você gostaria de alterar seu código fonte durante a depuração?
Então você deve usar Web Site, pois Web Application não suporta essa funcionalidade.

Precisamos atualizar apenas alguns arquivos aspx ou aspx.cs ou editá-lo?
Web Site é a resposta, pois esse tipo de projeto tem o código fonte no servidor quando publicado. Quando necessário basta atualizar o arquivo sem a necessidade de atualizar o projeto.

Você pretende se conectar através do Visual Studio via FTP e editar seu projeto?
Se a resposta é sim, então você deve usar Web Site. E como a pergunta anterior à resposta é porque o código fonte do projeto fica no servidor.

Não quero deixar meu código fonte disponível no servidor.
Web Application é a resposta. Web Application são compilados e geram dll

Quero agilidade para atualizar meu projeto no servidor.
Se Web Application gera apenas dlls, para atualizar meu servidor é muito mais rápido do que Web Site, onde terei que subir todos meus arquivos aspx e aspx.cs.

Quero organizar minhas classes do meu jeito.
No projeto Web Site as classes são colocadas na pasta App_Code. Se quisermos criar uma organização própria é mais recomendado o Web Application.

Organização das Referências.
Web Site organiza as referencias do projeto no arquivo Web.Config, enquanto que Web Application realiza as referencias através da pasta References no próprio projeto.

Bem essas são algumas das diferenças entre Web Application e Web Site, cabe a você agora analisar e pesquisar para decidir qual opção utilizar em sua solução. Alguns membros da comunidade .NET acreditam que a Microsoft ira descontinuar o Web Site, porém eu não tenho essa informação.

Quando a mim, eu gosto de trabalhar com Web Application só acho uma pena não conseguir atualizar o code behind enquanto estamos depurando o código :D.

Obrigado e até a próxima.

Enviar E-mail com C#

Algumas dúvidas no forúm do MSDN são de como enviar e-mail com C# e isso é simples. Precisamos utilizar as referência System.Net.Email. Veja o código abaixo:

Primeiro instanciamos o objeto MailMessage, esse objeto que vamos definir qual o e-mail de origem. Adicionamos nesse objeto também o e-mail de destino, assunto, cópias do e-mail  (CC) e o corpo do e-mail (que pode ser no formato HTML, basta à propriedade IsBodyHtml ser true).

Segundo passo é instanciar o objeto SmtpClient que contem as configurações do e-mail de origem para enviar o e-mail (endereço SMTP e porta).

Terceiro passo é definir as credenciais (novamente o e-mail de origem e sua senha).

No fim realizamos o send para enviar o e-mail.

O código fonte está aqui em WPF.

Obrigado e até a próxima

Categorias:ASP.Net e C# Tags:,