解决RDLC报表自带打印,弹出打印界面后,经常须按两次打印才执行

这段时间做报表,用RDLC客户老是反应,打印要按几次才可以打印,自己测试了一下,发现果真是存在这个问题,貌似自带的打印是在弹出打印窗口后,第一次点击是先将当前窗体激活,第二次点击才会真正的触发打印事件,查询:http://msdn.microsoft.com/zh-cn/library/ms252091(v=vs.100).aspx

修改了里面几个地方,如下:

using System;
using System.IO;
using System.Data;
using System.Text;
using System.Drawing.Imaging;
using System.Drawing.Printing;
using System.Collections.Generic;
using System.Windows.Forms;
using Microsoft.Reporting.WinForms;
using System.Drawing;

namespace YMParking.ParkingMg
{
    public class Print
    {
        int m_currentPageIndex;
        IList<Stream> m_streams;

        // 摘要:
        //     为 ReportViewer 控件提供流以进行呈现。
        //
        // 返回结果:
        //     ReportViewer 控件可以写入数据的 Stream 对象。
        private Stream CreateStream(string name,
          string fileNameExtension, Encoding encoding,
          string mimeType, bool willSeek)
        {
            Stream stream = new MemoryStream();
            m_streams.Add(stream);
            return stream;
        }
        /// <summary>
        /// 将报表文件按指定的格式导出
        /// </summary>
        /// <param name="report">报表文件</param>
        private void Export(LocalReport report)
        {
            string deviceInfo =
              @"<DeviceInfo>
                <OutputFormat>EMF</OutputFormat>
                <PageWidth>8.5in</PageWidth>
                <PageHeight>11in</PageHeight>
                <MarginTop>0.25in</MarginTop>
                <MarginLeft>0.25in</MarginLeft>
                <MarginRight>0.25in</MarginRight>
                <MarginBottom>0.25in</MarginBottom>
            </DeviceInfo>";
            Warning[] warnings;
            m_streams = new List<Stream>();
            report.Render("Image", deviceInfo, CreateStream,
               out warnings);
            foreach (Stream stream in m_streams)
                stream.Position = 0;
        }
        // Handler for PrintPageEvents
        private void PrintPage(object sender, PrintPageEventArgs ev)
        {
            Metafile pageImage = new
               Metafile(m_streams[m_currentPageIndex]);

            Rectangle adjustedRect = new Rectangle(
                ev.PageBounds.Left - (int)ev.PageSettings.HardMarginX,
                ev.PageBounds.Top - (int)ev.PageSettings.HardMarginY,
                ev.PageBounds.Width,
                ev.PageBounds.Height);

            ev.Graphics.FillRectangle(Brushes.White, adjustedRect);

            ev.Graphics.DrawImage(pageImage, adjustedRect);

            m_currentPageIndex++;
            ev.HasMorePages = (m_currentPageIndex < m_streams.Count);
        }
        /// <summary>
        /// 打印
        /// </summary>
        /// <param name="IsShowPrint">是否弹出打印窗口</param>
        private void PrintFiel(bool IsShowPrint)
        {
            if (m_streams == null || m_streams.Count == 0)
                throw new Exception("指定的打印的文件错误");
            PrintDocument document;
            if (IsShowPrint)
            {
               
                PrintDialog pd = new PrintDialog();
                if (pd.ShowDialog() == DialogResult.OK)
                {
                    document = new PrintDocument();
                    pd.Document = document;
                }
                else
                {
                    return;
                }

            }
            else
            {
                document = new PrintDocument();
            }
            if (!document.PrinterSettings.IsValid)
            {
                throw new Exception("连接打印机出错");
            }
            else
            {

                document.PrintPage += new PrintPageEventHandler(PrintPage);
                m_currentPageIndex = 0;
                document.Print();
            }

        }

        public void Run(LocalReport report, bool IsShowPrint)
        {
            
            Export(report);
            PrintFiel(IsShowPrint);
        }

        public void Dispose()
        {
            if (m_streams != null)
            {
                foreach (Stream stream in m_streams)
                    stream.Close();
                m_streams = null;
            }
        }

    }
}

写了这个共用的类,重写reportViewer打印事件,

private void reportViewer1_Print(object sender, CancelEventArgs e)

{

e.Cancel = true;

Print pt = new Print();

pt.Run(reportViewer1.LocalReport, true);

}

