• 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
  • 相关阅读:
    宋亡之后无中国,明亡之后无华夏——有多少人懂
    关于Verilog 中的for语句的探讨
    三种不同状态机写法
    异步复位和同步复位
    转载
    FIFO认识(一)
    Quartus II管脚批量分配文件(.tcl)格式
    mif文件C语言生成
    基于FPGA的HDMI显示设计(三)
    FPGA----只读存储器(ROM)
  • 原文地址:https://www.cnblogs.com/imes/p/10398279.html
Copyright © 2020-2023  润新知