C# 打印不带预览的 ReportViewer

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/12734277/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-10 00:16:04  来源:igfitidea点击:

Print a ReportViewer Without Preview

c#mysqlreportviewer

提问by alan naidon

I'm using Visual Studio 2010 C# Windows Forms Application + MySql I have a Report Viewer that is working 100% . The reportviewer is filled with data of my database, it shows up I click on the button to print and it prints... BUT, my client does not want to click on this button, he wants to print automatically. When I Call the ReportViewer it print by itself without need to click on a button to do that. Could anyone tell me how I do that ?

我正在使用 Visual Studio 2010 C# Windows 窗体应用程序 + MySql 我有一个 100% 工作的报告查看器。报表查看器充满了我的数据库的数据,它显示我单击按钮打印并打印...但是,我的客户不想单击此按钮,他想自动打印。当我调用 ReportViewer 时,它会自行打印,而无需单击按钮来执行此操作。谁能告诉我我是怎么做到的?

I tryed reportviewer1.print and the PrintDocument from the toolbox. But I do not know how to use these correctly.

我从工具箱中尝试了 reportviewer1.print 和 PrintDocument。但我不知道如何正确使用这些。

Thanks the attention !

谢谢关注!

回答by Bobson

This is how we do it with Crystal Reports.

这就是我们使用 Crystal Reports 的方式。

            ReportDocument rd = new ReportDocument();
            // Insert code to run the report here

            // This gets the user's default printer to print to.
            PrintDialog prt = new PrintDialog();
            rd.PrintOptions.PrinterName = prt.PrinterSettings.PrinterName; 
            // This does the printing.
            rd.PrintToPrinter(copies, true, 1, 1000); 

I think the equivalent to PrintOptions.PrinterNamefor you would be ReportViewer.PrinterSettings, but I suspect what you really need is the equivalent to PrintToPrinter(), which I don't see in my brief look.

我认为PrintOptions.PrinterName对你来说等价的是ReportViewer.PrinterSettings,但我怀疑你真正需要的是等价于PrintToPrinter(),我在我的简要介绍中没有看到。

回答by Bobson

If my Crystal Report answer doesn't work for you, you can also try this page. Again, I haven't tested it, and can't be sure that it works, but it looks like an entirely different approach which might work. If not, then I'm not going to be any help, unfortunately.

如果我的 Crystal Report 答案对您不起作用,您也可以尝试此页面。同样,我还没有测试过它,也不能确定它是否有效,但它看起来是一种完全不同的可能有效的方法。如果没有,那么不幸的是,我不会提供任何帮助。

回答by lemunk

I had just the same issue this is the code i use and works like a charm!

我遇到了同样的问题,这是我使用的代码,而且效果很好!

using System;
using System.IO;
using System.Text;
using System.Globalization;
using System.Drawing;
using System.Drawing.Imaging;
using System.Drawing.Printing;
using Microsoft.Reporting.WinForms;
using System.Collections.Generic;
using System.Collections.Specialized;
using System.Diagnostics;
using System.ComponentModel;
using System.Data;
using System.Linq;
using System.Threading.Tasks;
using System.Windows.Forms;


namespace NewLabelPrinter
{
    /// <summary>
    /// The ReportPrintDocument will print all of the pages of a ServerReport or LocalReport.
    /// The pages are rendered when the print document is constructed.  Once constructed,
    /// call Print() on this class to begin printing.
    /// </summary>
    class AutoPrintCls : PrintDocument
    {
        private PageSettings m_pageSettings;
        private int m_currentPage;
        private List<Stream> m_pages = new List<Stream>();

        public AutoPrintCls(ServerReport serverReport)
            : this((Report)serverReport)
        {
            RenderAllServerReportPages(serverReport);
        }

        public AutoPrintCls(LocalReport localReport)
            : this((Report)localReport)
        {
            RenderAllLocalReportPages(localReport);
        }

        private AutoPrintCls(Report report)
        {
            // Set the page settings to the default defined in the report
            ReportPageSettings reportPageSettings = report.GetDefaultPageSettings();

            // The page settings object will use the default printer unless
            // PageSettings.PrinterSettings is changed.  This assumes there
            // is a default printer.
            m_pageSettings = new PageSettings();
            m_pageSettings.PaperSize = reportPageSettings.PaperSize;
            m_pageSettings.Margins = reportPageSettings.Margins;
        }

        protected override void Dispose(bool disposing)
        {
            base.Dispose(disposing);

            if (disposing)
            {
                foreach (Stream s in m_pages)
                {
                    s.Dispose();
                }

                m_pages.Clear();
            }
        }

        protected override void OnBeginPrint(PrintEventArgs e)
        {
            base.OnBeginPrint(e);

            m_currentPage = 0;
        }