到此,问题解决了。

时间: 2024-11-02 20:13:13

解决RDLC报表自带打印,弹出打印界面后,经常须按两次打印才执行的相关文章

解决IOS safari在input focus弹出输入法时不支持position fixed的问题

该文章为转载 我们在做移动web应用的时候,常常习惯于使用position:fixed把一个input框作为提问或者搜索框固定在页面底部.但在IOS的safari和webview中,对position:fixed的支持不是很好(在IOS5之前甚至还不支持position:fixed).我遇到的其中一个问题就是,在iOS6+环境下,input focus弹出输入法的时候,设置了position fixed的input框浮在页面上了,而不是吸附在软键盘上.效果如图(图片来源于网上): 而Androi

解决PL/SQL Dev连接Oracle弹出空白提示框

第一次安装Oracle,装在虚拟机中,用PL/SQL Dev连接远程数据库的时候老是弹出空白提示框,网上找了很久,解决方法也很多,可是就是没法解决我这种情况的. 没办法,只能自己研究,经过大概一天时间吧,还是搞好了,写个总结. 出现这种问题,解决方法大概有这几种: 1.权限不够,导致弹出空吧提示框.(直接上链接) http://jingyan.baidu.com/article/066074d6760959c3c21cb0d6.html 就PL/SQL图标上点右键---属性---兼容性--管理员

.net 弹出消息框后,页面样式变乱

点击按钮,执行提交操作,弹出消息框后,页面的样式变乱,解决方法: 首先,确定使用的css样式正确,页面中的宽高值保持规范统一: 然后,弹出框避免使用Response.Write(),如下所示 Response.Write("<script language=javascript>"); Response.Write("window.alert('"); Response.Write("计划添加失败!"); Response.Write

弹出遮罩层后禁止滚动效果

弹出遮罩层后,手指在手机上上下滑动 遮罩层下的页面出现滑动.下面代码解决这个问题 (1)触摸后不产生事件 //遮罩层禁止滚动 $('.searbox_mask_byInteg').bind("touchmove", function (e) { e.preventDefault(); }); (2)body不出现滚动条 $("body,.main").height($(window).height()).css({ "overflow-y": &

关于VS打包程序无法弹出主界面的问题

代码中的程序很正常,VS打包之后,无法弹出主界面的问题. 这种问题,一般是缺少程序加载所必须的东西,包括dll,配置文件等. (1)程序主界面使用的是DevExpress,DevExpress的相关类库要改成复制到本地为true (2)代码在窗体初始化的时候添加了好多程序初始参数的获取设置,而这些初始化设置的代码由于在打包时缺少配置文件, 导致打包后的程序无法读取配置文件,从而主窗体无法弹出.

Android软键盘弹出,界面整体上移的问题

AndroidManifest.xml文件中界面对应的<activity>里加入 android:windowSoftInputMode="adjustPan" 键盘就会覆盖屏幕 android:windowSoftInputMode="stateVisible|adjustResize" 屏幕整体上移 Android软键盘弹出,界面整体上移的问题

解决Firefox浏览器每次打开都弹出导入向导的问题

每次打开Firefox浏览器都会弹出导入向导这个页面,只有这个页面关闭后,Firefox界面才会打开. 解决办法: C:\Users\{用户名}\AppData\Roaming\Mozilla\Firefox\profiles.ini 把profiles.ini文件中IsRelative=1修改为IsRelative=0 报错: in `connect_until_stable': unable to obtain stable firefox connection in 60 seconds

解决安卓手机上软键盘弹出挤压背景的问题

demo: // 解决本页面软键盘弹窗背景挤压的问题 var clientHeight = document.documentElement.clientHeight || document.body.clientHeight; $(window).on('resize', function () { var nowClientHeight = document.documentElement.clientHeight || document.body.clientHeight; if (cli

解决python在windows上运行弹出cmd窗口(dos窗口)

运行python程序的时候会在背景显示一个cmd,要想不显示其实很简单(虽然是我找了1个小时...才了解的基本知识) 方法1:pythonw xxx.py 方法2:将.py改成.pyw (这个其实就是使用脚本解析程序pythonw.exe) 原文: 1) Try changing the file extension to .pyw. Double-clicking a .pyw will use pythonw.exe instead of python.exe. python.exe运行的时