[转]在不预览的情况下打印RDLC报表

来源:互联网 发布:2016好看的网络自制剧 编辑:程序博客网 时间:2024/06/12 00:25

水晶报表是相当不错的报表,不管是在报表浏览器中还是直接打印方式下,编程都相当方便,但有一点在web下好象权限管理有些麻烦,影响了正常打印,所以换成Microsoft Sql Server Report,但有一个问题又出现了,他没有直接打印功能。头痛。后在msdn中找到了解决方案.

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;publicclass Demo : IDisposable{       privateint m_currentPageIndex;       private IList<Stream> m_streams;       private DataTable LoadSalesData()       {               // Create a new DataSet and read sales data file                //    data.xml into the first DataTable.               DataSet dataSet =new DataSet();               dataSet.ReadXml(@"..\..\data.xml");               return dataSet.Tables[0];        }       // Routine to provide to the report renderer, in order to       //    save an image for each page of the report.       private Stream CreateStream(string name,     string fileNameExtension, Encoding encoding,     string mimeType, bool willSeek)        {               Stream stream =new MemoryStream();               m_streams.Add(stream);               return stream;       }        // Export the given report as an EMF (Enhanced Metafile) file.       privatevoid 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 streamin m_streams)                        stream.Position = 0;       }       // Handler for PrintPageEvents        privatevoid 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);       }       privatevoid Print()        {                if (m_streams ==null || m_streams.Count == 0)                            thrownew Exception("Error: no stream to print.");               PrintDocument printDoc =new PrintDocument();                if (!printDoc.PrinterSettings.IsValid)                {                       throw new Exception("Error: cannot find the default printer.");                }                else                {                       printDoc.PrintPage +=new PrintPageEventHandler(PrintPage);                       m_currentPageIndex = 0;                       printDoc.Print();                }        }       // Create a local report for Report.rdlc, load the data,        //    export the report to an .emf file, and print it.        privatevoid Run()       {               LocalReport report =new LocalReport();               report.ReportPath =@"..\..\Report.rdlc";               report.DataSources.Add(new ReportDataSource("Sales", LoadSalesData()));               Export(report);               Print();       }       public void Dispose()        {               if (m_streams != null)               {                       foreach (Stream stream in m_streams)                           stream.Close();                       m_streams =null;               }        }       publicstatic void Main(string[] args)        {               using (Demo demo = new Demo())                {                        demo.Run();                    }           }    }}
 

你可以修改以上代码来完成你的需求(有个问题。Microsoft为什么不封装这些,成为一个功能可选项呢)

【代码】来源于MSDN http://msdn.microsoft.com/zh-cn/library/ms252091.aspx

转载:http://blog.csdn.net/shcy0524/article/details/6846847

0 0
原创粉丝点击