        protected override void OnPrintPage(PrintPageEventArgs e)
        {
            base.OnPrintPage(e);

            Stream pageToPrint = m_pages[m_currentPage];
            pageToPrint.Position = 0;

            // Load each page into a Metafile to draw it.
            using (Metafile pageMetaFile = new Metafile(pageToPrint))
            {
                Rectangle adjustedRect = new Rectangle(
                        e.PageBounds.Left - (int)e.PageSettings.HardMarginX,
                        e.PageBounds.Top - (int)e.PageSettings.HardMarginY,
                        e.PageBounds.Width,
                        e.PageBounds.Height);

                // Draw a white background for the report
                e.Graphics.FillRectangle(Brushes.White, adjustedRect);

                // Draw the report content
                e.Graphics.DrawImage(pageMetaFile, adjustedRect);

                // Prepare for next page.  Make sure we haven't hit the end.
                m_currentPage++;
                e.HasMorePages = m_currentPage < m_pages.Count;
            }
        }

        protected override void OnQueryPageSettings(QueryPageSettingsEventArgs e)
        {
            e.PageSettings = (PageSettings)m_pageSettings.Clone();
        }

        private void RenderAllServerReportPages(ServerReport serverReport)
        {
            try
            {
                string deviceInfo = CreateEMFDeviceInfo();

                // Generating Image renderer pages one at a time can be expensive.  In order
                // to generate page 2, the server would need to recalculate page 1 and throw it
                // away.  Using PersistStreams causes the server to generate all the pages in
                // the background but return as soon as page 1 is complete.
                NameValueCollection firstPageParameters = new NameValueCollection();
                firstPageParameters.Add("rs:PersistStreams", "True");

                // GetNextStream returns the next page in the sequence from the background process
                // started by PersistStreams.
                NameValueCollection nonFirstPageParameters = new NameValueCollection();
                nonFirstPageParameters.Add("rs:GetNextStream", "True");

                string mimeType;
                string fileExtension;


                Stream pageStream = serverReport.Render("IMAGE", deviceInfo, firstPageParameters, out mimeType, out fileExtension);



                // The server returns an empty stream when moving beyond the last page.
                while (pageStream.Length > 0)
                {
                    m_pages.Add(pageStream);

                    pageStream = serverReport.Render("IMAGE", deviceInfo, nonFirstPageParameters, out mimeType, out fileExtension);
                }
            }
            catch (Exception e)
            {
                MessageBox.Show("possible missing information ::  " + e);
            }
        }

        private void RenderAllLocalReportPages(LocalReport localReport)
        {
            try
            {
                string deviceInfo = CreateEMFDeviceInfo();

                Warning[] warnings;

                localReport.Render("IMAGE", deviceInfo, LocalReportCreateStreamCallback, out warnings);
            }
            catch (Exception e)
            {
                MessageBox.Show("error :: " + e);
            }
        }

        private Stream LocalReportCreateStreamCallback(
            string name,
            string extension,
            Encoding encoding,
            string mimeType,
            bool willSeek)
        {
            MemoryStream stream = new MemoryStream();
            m_pages.Add(stream);

            return stream;
        }

        private string CreateEMFDeviceInfo()
        {
            PaperSize paperSize = m_pageSettings.PaperSize;
            Margins margins = m_pageSettings.Margins;

            // The device info string defines the page range to print as well as the size of the page.
            // A start and end page of 0 means generate all pages.
            return string.Format(
                CultureInfo.InvariantCulture,
                "<DeviceInfo><OutputFormat>emf</OutputFormat><StartPage>0</StartPage><EndPage>0</EndPage><MarginTop>{0}</MarginTop><MarginLeft>{1}</MarginLeft><MarginRight>{2}</MarginRight><MarginBottom>{3}</MarginBottom><PageHeight>{4}</PageHeight><PageWidth>{5}</PageWidth></DeviceInfo>",
                ToInches(margins.Top),
                ToInches(margins.Left),
                ToInches(margins.Right),
                ToInches(margins.Bottom),
                ToInches(paperSize.Height),
                ToInches(paperSize.Width));
        }

        private static string ToInches(int hundrethsOfInch)
        {
            double inches = hundrethsOfInch / 100.0;
            return inches.ToString(CultureInfo.InvariantCulture) + "in";
        }
    }
}

This class has the set up perfect for what you need then all you need to do is:

该课程的设置非常适合您的需要,然后您需要做的就是:

private void AutoPrint()
    {
        AutoPrintCls autoprintme = new AutoPrintCls(reportViewer1.LocalReport);
        autoprintme.Print();
    }

and hey presto it prints. Just attach this to A method in your code(maybe after the report Loads.) and your setup nicely!

嘿,它打印出来了。只需将此附加到您代码中的 A 方法(可能在报告加载之后。)和您的设置很好!

option: (not tested)

选项:(未测试)

As spotted this prints out to the default printer, to change the printer you could do the following:

发现这会打印到默认打印机,要更改打印机,您可以执行以下操作:

if (printDialog.ShowDialog() == DialogResult.OK) 
{
    m_pageSettings .PrinterSettings.PrinterName = printDialog.PrinterSettings.PrinterName;
}

not tested though as i no longer have any source code to test this out

虽然没有测试,因为我不再有任何源代码来测试这个