Como funciona o UpdatePanel?    

Olá pessoal!

Hoje vou falar de um tema bem simples do WebForm, mas que muitas pessoas utilizam errado, acreditando que estão fazendo a coisa certa. Vou falar do UpdatePanel.

O UpdatePanel é um controle do Asp.Net Ajax, utilizado para renderizar partes parciais de uma tela sem a necessidade de fazer um completo PostBack. Isso todos já sabem.

Para saber como utilizá-lo, é necessário conhecer algumas propriedades básicas:

Triggers – É uma coleção de controles que têm a capacidade de fazer o conteúdo do UpdatePanel atualizar. Existem dois tipos: Assíncronos e Síncronos. Em geral, quando utilizamos UpdatePanel utilizamos apenas os tipos Assincronos, ou seja, que atualizam sem realizar o PostBack. o Triggers do tipo Síncrono tem o comportamento normal, realizando o PostBack da página inteira.
ChildrenAsTriggers – Indica se os controles internos de um UpdatePanel automaticamente serão tratados como Triggers. Caso essa propriedade esteja como false, para que um botão interno do UpdatePanel dispare uma atualização parcial este deve ser colocado na lista de Triggers.
UpdateMode – Indica se a atualização do UpdatePanel vai sempre acontecer quando um evento assíncrono ocorrer ou apenas quando for invocado o método Update do UpdatePanel a partir do Code-behind.
RenderMode – Não é uma propriedade tão importante, mas não custa nada conhecer. Essa propriedade indica como será renderizado o controle referente ao UpdatePanel no HTML.  Os possíveis valores são: Block, que é o padrão, e renderizará o controle como DIV; e a outra opção é Inline, que renderizará um SPAN.

Além de conhecer essas propriedades, também temos que saber que para utilizar um UpdatePanel, e qualquer outro controle do Asp.Net Ajax, temos que utilizar o controle ScriptManager. Esse controle é responsável por adicionar à página todos os JavaScripts necessários para fazer funcionar as capacidades Ajax do site. Ele deve ser adicionado antes de qualquer controle Ajax.

Com isso, já poderíamos criar uma página totalmente Ajax, apenas utilizando um ScriptManager, mas será que isso está certo? O intuito desse post é mais responder essa questão do que qualquer outra coisa.

Como funciona UpdatePanel

Antes de vermos aos boas práticas de utilização do UpdatePanel, precisamos saber como ele funciona. Lembre-se, não existe mágica, e saber como funciona pode ajudar muito a resolver problemas que parecem coisa de Murphy.

Muitas pessoas acham que apenas o conteúdo interno do UpdatePanel é enviado ao Server, e isso é um grande erro. A primeira coisa que devemos saber é que ao atualizarmos uma região de uma página, todos os campos Forms de da página são enviado para o servidor. Isso inclui controles como Input, Select, etc; que por sua vez inclui todo o ViewState da página.

Acredite, sem enviar todos os campos para o servidor, incluindo o ViewState, não seria possível você ler os valores dos campos no CodeBehind. Isso deveria ser óbvio, mas já vi muitas pessoas descordarem nesse ponto.

O que muda é o retorno, que virá apenas o que deve ser atualizado. No retorno, o que altera naturalmente não é a página inteira, mas apenas o conteúdo do UpdatePanel.

Com isso em mente, ao utilizar UpdatePanel, você deve saber:

Não importa quão pequeno seja seu UpdatePanel, o envio para o Server vai ser sempre o mesmo.

Além disso, o ciclo de vida da página permanece inalterado, ou seja, todos os eventos serão invocado da mesma forma como seriam em um PostBack padrão. Portanto, se você clicar no botão btnSalvar, não será apenas o método btnSalvar_Click que será invocado, mas também o PageLoad e outros métodos necessários para renderização, como PreReder e Render dos controles envolvidos.

Para isso, o Asp.Net também enviará informações extras que controlam essas informações, como o controle clicado.

Vamos a um exemplo.

