我正在使用Visual Studio 2010 C#
Windows窗体应用程序
MySql
我有一个100%正常工作的报表查看器.报告查看器充满了我的数据库的数据,它显示我点击按钮打印并打印…但是,我的客户不想点击这个按钮,他想自动打印.当我调用ReportViewer时,它自己打印而无需单击按钮来执行此操作.谁能告诉我我是怎么做到的?
我有一个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 { /// <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",nonFirstPageParameters,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",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"; } } }
这个课程的设置非常适合您的需要,然后您需要做的就是:
private void AutoPrint() { AutoPrintCls autoprintme = new AutoPrintCls(reportViewer1.LocalReport); autoprintme.Print(); }
嘿presto它打印.只需将此附加到代码中的方法(可能在报告载入之后.)和您的设置很好!
选项:(未经测试)
如发现这打印到默认打印机,要更改打印机,您可以执行以下操作:
if (printDialog.ShowDialog() == DialogResult.OK) { m_pageSettings .PrinterSettings.PrinterName = printDialog.PrinterSettings.PrinterName; }
没有经过测试,因为我不再有任何源代码来测试这个