ASP .NET - Imprimindo formulários e controles (C#)


Nesta dica eu reproduzo um artigo muito interessante de Raul Kumar que mostra como imprimir formulários e controles de uma página ASP .NET.

Foi criada uma classe chamada PrintWeb e um método chamado PrintWebControl que é usado para imprimir qualquer controle de servidor como GridView, DataGrid, Panel, TextBox, etc...

Vejamos como isso foi feito...

Abra o Visual Web Developer 2008 Express Edition e crie um novo web site (Menu File->New web site) e defina as seguintes opções:

Agora vamos criar a classe PrintWeb.cs da seguinte forma. No menu WebSite selecione Add New Item e selecione o template Class, escolha a linguagem C# e informe o nome PrintWeb.cs e clique no botão Add;

Será solicitada uam confirmação para incluir o arquivo na pasta App_Code, Confirme;

No arquivo PrintWeb.cs defina os seguintes namespace:

using System;
using System.Data;
using System.Configuration;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Xml.Linq;
using System.IO;
using System.Text;

A seguir defina o seguinte código:

    public static void PrintWebControl(Control ctrl)
    {
        PrintWebControl(ctrl, string.Empty);
    }
    public static void PrintWebControl(Control ctrl, string Script)
    {
        StringWriter stringWrite = new StringWriter();
        System.Web.UI.HtmlTextWriter htmlWrite = new System.Web.UI.HtmlTextWriter(stringWrite);
        if (ctrl is WebControl)
        {
            Unit w = new Unit(100, UnitType.Percentage); ((WebControl)ctrl).Width = w;
        }
        Page pg = new Page();
        pg.EnableEventValidation = false;
        if (Script != string.Empty)
        {
            pg.ClientScript.RegisterStartupScript(pg.GetType(), "PrintJavaScript", Script);
        }
        HtmlForm frm = new HtmlForm();
        pg.Controls.Add(frm);
        frm.Attributes.Add("runat", "server");
        frm.Controls.Add(ctrl);
        pg.DesignerInitialize();
        pg.RenderControl(htmlWrite);
        string strHTML = stringWrite.ToString();
        HttpContext.Current.Response.Clear();
        HttpContext.Current.Response.Write(strHTML);
        HttpContext.Current.Response.Write("<script>window.print();</script>");
        HttpContext.Current.Response.End();
    }

Definimos dois métodos sobrecarregados PrintWebControl que usaremos para imprimir os controles da páginas ASP .NET.

Agora vamos definir na página Default.aspx alguns controles conforme o leiaute abaixo:

O código da página acima é mostrado abaixo:
<%@ Page Language="C#" AutoEventWireup="true"  CodeFile="Default.aspx.cs" Inherits="_Default" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title>Untitled Page</title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
            <asp:Panel ID="pnl1" runat="server">
                <table cellpadding="4" cellspacing="4" width="50%" align="center">
                    <tr>
                        <td align="center">
                            Cadastro</td>
                    </tr>
                    <tr>
                        <td>
                            <asp:Label ID="Label1" runat="server" Text="Email" Width="130px"></asp:Label>
                            <asp:TextBox ID="TextBox1" runat="server" Width="207px"></asp:TextBox>
                        </td>
                    </tr>
                    <tr>
                        <td>
                            <asp:Label ID="Label2" runat="server" Text="Nome" Width="130px"></asp:Label>
                            <asp:TextBox ID="TextBox2" runat="server" Width="202px"></asp:TextBox>
                        </td>
                    </tr>
                    <tr>
                        <td>
                            <asp:Label ID="Label6" runat="server" Text="Pais" Width="130px"></asp:Label>
                            <asp:TextBox ID="TextBox5" runat="server"></asp:TextBox>
                        </td>
                    </tr>
                    <tr>
                        <td>
                            <asp:Label ID="Label3" runat="server" Text="Telefone" Width="130px"></asp:Label>
                            <asp:TextBox ID="TextBox3" runat="server"></asp:TextBox>
                        </td>
                    </tr>
                    <tr>
                        <td style="text-align: center">
                            <asp:Button ID="btnPrint" runat="server" OnClick="btnPrint_Click" 
                                Text="Imprimir" />
                        </td>
                    </tr>
                </table>
            </asp:Panel>    
    </div>
    </form>
</body>
</html>

Esta página será exibida quando da execução do web site.

No arquivo code-behind Default.aspx.cs temos que definir o código do evento Click do botão de comando Imprimir:

    protected void btnPrint_Click(object sender, EventArgs e)
    {
        Session["ctrl"] = pnl1;
        ClientScript.RegisterStartupScript(this.GetType(), "onclick", _ 
"<script language=javascript>window.open('Imprimir.aspx','Imprimir','height=300px,width=300px,scrollbars=1');</script>");
    }

Observe que definimos um código javascript para abrir uma página chamada Imprimir.aspx. Precisamos então criar a página Imprimir.aspx no menu WebSite->Add New Item e selecione Web Form e informe o nome Imprimir.aspx;

A seguir defina no arquivo Imprimir.aspx no evento Load o seguinte código:

   protected void Page_Load(object sender, EventArgs e)
    {
        Control ctrl = (Control)Session["ctrl"];
        Printweb.PrintWebControl(ctrl);
    }

Com isso estamos prontos para testar a nossa aplicação:

Ao ser iniciada a aplicação apresenta a página Default.aspx conforme abaixo:

Clicando no botão Imprimir a página Imprimir.aspx exibira o formulário a ser impresso e janela de diálogo Imprimir;

Ao clicar no botão para imprimir o formulário será impresso com os controles da página.

Pegue o projeto completo aqui: imprimirASPNET.zip

Aguarde mais artigos sobre ASP .NET...

Referências:


José Carlos Macoratti