Vou utilizar o código do post sobre exportar para Excel, adicionando funcionalidades Ajax. Meu HTML ficaria da seguinte forma:

   1: <asp:ScriptManager ID="mng" runat="server">
   2: </asp:ScriptManager>
   3: <h2>Exportando para Excel</h2>
   4: <p>Nome:<asp:TextBox ID="txtNome" runat="server"></asp:TextBox></p>
   5: <p>Idade:<asp:TextBox ID="txtIdade" runat="server"></asp:TextBox></p>
   6: <p>Email:<asp:TextBox ID="txtEmail" runat="server"></asp:TextBox></p>
   7: <p>
   8: <asp:Button Text="Salvar" runat="server" ID="btnSalvar" OnClick="btnSalvar_Click" />
   9: </p>
  10: <asp:UpdatePanel runat="server" >
  11:     <ContentTemplate>
  12:         <asp:GridView ID="grid" runat="server" AllowPaging="true" PageSize="5" AutoGenerateColumns="true"
  13:             OnPageIndexChanging="grid_PageIndexChanging">
  14:         </asp:GridView>
  15:     </ContentTemplate>
  16:     <Triggers>
  17:         <asp:AsyncPostBackTrigger ControlID="btnSalvar"  EventName="Click"/>
  18:     </Triggers>
  19: </asp:UpdatePanel>
  20: <asp:Button ID="btnExportar" Text="Exportar" runat="server" OnClick="btnExportar_Click" />

Veja que apenas adicionei o UpdatePanel e o ScriptManager. Não mudei nada no CodeBehind. Com isso minha página já está funcionando com Ajax.

Apesar do meu UpdatePanel estar apenas na Grid, veja que o envio para o server, quando eu clicar no botão Salvar, enviará o conteúdo dos campos de cadastro e o ViewState. Veja a imagem do Fiddler (Clique para ampliar).

Fiddler do UpdatePanel

Na Imagem acima estou mostrando que o envio inclui todo o conteúdo da página, que será o mesmo se não tiver UpdatePanel, mas o retorno retorna só o que deve ser atualizado, que deve ser a Grid, além da atualização do ViewState.

A única diferença é que se não tiver UpdatePanel, a página seria enviada inteira, e isso incluiria todas as tags HTML (head, body, etc), que não são enviadas no update assíncrono.

Como utilizar corretamente um UpdatePanel

Agora que entendemos como funciona, devemos saber algumas boas práticas, e responder àquela pergunta: “Será que estou fazendo certo?”. Por exemplo, muitas pessoas têm uma tela enorme de cadastro, e acredita que apenas colocando um único UpdatePanel na página toda o problema está resolvido. Realmente resolve, mas não da melhor forma.

Nessas situações, as vezes para atualizar um simples Combo, todo o conteúdo do formulário é atualizado assincronamente. Isso deixa a página extremamente lenta, pois é enviado um enorme conteúdo para o serve, e o retorno, que poderia ser apenas uma linha de HTML, acaba sendo a página inteira.

Para isso, segue algumas dicas para fazer suas páginas rápidas e bem feitas com utilização UpdatePanel, e evitar diversos erros inexplicáveis.

  1. Não utilize UpdatePanels que englobem a página toda, a não ser que sua página realmente seja pequena e tenha realmente que atualizar toda de uma vez.
  2. Utilize em geral a propriedade ChildrenAsTrigger como false a maior parte do tempo, ao menos que saiba realmente que é necessário que todos os filhos sejam Triggers.
  3. Utilize mais de um UpdatePanel na sua página. Um para cada pequeno contexto que deve ser atualizado de acordo com a navegação do usuário.
  4. Controle quais controles devem atualizar cada UpdatePanel através da coleção de Triggers de cada UpdatePanel.
  5. Saiba que um controle pode ser Trigger de mais de um UpdatePanel.
  6. Saiba que um controle dentro de um UpdatePanel pode ser Trigger de outro UpdatePanel.
  7. Utilize com cuidado as regras acima, uma quantidade exagerada de UpdatePanels e Triggers em uma página pode deixá-la pesada, devido a quantidade de Scripts. Além disso, alguns poucos Browsers tem dificuldade de limpar memória, e a atualização de HTML pode causar um estouro de memória (acredito, isso é possível).

Bom, com essas dicas acredito que seu uso de UpdatePanel vai ficar mais tranquilo, e terá menos erros desconhecidos.

Espero que possa ajudar.

Até o próximo.

21. julho 2011 05:36 by Frederico B. Emídio | Comments (6) | Permalink

Download de arquivo com UpdatePanel    

Olá pessoal!

Agora, vou fazer um post bem rápido sobre um erro que ocorre quando é tentado realizar download em uma página com UpdatePanel.

Não é um post para detalhar o uso de UpdatePanel, isso você pode ver aqui, mas apenas um de seus comportamentos.

É um post simples, apenas para responder um pergunta: Não é possível fazer download com UpdatePanel? A resposta é: Sim, é possível. Veremos como logo abaixo.

