【问题标题】:How to print rdlc report with reportviewer如何使用reportviewer 打印rdlc 报告
【发布时间】:2017-08-17 08:22:43
【问题描述】:

大家好,谁能帮助我如何使用控制按钮打印收据?

这是我的屏幕截图 [1]" https://ibb.co/kfk8SF

如果我点击“保存打印”按钮,会出现一个预览对话框 我想要的只是通过单击按钮自动打印我想要的报告并且没有出现对话框

[2]https://ibb.co/kSpDuv

【问题讨论】:

    标签: vb.net rdlc reportviewer


    【解决方案1】:

    您可以先获取默认打印机名称(在打开报表查看器之前):

    System.Drawing.Printing.PrinterSettings settings = new System.Drawing.Printing.PrinterSettings();
    defaultPrinterName = settings.PrinterName;
    

    打印时,将您的打印机名称分配给PrintDocumentPrinterName 属性:

     LocalReport rep = new LocalReport();
     //set your data and parameters here
     //...
     rep.Refresh();
     ExportLandscape(rep);
    
     PrintDocument printDoc = new PrintDocument();
     PrinterSettings ps = new PrinterSettings();
     ps.PrinterName = defaultPrinterName;
     printDoc.PrinterSettings = ps;
    
     printDoc.PrintPage += new PrintPageEventHandler(PrintPage);
     m_currentPageIndex = 0;
     printDoc.Print();
    

    处理实际打印的事件:

     //this has to declared somewhere at the "top":
     private IList<Stream> m_streams;
     private int m_currentPageIndex;
    
    
     private void PrintPage(object sender, PrintPageEventArgs ev) {
            Metafile pageImage = new Metafile(m_streams[m_currentPageIndex]);
    
            // Adjust rectangular area with printer margins.
            Rectangle adjustedRect = new Rectangle(
                ev.PageBounds.Left - (int)ev.PageSettings.HardMarginX,
                ev.PageBounds.Top - (int)ev.PageSettings.HardMarginY,
                ev.PageBounds.Width,
                ev.PageBounds.Height);
    
            // Draw a white background for the report
            ev.Graphics.FillRectangle(Brushes.White, adjustedRect);
    
            // Draw the report content
            ev.Graphics.DrawImage(pageImage, adjustedRect);
    
            // Prepare for the next page. Make sure we haven't hit the end.
            m_currentPageIndex++;
            ev.HasMorePages = (m_currentPageIndex < m_streams.Count);
        }
    

    这是创建打印文档的代码:

    private void ExportPortrait(LocalReport report) {
                string deviceInfo =
                  @"<DeviceInfo>
                    <OutputFormat>EMF</OutputFormat>
                    <PageWidth>8.5in</PageWidth>
                    <PageHeight>11in</PageHeight>
                    <MarginTop>0.5in</MarginTop>
                    <MarginLeft>0.5in</MarginLeft>
                    <MarginRight>0.5in</MarginRight>
                    <MarginBottom>0.5in</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;
    }
    
    private void ExportLandscape(LocalReport report) {
            string deviceInfo =
              @"<DeviceInfo>
                <OutputFormat>EMF</OutputFormat>
                <PageWidth>11in</PageWidth>
                <PageHeight>8.5in</PageHeight>
                <MarginTop>0.5in</MarginTop>
                <MarginLeft>0.5in</MarginLeft>
                <MarginRight>0.5in</MarginRight>
                <MarginBottom>0.5in</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;
    }
    
    private Stream CreateStream(string name, string fileNameExtension, Encoding encoding, string mimeType, bool willSeek) {
                Stream stream = new MemoryStream();
                m_streams.Add(stream);
                return stream;
     }
    

    您可以使用 this 之类的东西将代码转换为需要的 vb.net。

    【讨论】: