C# RDLC报表不出现预览窗体直接输出到打印机
#region 直接打印区域 /// <summary> /// 直接打印到打印机 /// </summary> /// <param name="reportFullFileName"></param> /// <param name="reportTitle"></param> /// <param name="reportDSTable1"></param> /// <param name="reportDSTable2"></param> /// <param name="reportDSTable3"></param> /// <param name="reportDSTable4"></param> /// <param name="reportDSTable5"></param> /// <param name="hasSubReport"></param> /// <param name="subReportDSTable1"></param> /// <param name="subReportDSTable2"></param> /// <param name="tPageSettings"></param> /// <param name="tPrinterSettings"></param> /// <param name="logoFileName1"></param> /// <param name="logoFileName2"></param> /// <param name="logoFileName3"></param> public void PrintReportDrc(string reportFullFileName, string reportTitle, DataTable reportDSTable1, DataTable reportDSTable2 = null, DataTable reportDSTable3 = null, DataTable reportDSTable4 = null, DataTable reportDSTable5 = null, bool hasSubReport = false, DataTable subReportDSTable1 = null, DataTable subReportDSTable2 = null, System.Drawing.Printing.PageSettings tPageSettings = null, System.Drawing.Printing.PrinterSettings tPrinterSettings = null, string logoFileName1 = null, string logoFileName2 = null, string logoFileName3 = null) { if (!File.Exists(reportFullFileName)) { MyMsg.Error("T.1201/指定的报表文件不存在,请检查!"); this.Close(); return; } this.Text += "(" + reportTitle + ")"; this.RptvMain.Reset(); this.RptvMain.ProcessingMode = ProcessingMode.Local; this.RptvMain.LocalReport.ReportPath = reportFullFileName;//必须在前面,否则出现The source of the report definition has not been specified错误 this.RptvMain.LocalReport.EnableExternalImages = true; // RDLC报表显示本地图片必须设置(默认是关闭) #region 处理参数 ReportParameterInfoCollection reportParameterInfos = RptvMain.LocalReport.GetParameters(); List<string> parasNames = new List<string>(); foreach (ReportParameterInfo rpi in reportParameterInfos) { parasNames.Add(rpi.Name); } List<ReportParameter> reportParameters = new List<ReportParameter>(); if (parasNames.Contains("LogoFile1")) { if (string.IsNullOrEmpty(logoFileName1)) { logoFileName1 = "RptLogoDft1.jpg"; } logoFileName1 = AppInfo.GetPath(AppInfo.AppPath.Report) + @"\Images\" + logoFileName1; logoFileName1 = @"file:///" + logoFileName1.Replace(@"\", @"/"); ReportParameter reportParameter = new ReportParameter("LogoFile1", logoFileName1); reportParameters.Add(reportParameter); } if (parasNames.Contains("LogoFile2")) { if (string.IsNullOrEmpty(logoFileName2)) { logoFileName2 = "RptLogoDft2.jpg"; } logoFileName2 = AppInfo.GetPath(AppInfo.AppPath.Report) + @"\Images\" + logoFileName2; logoFileName2 = @"file:///" + logoFileName2.Replace(@"\", @"/"); ReportParameter reportParameter = new ReportParameter("LogoFile2", logoFileName2); reportParameters.Add(reportParameter); } if (parasNames.Contains("LogoFile3")) { if (string.IsNullOrEmpty(logoFileName3)) { logoFileName3 = "RptLogoDft3.jpg"; } logoFileName3 = AppInfo.GetPath(AppInfo.AppPath.Report) + @"\Images\" + logoFileName3; logoFileName3 = @"file:///" + logoFileName3.Replace(@"\", @"/"); ReportParameter reportParameter = new ReportParameter("LogoFile3", logoFileName3); reportParameters.Add(reportParameter); } if (reportParameters.Count > 0) { this.RptvMain.LocalReport.SetParameters(reportParameters); } #endregion #region 处理Dataset this.RptvMain.LocalReport.DataSources.Clear(); if (reportDSTable1 != null) { ReportDataSource rds1 = new ReportDataSource("DataSet1", reportDSTable1); this.RptvMain.LocalReport.DataSources.Add(rds1); } if (reportDSTable2 != null) { ReportDataSource rds2 = new ReportDataSource("DataSet2", reportDSTable2); this.RptvMain.LocalReport.DataSources.Add(rds2); } if (reportDSTable3 != null) { ReportDataSource rds3 = new ReportDataSource("DataSet3", reportDSTable3); this.RptvMain.LocalReport.DataSources.Add(rds3); } if (reportDSTable4 != null) { ReportDataSource rds4 = new ReportDataSource("DataSet4", reportDSTable4); this.RptvMain.LocalReport.DataSources.Add(rds4); } if (reportDSTable5 != null) { ReportDataSource rds5 = new ReportDataSource("DataSet5", reportDSTable5); this.RptvMain.LocalReport.DataSources.Add(rds5); } #endregion //定义子报表处理方法 if (hasSubReport) { subDSTable1 = subReportDSTable1; subDSTable2 = subReportDSTable2; RptvMain.LocalReport.SubreportProcessing += new SubreportProcessingEventHandler(LocalReport_SubreportProcessing); } RptvMain.SetDisplayMode(DisplayMode.PrintLayout); RptvMain.ZoomMode = ZoomMode.Percent; RptvMain.ZoomPercent = 100; try { if (tPageSettings != null) RptvMain.SetPageSettings(tPageSettings); if (tPrinterSettings != null) RptvMain.PrinterSettings = tPrinterSettings; } catch (Exception) { } RptvMain.LocalReport.Refresh(); RptvMain.RefreshReport(); #region 直接打印定义 m_streams = new List<Stream>(); ReportPageSettings pageSettings = RptvMain.LocalReport.GetDefaultPageSettings(); decimal pgWidth = decimal.Round(HpString.NZ2Decimal(pageSettings.PaperSize.Width * 2.54 / 100), 2); decimal pgHeight = decimal.Round(HpString.NZ2Decimal(pageSettings.PaperSize.Height * 2.54 / 100), 2); decimal mgTop = decimal.Round(HpString.NZ2Decimal(pageSettings.Margins.Top * 2.54 / 100), 2); decimal mgLeft = decimal.Round(HpString.NZ2Decimal(pageSettings.Margins.Left * 2.54 / 100), 2); decimal mgRight = decimal.Round(HpString.NZ2Decimal(pageSettings.Margins.Right * 2.54 / 100), 2); decimal mgBottom = decimal.Round(HpString.NZ2Decimal(pageSettings.Margins.Bottom * 2.54 / 100), 2); string deviceInfo = "<DeviceInfo>" + " <OutputFormat>EMF</OutputFormat>" + " <PageWidth>"+ pgWidth + "cm</PageWidth>" + " <PageHeight>" + pgHeight + "cm</PageHeight>" + " <MarginTop>" + mgTop + "cm</MarginTop>" + " <MarginLeft>" + mgLeft + "cm</MarginLeft>" + " <MarginRight>" + mgRight + "cm</MarginRight>" + " <MarginBottom>" + mgBottom + "cm</MarginBottom>" + "</DeviceInfo>"; RptvMain.LocalReport.Render("Image", deviceInfo, CreateStream, out Warning[] warnings); //==================================================开始打印 m_currentPageIndex = 0; if (m_streams == null || m_streams.Count == 0) return; //声明PrintDocument对象用于数据的打印 PrintDocument printDoc = new PrintDocument { DefaultPageSettings = RptvMain.GetPageSettings() }; //如果没有指定打印机设置,则使用空字符串""来指定默认打印机 if (RptvMain.PrinterSettings == null) { printDoc.PrinterSettings.PrinterName = ""; } else { printDoc.PrinterSettings = RptvMain.PrinterSettings; } //判断指定的打印机是否可用 if (!printDoc.PrinterSettings.IsValid) { MyMsg.Warning("没有找到指定的打印机:" + printDoc.PrinterSettings.PrinterName); return; } printDoc.PrintPage += new PrintPageEventHandler(PrintPage); //执行打印操作,Print方法将触发PrintPage事件。 printDoc.Print(); //释放资源 foreach (Stream stream in m_streams) { stream.Dispose(); stream.Close(); } m_streams = null; #endregion } //声明一个Stream对象的列表用来保存报表的输出数据 //LocalReport对象的Render方法会将报表按页输出为多个Stream对象。 private List<Stream> m_streams; //用来提供Stream对象的函数,用于LocalReport对象的Render方法的第三个参数。 private Stream CreateStream(string name, string fileNameExtension, Encoding encoding, string mimeType, bool willSeek) { //如果需要将报表输出的数据保存为文件,请使用FileStream对象。 Stream stream = new MemoryStream(); m_streams.Add(stream); return stream; } //用来记录当前打印到第几页了 private int m_currentPageIndex; #region 打印页面 private void PrintPage(object sender, PrintPageEventArgs ev) { m_streams[m_currentPageIndex].Position = 0; Metafile pageImage = new Metafile(m_streams[m_currentPageIndex]); System.Drawing.Rectangle adjustedRect = new System.Drawing.Rectangle( ev.PageBounds.Left - (int)ev.PageSettings.HardMarginX, ev.PageBounds.Top - (int)ev.PageSettings.HardMarginY, ev.PageBounds.Width, ev.PageBounds.Height); ev.Graphics.FillRectangle(System.Drawing.Brushes.White, adjustedRect); ev.Graphics.DrawImage(pageImage, adjustedRect); m_streams[m_currentPageIndex].Close(); m_currentPageIndex++; ev.HasMorePages = (m_currentPageIndex < m_streams.Count); } #endregion #endregion