Tomando como base o post sobre exportar para Excel, vou acrescentar a funcionalidade Ajax a ele um pouco diferente do que fiz no post de UpdatePanel.

Como explicado no post anterior, o UpdatePanel só deve estar na região que deve ser atualizada, e com certeza um arquivo para ser baixado não deve estar na região de atualização.

Vamos ao código!

Veja o código abaixo, extraído do post de UpdatePanel:

   1: <asp:ScriptManager ID="mng" runat="server"></asp:ScriptManager>
   2: <h2>Exportando para Excel</h2>
   3: <p>Nome:<asp:TextBox ID="txtNome" runat="server"></asp:TextBox></p>
   4: <p>Idade:<asp:TextBox ID="txtIdade" runat="server"></asp:TextBox></p>
   5: <p>Email:<asp:TextBox ID="txtEmail" runat="server"></asp:TextBox></p>
   6: <p><asp:Button Text="Salvar" runat="server" ID="btnSalvar" OnClick="btnSalvar_Click" /></p>
   7: <asp:UpdatePanel runat="server" >
   8:     <ContentTemplate>
   9:         <asp:GridView ID="grid" runat="server" AllowPaging="true" PageSize="5" AutoGenerateColumns="true"
  10:             OnPageIndexChanging="grid_PageIndexChanging">
  11:         </asp:GridView>
  12:     </ContentTemplate>
  13:     <Triggers>
  14:         <asp:AsyncPostBackTrigger ControlID="btnSalvar"  EventName="Click"/>
  15:     </Triggers>
  16: </asp:UpdatePanel>
  17: <asp:Button ID="btnExportar" Text="Exportar" runat="server" OnClick="btnExportar_Click" />

Apesar dessa página estar utilizando UpdatePanel, o Download do botão btnExportar vai funcionar. Por que? Por que a ação dele não é assíncrona. Ele não é Trigger de nenhum UpdatePanel.

Veja bem, quando tentamos baixar um arquivo dentro de um UpdatePanel, o conteúdo retornado para o Browser não é um HTML válido, logo, não será possível adicioná-lo dentro do UpdatePanel e o Asp.Net/ JavaScript reclama.

Se utilizarmos o botão Exportar dentro do UpdatePanel, teremos um erro, veja a seguir:

   1: <asp:UpdatePanel runat="server" >
   2:     <ContentTemplate>
   3:         <asp:GridView ID="grid" runat="server" AllowPaging="true" PageSize="5" AutoGenerateColumns="true"
   4:             OnPageIndexChanging="grid_PageIndexChanging">
   5:         </asp:GridView>
   6:         <asp:Button ID="btnExportar" Text="Exportar" runat="server" OnClick="btnExportar_Click" />
   7:     </ContentTemplate>
   8:     <Triggers>
   9:         <asp:AsyncPostBackTrigger ControlID="btnSalvar"  EventName="Click"/>
  10:     </Triggers>
  11: </asp:UpdatePanel>

Agora, na linha 6, o meu botão está dentro do UpdatePanel, e como ao clicar nele o Asp.Net Ajax vai preparar tudo para fazer Assíncrono, ao ter o retorno inválido (um Excel, por exemplo, não é um retorno válido) vai gerar o erro, que pode variar de acordo com a versão do Framework utilizado.

Mas então só botões que estão fora de um UpdatePanel podem fazer download? Lógico que não! Se você tiver o botão em uma GridView, que deve estar dentro de um UpdatePanel, e ele deve realizar um download, como fazer? Ou por qualquer motivo o seu botão tem que estar dentro do UpdatePanel? Simples, coloque o evento do botão, ou da Grid, como um Trigger Síncrono. Veja:

   1: <asp:UpdatePanel runat="server" >
   2:     <ContentTemplate>
   3:         <asp:GridView ID="grid" runat="server" AllowPaging="true" PageSize="5" AutoGenerateColumns="true"
   4:             OnPageIndexChanging="grid_PageIndexChanging">
   5:         </asp:GridView>
   6:         <asp:Button ID="btnExportar" Text="Exportar" runat="server" OnClick="btnExportar_Click" />
   7:     </ContentTemplate>
   8:     <Triggers>
   9:         <asp:AsyncPostBackTrigger ControlID="btnSalvar"  EventName="Click"/>
  10:         <asp:PostBackTrigger ControlID="btnExportar" />
  11:     </Triggers>
  12: </asp:UpdatePanel>

