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

水晶报表是相当不错的报表,不管是在报表浏览器中还是直接打印方式下,编程都相当方便,但有一点在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

你可能感兴趣的:(编程,Microsoft)