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

原文地址:https://www.cnblogs.com/imes/p/10398279.html

时间: 2024-11-05 20:29:09

C# RDLC报表不出现预览窗体直接输出到打印机的相关文章

预览窗体模板

namespace NLISClient.SSTForm{ /// <summary> /// <para>程序名称:SST模板预览窗体</para> /// <list type="table"> /// <listheader> /// <term>作者</term><term>日期</term><term>版本</term><term>更

通过程序预览Office文档

我承认,标题是夸大了,就是为了吸引注意力.这里只有Word文档和Excel文档的预览代码. Word://此部分来源:http://princed.mblogger.cn/posts/11885.aspx//uses ActiveX;procedure TForm1.MenuPreviewClick(Sender: TObject);var    IOO: IOleInPlaceObject ;begin    OleContainer1.DoVerb(ovShow);    if OleCon

【FastReport教程】在报表的预览模式下复制或删除页面

下载FastReport.Net最新版本 在FastReport 2018.4中,出现了一个非常有趣的功能 - 在预览模式下复制和删除报表页面.也就是说,您可以选择特定的报表页面并根据需要多次克隆,或删除所选页面.在这种情况下,对模板本身没有影响.即使你只有一页,要使一切恢复到原始状态 - 只需再次构建报表. 例如,如果要打印报表以及多个实例中所需的任何特定页面.相反,不想打印的某些页面,在打印设置中,您可以选择所需的页码.但你必须记住这些数字.这不是很方便.使用新功能,您可以添加所需的页面.

Q:关于Outlook for CRM 中预览记录窗体的设置

问题: 如何在Outlook for CRM中,将实体记录的预览窗口的信息做调整? 解决方案: 在Outlook里,在打开实体后选择View=>Customize Reading Pane,这里可以设置相应节的显示或不显示. 另外,系统管理员也可以设置自己新建的界面内容.

基于MVC+EasyUI的Web开发框架经验总结(15)--在MVC项目中使用RDLC报表

RDLC是一个不错的报表,有着比较不错的设计模式和展现效果,在我的Winform开发里面,使用RDLC也是一个比较方便操作,如可以参考文章<DevExpress的XtraReport和微软RDLC报表的使用和对比>或者<会员管理系统的设计和开发(2)-- RDLC报表的设计及动态加载>进行了解.但是基于MVC方式,如何构建和展现RDLC报表呢?本文主要介绍如何在基于MVC4+EasyUI的Web开发框架上进行RDLC的集成和使用. 1.RDLC绑定数据源 RDLC的报表设计,是使用

ReportViewer 不预览,直接导出 PDF文件

作为笔记记着,以免以后再到处找资料 1. 在不预览的情况下导出文件 先看一个方法说明,想知道ReportViewer支持导出哪些文件类型,在Render方法说明中就有描述 // // Summary: // Processes the report and renders it in the specified format using a stream // provided by a callback function. // // Parameters: // format: // The

RDLC系列(一)ASP.NET RDLC 报表自定义数据源

最近一段时间开发ERP系统中要用到不少报表打印,在网上找了一圈发现想些好用的报表控件大部分要收费,一些面免费要么不好用要么IE8不兼容,最后还是用了微软自带的RDLC报表,把自己遇到的坑和技巧整理分享出来. 一般Visaul Studio上新建的的EDLC报表文件之后数据源都是按照向导直接连接数据库,自动生成数据源和数据集的,但是遇到一些复杂的就不够灵活. 一.新建报表 1.新建一个空白的报表如下 2.打开新建好的空报表文件,选择报表文件右键选择[打开方式]→[XML(文本)编辑]打开 在Pag

rdlc报表在vs2008下编辑正常,在vs2012上编辑就报错

最近我们的系统的开发工具由vs2008升级到了2012,由于系统中很多报表都是用rdlc来开发的,今天 遇到有报表需要改动的需求,就直接使用vs2012对rdlc报表进行了编辑,结果改完后,怎么预览报表都报错. 后来我通过vsts源代码管理器比较了编辑前后的报表文件,结果发现我只是改动其中的一个属性,但是vs2012 在编辑rdlc报表文件时,自动加入了很多属性和设置到了报表中,我只会撤销修改,然后用记事本打开要修改 的报表文件,然后在记事本中进行了微调,保存后测试,无任何问题. 但是使用vs2

RDLC报表显示存储于数据库的图片

图片以二进制存储于数据库表中.在显示RDLC报表时,把图片呈现出来. 好吧. 把存储过程写好: CREATE PROCEDURE [dbo].[usp_File_Select] AS SELECT [Afd_nbr],[Picture],[PictureType],[FileExtension] FROM [dbo].[ApiFileDemo] GO Source Code 在网站中,创建一个实体,是程序从数据库获取数据: public DataTable GetFiles() { sp.Con