Agora meu botão, que está dentro do UpdatePanel, vai consegui realizar o Download, porque na linha 10 eu o adicionei como um Trigger de PostBack normal (Síncrono).

Caso eu não faça isso, terei o seguinte erro (Asp.Net 4):

Erro em tempo de execução do Microsoft JScript: Sys.WebForms.PageRequestManagerParserErrorException: The message received from the server could not be parsed.

A mensagem pode mudar, como disse, de acordo com o FrameWork utilizado. Poderia ser:

Microsoft JScript runtime error: Sys.WebForms.PageRequestManagerParserErrorException: The message received from the server could not be parsed. Common causes for this error are when the response is modified by calls to Response.Write(), response filters, HttpModules, or server trace is enabled.

Como disse no post sobre UpdatePanel, não existe mágica. Internamente o Framework Ajax da Microsoft utilizar os objetos Ajax do Browser (XMLHttpRequest), assim como o Jquery faz, e através desses objetos não é possível realizar download. Você poderia transferir os bytes de um arquivo de forma assíncrona, mas não seria possível convertê-lo em arquivo, porquê o JavaScript, em geral, não tem permissão no Browser para realizar esse tipo de função (acessar IO, memória, etc). caso contrário seria muito fácil fazer vírus.

Bom, espero que ajude quem precise dessa ajuda.

Até o próximo.

20. julho 2011 21:09 by Frederico B. Emídio | Comments (10) | Permalink

Asp.Net MVC 4 – Novidades para CSS e JavaScript    

Olá pessoal!

Hoje vou fazer um post bem rápido, apenas para comentar sobre a nova versão do Asp.Net MVC.

Para quem não sabe, a equipe do Asp.Net já está planejando a nova versão do Asp.Net MVC, e maiores detalhes podem ser encontrados aqui.

Para planejar as melhorias, eles definiram cinco guidelines, e no momento oportuno falarei de cada uma delas. Essas Guidelines vão de publicação e temas para Mobile à publicação na de sites na Nuvem.

O que achei interessante, e quis escrever esse post para comentar, é um item de publicação de site extremamente útil. Apesar de eles falarem que são apenas planos, e que qualquer coisa pode mudar, acho interessante comentar.

Eles estão planejando realizar um Build Integrado para CSS e JavaScript. Uma coisa que sempre senti falta no momento de compilar Web Applicattion.

A idéia seria, no momento da compilação do seu site, realizar a combinação de todos os seus arquivos CSS e JavaScript em apenas um (Um de cada tipo, naturalmente), e após realizar a combinação, fazer a minificação, ou seja, tirar todos os espaços desnecessários e comentários, além de alterações de nomes de algumas variáveis e funções, para diminuir consideravelmente o tamanho do arquivo.

Isso faria seu site carregar bem mais rápido, pois iria diminuir o número de requests por recursos do site (seria apenas um para cada tipo de recurso), além de diminuir o tempo de downloads, graças ao arquivo minificado (minified). Se você utilizar o Fiddler, por exemplo, para ver como é gasto o tempo de download de suas páginas, verá que esses arquivos realmente fazem diferença no load da página.

Como todos sabem, já existem ferramentas de minified disponíveis na internet, mas fazer todo esse trabalho manualmente para cada arquivo, e eventualmente combinar esses arquivos é uma tarefa bem enfadonha, e essa nova feature do Asp.Net MVC seria de muita ajuda.

Vamos torcer para que o time realmente implemente essa funcionalidade, porque acredito que é tipo de anuncio que dá brilhos nos olhos, mas é esquecido durante o processo de desenvolvimento. Afinal, as implicações de alterar e combinar arquivos automaticamente são inúmeras, e não são apenas boas implicações, afinal, alteraria nome de arquivo, o que teria que validar todas as referências em arquivos aspx ou cshtml, etc.

Vamos aguarda para ver o que o time do Asp.Net mostrará nos próximos meses. Todas as novidades serão mostradas nesse blog.

Abraços e até o próximo.

19. julho 2011 04:54 by Frederico B. Emídio | Comments (0) | Permalink

Exportando para Excel com Asp.Net WebForms    

Boa noite Pessoal!

Depois de um longo tempo sem escrever nada devido à alguns projetos que estão me tomando todo o tempo, resolvi retornar os post respondendo algumas dúvidas que têm chegado até mim de amigos e leitores do Blog.

A maioria deles são relacionados a WebForms, então vou deixar um pouco Asp.Net MVC e JavaScript de lado, e voltar para o mundo WebForm, que ainda é o universo mais utilizado do Asp.Net e tem muita coisa interessante para mostrar.

