none
imprimir en C#

    Question

  • hola a todos,

    tengo un windows form, en el qual tengo datos en textbox i datagrids que deseo imprimir, alguien puede decirme como puedo hacerlo?? la idea seria que la misma ventana tuviese un boton que al darle te saliera una factura imprimida con todos los datos
    gracias!!!!
    • Moved by Fran DiazModerator Friday, May 29, 2009 8:22 AM Reporting ([Loc]From:Lenguaje C#)
    Thursday, May 17, 2007 3:51 PM

Answers

  • Para imprimir la pantalla es necesario básicamente capturar la pantalla en memoria y luego usar un PrintDocument para realizar la impresión. Por acá un ejemplo:

     

    Code Snippet

    using System;

    using System.Collections.Generic;

    using System.ComponentModel;

    using System.Data;

    using System.Drawing;

    using System.Text;

    using System.Windows.Forms;

    using System.Drawing.Printing;

     

    namespace WindowsApplication4

    {

        public partial class Form1 : Form

        {

            private Button botonImprimir = new Button();

            private PrintDocument printDocument1 = new PrintDocument();

     

     

            public Form1()

            {

                botonImprimir.Text = "Imprimir Formulario";

                botonImprimir.Click += new EventHandler(printButton_Click);

                printDocument1.PrintPage += new PrintPageEventHandler(printDocument1_PrintPage);

                this.Controls.Add(botonImprimir);

            }

     

            void printButton_Click(object sender, EventArgs e)

            {

                CapturarPantalla();

                printDocument1.Print();

            }

     

            Bitmap imagen;

     

            private void CapturarPantalla()

            {

                Graphics g = this.CreateGraphics();

                Size s = this.Size;

                imagen = new Bitmap(s.Width, s.Height, g);

                Graphics g2 = Graphics.FromImage(imagen);

                g2.CopyFromScreen(this.Location.X, this.Location.Y, 0, 0, s);

            }

     

            private void printDocument1_PrintPage(System.Object sender,

                   System.Drawing.Printing.PrintPageEventArgs e)

            {

                e.Graphics.DrawImage(imagen, 0, 0);

            }

     

        }

    }

     

    Saludos,

    Friday, May 18, 2007 4:26 AM
  • El siguiente artículo creo que te viene como anillo al dedo:

     

    http://www.codeproject.com/csharp/printform.asp

     

    Un saludete!

    Thursday, May 17, 2007 9:31 PM

All replies

  • El siguiente artículo creo que te viene como anillo al dedo:

     

    http://www.codeproject.com/csharp/printform.asp

     

    Un saludete!

    Thursday, May 17, 2007 9:31 PM
  • Para imprimir la pantalla es necesario básicamente capturar la pantalla en memoria y luego usar un PrintDocument para realizar la impresión. Por acá un ejemplo:

     

    Code Snippet

    using System;

    using System.Collections.Generic;

    using System.ComponentModel;

    using System.Data;

    using System.Drawing;

    using System.Text;

    using System.Windows.Forms;

    using System.Drawing.Printing;

     

    namespace WindowsApplication4

    {

        public partial class Form1 : Form

        {

            private Button botonImprimir = new Button();

            private PrintDocument printDocument1 = new PrintDocument();

     

     

            public Form1()

            {

                botonImprimir.Text = "Imprimir Formulario";

                botonImprimir.Click += new EventHandler(printButton_Click);

                printDocument1.PrintPage += new PrintPageEventHandler(printDocument1_PrintPage);

                this.Controls.Add(botonImprimir);

            }

     

            void printButton_Click(object sender, EventArgs e)

            {

                CapturarPantalla();

                printDocument1.Print();

            }

     

            Bitmap imagen;

     

            private void CapturarPantalla()

            {

                Graphics g = this.CreateGraphics();

                Size s = this.Size;

                imagen = new Bitmap(s.Width, s.Height, g);

                Graphics g2 = Graphics.FromImage(imagen);

                g2.CopyFromScreen(this.Location.X, this.Location.Y, 0, 0, s);

            }

     

            private void printDocument1_PrintPage(System.Object sender,

                   System.Drawing.Printing.PrintPageEventArgs e)

            {

                e.Graphics.DrawImage(imagen, 0, 0);

            }

     

        }

    }

     

    Saludos,

    Friday, May 18, 2007 4:26 AM
  • muchíssimas gracias!!!!!!!!!!!!, xo lo q realemente buscava era como imprimir los datos de un windows form, xo no imprimir una captura de pantalla. Sino que cargar los datos que tengo en un documento i imprimir-lo.

    Monday, May 21, 2007 11:34 AM
  • Que entiendes por documento?
    Monday, May 21, 2007 12:00 PM
  • Te refieres a un reporte???

     

    Salu2

     

    Colabora con el foro: Si la respuesta te es de utilidad marca la pregunta como respondida.

    Luis Ruiz Pavón

    MCP

    Blog: http://geeks.ms/blogs/lruiz

    Monday, May 21, 2007 12:15 PM
  • si supongo que debe ser un reporte, es que no lo tengo muy claro como va el tema de impresion.
    a un reporte, le cargas los datos, en mi caso los que tengo en pantalla i seguidamente lo diseñas para imprimir, no??
    Monday, May 21, 2007 1:37 PM
  • Yo creo que sería mejor que le pasases un DataSet mejor que los campos del formulario.

     

    Salu2

     

    Colabora con el foro: Si la respuesta te es de utilidad marca la pregunta como respondida.

    Luis Ruiz Pavón

    MCP

    Blog: http://geeks.ms/blogs/lruiz

    Monday, May 21, 2007 1:48 PM
  • Te sugiero revises la creación de reportes utilizando Crystal Reports y también utilizando Reporting Services. Estos links te ayudarán:

     

    http://support.businessobjects.com/communityCS/TechnicalPapers/rtm_designerandwinformsviewer.pdf?ExtCmp=null

    http://msdn2.microsoft.com/en-us/library/aa964126.aspx

     

    Saludos,

    Monday, May 21, 2007 2:37 PM
  • Buenas,
    Yo estoy haciendo una aplicación y tampoco me aclaro con el tema de impresión.
    Utilizo la version de crystal report que lleva VS2005, pero tengo una duda.
    En un winform tengo un datagrid con valores que he añadido. Cuando hago el reporte selecciono el dataset correspondiente pero me muestra todos los valores que tiene, y solo quiero los pertenecientes a aquel datagrid.Si por ejemplo una tabla que tengo de materials tiene 5 y el datagrid tiene 3, me muestra los 5. Como puedo hacerlo?

    gracias
    Monday, May 21, 2007 2:42 PM
  • Aqui les paso mi codigo que utilizo para mandar a imprimir un report (rldc), espero que les sirva:

     

    Code Snippet

    using System;

    using System.Collections.Generic;

    using System.Text;

    using System.Diagnostics;

    using System.IO;

    using System.Data;

    using System.Data.SqlClient;

    using System.Drawing.Imaging;

    using System.Drawing.Printing;

    using System.Windows.Forms;

    using Microsoft.Reporting.WinForms;

    using System.Reflection;

    using System.Xml;

    using System.Xml.XPath;

     

    namespace ReportViewer

    {

    class Program : IDisposable

    {

    private int m_currentPageIndex;

    private IList<Stream> m_streams;

    private void Run(string conn, string namereport, string namedataset, string sqldata, string printername, string nametable)

    {

    try

    {

    LocalReport reporttemp = new LocalReport();

    reporttemp.ReportPath = namereport;

    DataSet dataset = sqldataset(conn, sqldata, nametable);

    ReportDataSource dsdata = new ReportDataSource();

    dsdata.Name = namedataset;

    dsdata.Value = dataset.Tables[nametable];

    reporttemp.DataSources.Add(dsdata);

    Export(reporttemp, namereport, namedataset);

    m_currentPageIndex = 0;

    PrintDocument printdoc = new PrintDocument();

    string DisplayName = DateTime.Now.Day.ToString() + DateTime.Now.Month.ToString() + DateTime.Now.Year.ToString() + "_" + DateTime.Now.Minute.ToString() + DateTime.Now.Second.ToString() + DateTime.Now.Millisecond.ToString();

    printdoc.DocumentName = DisplayName;

    if (printername != "Impresora predeterminada")

    {

    printdoc.PrinterSettings.PrinterName = printername;

    }

    printdoc.PrintPage += new PrintPageEventHandler(PrintPage);

    printdoc.Print();

    }

    catch (Exception ex)

    {

    string MsgError = ex.Message;

    MessageBox.Show(MsgError, "Error en Run");

    }

    }

    private DataSet sqldataset(string conn, string sqldata, string nametable)

    {

    DataSet data = new DataSet();

    try

    {

    SqlConnection con = new SqlConnection(conn);

    SqlCommand cmd = new SqlCommand(sqldata, con);

    SqlDataAdapter dadata = new SqlDataAdapter(cmd);

    dadata.Fill(data, nametable);

    con.Dispose();

    con.Close();

    }

    catch (Exception ex)

    {

    string MsgError = ex.Message;

    MessageBox.Show(MsgError, "Error en sqldataset");

    }

    return data;

    }

    private void Export(LocalReport report, string namereport, string namedataset)

    {

    try

    {

    string PageWidth = "0cm", PageHeight = "0cm", BottomMargin = "0cm", RightMargin = "0cm", TopMargin = "0cm", LeftMargin = "0cm";

    datasetname(namereport, ref PageWidth, ref PageHeight, ref BottomMargin, ref RightMargin, ref TopMargin, ref LeftMargin);

    string deviceInfo =

    "<DeviceInfo>" +

    " <OutputFormat>EMF</OutputFormat>" +

    " <PageHeight>" + PageHeight + "</PageHeight>" +

    " <PageWidth>" + PageWidth + "</PageWidth>" +

    " <MarginTop>" + TopMargin + "</MarginTop>" +

    " <MarginLeft>" + LeftMargin + "</MarginLeft>" +

    " <MarginRight>" + RightMargin + "</MarginRight>" +

    " <MarginBottom>" + BottomMargin + "</MarginBottom>" +

    "</DeviceInfo>";

    Warning[] warnings;

    m_streams = new List<Stream>();

    report.Render("Image", deviceInfo, CreateStream, out warnings);

    foreach (Stream stream in m_streams)

    stream.Position = 0;

    }

    catch (Exception ex)

    {

    string MsgError = ex.Message;

    MessageBox.Show(MsgError, "Error en Export");

    }

    }

    private void datasetname(string namereport, ref string PageWidth, ref string PageHeight, ref string BottomMargin, ref string RightMargin, ref string TopMargin, ref string LeftMargin)

    {

    try

    {

    namereport = namereport.Trim();

    XmlDocument report = new XmlDocument();

    report.Load(namereport);

    XPathNavigator navigator = report.CreateNavigator();

    XmlNamespaceManager manager = new XmlNamespaceManager(navigator.NameTable);

    manager.AddNamespace("bk", "http://schemas.microsoft.com/sqlserver/reporting/2005/01/reportdefinition");

    foreach (XPathNavigator nav in navigator.Select("//bk:PageWidth", manager))

    {

    PageWidth = nav.Value;

    }

    foreach (XPathNavigator nav in navigator.Select("//bk:PageHeight", manager))

    {

    PageHeight = nav.Value;

    }

    foreach (XPathNavigator nav in navigator.Select("//bk:BottomMargin", manager))

    {

    BottomMargin = nav.Value;

    }

    foreach (XPathNavigator nav in navigator.Select("//bk:RightMargin", manager))

    {

    RightMargin = nav.Value;

    }

    foreach (XPathNavigator nav in navigator.Select("//bk:TopMargin", manager))

    {

    TopMargin = nav.Value;

    }

    foreach (XPathNavigator nav in navigator.Select("//bk:LeftMargin", manager))

    {

    LeftMargin = nav.Value;

    }

    }

    catch (Exception ex)

    {

    string MsgError = ex.Message;

    MessageBox.Show(MsgError, "Error en datasetname");

    }

    }

    public void Dispose()

    {

    if (m_streams != null)

    {

    foreach (Stream stream in m_streams)

    stream.Dispose();

    m_streams = null;

    }

    }

    private Stream CreateStream(string name, string fileNameExtension, Encoding encoding, string mimeType, bool willSeek)

    {

    try

    {

    string imp = @"\Mis reportes\EMF\";

    string path = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);

    path = path + imp;

    path = path.Trim();

    Stream stream = new FileStream(path + name + "." + fileNameExtension, FileMode.Create);

    m_streams.Add(stream);

    return stream;

    }

    catch (Exception ex)

    {

    string MsgError = ex.Message;

    MessageBox.Show(MsgError, "Error en Stream");

    }

    return null;

    }

    private void PrintPage(object sender, PrintPageEventArgs e)

    {

    try

    {

    Metafile pageImage = new Metafile(m_streams[m_currentPageIndex]);

    e.Graphics.DrawImage(pageImage, e.PageBounds);

    m_currentPageIndex++;

    e.HasMorePages = (m_currentPageIndex < m_streams.Count);

    }

    catch (Exception ex)

    {

    string MsgError = ex.Message;

    MessageBox.Show(MsgError, "Error en PrintPage");

    }

    }

    static void Main(String[] args)

    {

    string conn = "", namereport = "", namedataset = "", sqldata = "", printername = "", nametable = "", texto = "";

    int tam = 0, j = 0, err = 0, opt = 0;

    if (args.Length == 0)

    {

    MessageBox.Show("No se han podido realizar la operacion, favor de intentarlo de nuevo", "Error");

    }

    else

    {

    tam = Convert.ToInt16(args.Length.ToString());

    for (int i = 0; i < tam; i++)

    {

    texto = args[i].ToString();

    if (texto == "#")

    j++;

    else

    {

    switch (j)

    {

    case 0:

    {

    conn += args[i].ToString();

    conn += " ";

    break;

    }

    case 1:

    {

    namereport += args[i].ToString();

    namereport += " ";

    break;

    }

    case 2:

    {

    namedataset += args[i].ToString();

    namedataset += " ";

    break;

    }

    case 3:

    {

    nametable += args[i].ToString();

    nametable += " ";

    break;

    }

    case 4:

    {

    sqldata += args[i].ToString();

    sqldata += " ";

    break;

    }

    case 5:

    {

    printername += args[i].ToString();

    printername += " ";

    break;

    }

    case 6:

    {

    opt = Convert.ToInt16(args[i].ToString());

    break;

    }

    default:

    {

    MessageBox.Show("Sobrecarga de argumentos, favor de verificar", "Error");

    err = 12;

    break;

    }

    }

    }

    }

    if (err != 12)

    {

    if (opt != 0)

    {

     

    conn = conn.Trim();

    namereport = namereport.Trim();

    namedataset = namedataset.Trim();

    nametable = nametable.Trim();

    sqldata = sqldata.Trim();

    printername = printername.Trim();

    if ((opt == 2) || (opt == 3))

    {

    try

    {

    using (Program pro = new Program())

    {

    pro.Run(conn, namereport, namedataset, sqldata, printername, nametable);

    }

    }

    catch (Exception ex)

    {

    string MsgError = ex.Message;

    MessageBox.Show(MsgError, "Error en ejecutar impresion");

    }

    }

    else if (opt == 1)

    {

    Application.EnableVisualStyles();

    Application.SetCompatibleTextRenderingDefault(false);

    Application.Run(new Report(conn, namereport, namedataset, nametable, sqldata));

    }

    }

    else

    {

    MessageBox.Show("A ocurrido un error favor de intentarlo de nuevo", "Error");

    }

    }

    }

    }

    }

    }

     

    Se que esta un poco denso el codigo, pero te quita mucha chamba, saludos a todos

    Thursday, May 24, 2007 11:05 PM