在没有预览的情况下打印ReportViewer

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

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

谢谢你的关注!

我有同样的问题,这是我使用的代码,工作就像一个魅力!

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 { ///  /// 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. ///  class AutoPrintCls : PrintDocument { private PageSettings m_pageSettings; private int m_currentPage; private List m_pages = new List(); 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, "emf00{0}{1}{2}{3}{4}{5}", 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"; } } } 

这个课程的设置非常适合您的需要,您需要做的就是:

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

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

选项:(未经测试)

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

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

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

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

这就是我们使用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); 

我认为相应的PrintOptions.PrinterName就是ReportViewer.PrinterSettings ,但我怀疑你真正需要的是相当于PrintToPrinter() ,我在简短的介绍中没有看到。