A dúvida hoje é bem rápida e simples, vou mostra uma forma muito rápida de exporta dados para Excel.

É comum em qualquer projeto ter a necessidade de exportar alguma coisa para Excel, então é bom sempre ter alguma prática na manga, e essa dica pode ajudar muito.

Naturalmente, essa prática não vai resolver todas as situações. Para algumas necessidades mais complexas talvez seja necessário utilizar alguma ferramenta de terceiro, ou o OWC da Microsoft. Quando você quiser fazer alguma mais simples, como apenas exportar uma tabela, essa técnica vai te ajudar muito.

Excel e HTML

Um conhecimento que temos que ter quando trabalhos com Excel é saber que ele interpreta HTML, ou seja, se você fizer uma página simples, com um HTML puro, e colocar a extensão xls, sua página já abrirá no Excel sem problemas.

Se você estruturar uma tabela (table) bem direitinho, seu Excel vai ficar muito bom. Você poderá utilizar inclusive CSS para aplicar cores, cellpadding para mesclar, etc.

Solução

O objetivo deste post não é fazer um cadastro, e sim mostrar como exportar dados para um Excel, mas de qualquer forma, vou explicar como é minha aplicação.

É uma aplicação bem simples. Fiz um cadastro de pessoas com três campos, que não faz a menor validação de dados, porque não é esse o objetivo, e fiz a persistência com EntityFramework Code First, salvando os dados em um SQL Server CE.

Além dos campos para cadastro, também coloquei um GridView para mostrar meus dados. Minha tela ficou como o print abaixo:

Tela de cadastro WebForm

Para implementar o Modelo fiz as seguintes classes:

   1: public class Pessoa
   2: {
   3:     public int PessoaID { get; set; }
   4:     public string Nome { get; set; }
   5:     public int Idade{ get; set; }
   6:     public string Email{ get; set; }
   7: }
   8:  
   9: public class Modelo: DbContext
  10: {
  11:     public DbSet<Pessoa> Pessoas { get; set; }
  12: }

E meu HTML também é bem simples:

   1: <h2>
   2:    Exportando para Excel
   3: </h2>
   4: <p>Nome: <asp:TextBox ID="txtNome" runat="server"></asp:TextBox></p>
   5: <p>Idade: <asp:TextBox ID="txtIdade" runat="server"></asp:TextBox></p>
   6: <p>Email: <asp:TextBox ID="txtEmail" runat="server"></asp:TextBox></p>
   7: <p><asp:Button Text="Salvar" runat="server" id="btnSalvar" 
   8:        onclick="btnSalvar_Click" /></p>
   9:  
  10: <asp:GridView ID="grid" runat="server" AllowPaging="true" PageSize="5" 
  11:    AutoGenerateColumns="true" onpageindexchanging="grid_PageIndexChanging"></asp:GridView>
  12:  
  13: <asp:Button ID="btnExportar" Text="Exportar" runat="server" 
  14:    onclick="btnExportar_Click"/>

Sem segredos, o CodeBehind dessa página não podia ser mais objetivo:

   1: protected void Page_Load(object sender, EventArgs e)
   2: {
   3:    if (!IsPostBack)
   4:    {
   5:        var modelo = new Modelo();
   6:        grid.DataSource = modelo.Pessoas.ToList();
   7:        grid.DataBind();
   8:    }
   9: }
  10: protected void grid_PageIndexChanging(object sender, GridViewPageEventArgs e)
  11: {
  12:    var modelo = new Modelo();
  13:    grid.PageIndex = e.NewPageIndex;
  14:    grid.DataSource = modelo.Pessoas.ToList();
  15:    grid.DataBind();
  16: }
  17: protected void btnSalvar_Click(object sender, EventArgs e)
  18: {
  19:    var modelo = new Modelo();
  20:    var pessoa = new Pessoa{Nome= txtNome.Text, Email=txtEmail.Text , Idade=Int32.Parse(txtIdade.Text)};
  21:    modelo.Pessoas.Add(pessoa);
  22:    modelo.SaveChanges();
  23:    grid.DataSource = modelo.Pessoas.ToList();
  24:    grid.DataBind();
  25:    txtEmail.Text = txtNome.Text = txtIdade.Text = "";
  26: }
  27: protected void btnExportar_Click(object sender, EventArgs e)
  28: {
  29:    var modelo = new Modelo();
  30:    var tw = new StringWriter();
  31:    var hw = new HtmlTextWriter(tw);
  32:  
  33:    hw.WriteLine("<h1>Dados Exportados</h1><br/>");
  34:  
  35:    DataGrid grid = new DataGrid();
  36:    grid.DataSource = modelo.Pessoas.ToList();
  37:    grid.HeaderStyle.Font.Bold = true;
  38:    grid.DataBind();
  39:    grid.RenderControl(hw);
  40:  
  41:    Response.Clear();
  42:    Response.AppendHeader("content-disposition", "attachment; filename=Arquivo.xls");
  43:    Response.ContentType = "application/vnd.ms-excel";
  44:    Response.Charset = "utf-8";
  45:    Response.ContentEncoding = System.Text.Encoding.GetEncoding("ISO-8859-1");
  46:    this.EnableViewState = false;
  47:    Response.Write(tw.ToString());
  48:    Response.End();
  49: }

O PageLoad e o evento PageIndexChanging não requer explicação, é bem simples e é comumente utilizado em todas as aplicações WebForms. O evento do botão Salvar também é tranquilo, e está utilizando EF para persistir o cadastro (sem nenhuma validação) e logo em seguida ele realiza o bind ao GridView.

Tudo que importa mesmo para esse post é o método bntExportar_Click.

Como falei anteriormente, o Excel interpreta HTML, então o que esse método faz é gerar um HTML para nós. Vamos explica-lo linha a linha:

Da linha 29 e 31 não tem segredo. Estou criando as varáveis necessárias e as mais importante são o StringWriter e  HtmlTextWriter, essas variáveis são responsáveis para renderizar o HTML no Response da página.

Na linha 33 e crio um título para minha planilha, adicionando uma tag h1.

O segredo está entre as linhas 35 e 39. Nessas linhas eu estou criando uma tabela (tag <TABLE>) para ser uma tabela no Excel. Eu poderia criar tag por tag dentro de alguns FORs por exemplo, mas preferi utilizar um controle do WebForm para renderizar isso para mim.  No caso, estou utilizando o DataGrid para fazer toda a lógica de criar a tabela. Eu poderia utilizar um GridView, mas o DataGrid é mais leve para nosso objetivo.

Na linha 36 eu adiciono os dados ao meu DataGrid,

Na linha 37 eu defino que o cabeçalho da tabela deve ter as letras em negrito, para mostrar que podemos utilizar as opções do DataGrid para gerar o Excel. Essas opções incluem qualquer uma do DataGrid, tais como: eventos, estilos, etc.

Na linha 38 eu realizo o DataBind.

E na linha 39 eu rederizo, ou seja, gero o HTML na variável do tipo HtmlTextWriter (hw).

Entre as linhas 41 e 45 eu faço o tratamento geral da página, limpando o conteúdo total da página (41), colocando as diretivas para forçar o download da página (42), já que não queremos que ela seja renderizada no Browser, dizemos que o tipo da página é Excel (43) e definimos informações de encoding do arquivo (44 e 45).

Na linha 46 eu desabilito o ViewState, para que não tenha conteúdo desnecessário no meu Arquivo.

Na linha 47 eu escreve o meu HTML armazenado na variável tw ao conteúdo do meu Response. E finalizo a criação do meu Response na linha 48.

Fazendo isso, ao clicar no meu botão de exportar da página, minha página gerará um Excel como o da imagem abaixo:

Imagem de Excel gerado pelo Asp.Net

Novamente, muito simples!

O que deve ficar claro nesse post, é que podemos utilizar as classes/controles do Asp.Net para auxiliar-nos na geração do HTML, e que qualquer HTML pode ser utilizado para geração de Excel, então podemos combinar nossos conhecimentos e facilitar nossa vida em situações que aparentemente poderiam ser mais complicadas.

Essa solução funciona em todas as versões do WebForm, e também é possível utilizar em Asp.Net MVC, com algumas pequenas adaptações.

Espero que ajude e até o próximo post!

10. julho 2011 00:06 by Frederico B. Emídio | Comments (4) | Permalink

Sobre mim

Minha Imagem

Meu nome é Frederico Batista Emídio, trabalho com desenvolvimento de sistemas profissionalmente a oito anos, porém, já faço sites pessoais a pelo menos dez anos.

Para saber mais clique aqui.

Páginas

Calendário

<<  novembro 2017  >>
seteququsedo
303112345
6789101112
13141516171819
20212223242526
27282930123
45678910

Visualizar posts em um Calendário
Sigua @fredemidio

MCP Asp.NET