日期:2014-05-20  浏览次数:20934 次

MicrosoftReportViewer 直接打印问题【急】!!
各位大哥大姐大叔大侠帮帮忙!

MicrosoftReportViewer 我想直接打印 
在微软MSDN上看到一个例子
C# code

http://msdn.microsoft.com/zh-cn/library/ms252091(v=VS.90).aspx




下面是我的代码,我参照MSDN上面修改的,已经有Report.rdlc 都设置好了。Report.rdlc里控件的值都是用参数传入的。
C# code

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.Data.SqlClient;

public class Demo : IDisposable
{
    private int m_currentPageIndex;
    private IList<Stream> m_streams;

    private DataTable LoadSalesData()
    {
        string conn = "server=192.168.0.70;database=his;user id =sa;pwd=sqlsa2002";
        SqlConnection con = new SqlConnection(conn);

        SqlCommand cmd = new SqlCommand("SELECT balance,total FROM mem_ac where code ='100000000001'", con);

        SqlDataAdapter adp = new SqlDataAdapter();

        adp.SelectCommand = cmd;

        con.Open();

        DataTable dt = new DataTable();

        adp.Fill(dt);

        con.Close();

        return dt;
    }
    // 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.
    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]);

        
        m_currentPageIndex++;
        ev.HasMorePages = (m_currentPageIndex < m_streams.Count);
    }

    private void Print()
    {
        if (m_streams == null || m_streams.Count == 0)
            throw new 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.
    private void Run()
    {
        LocalReport report = new LocalReport();
        report.ReportPath = @"..\..\Report.rdlc";
        ReportParameter[] rp = new ReportParameter[10];
        rp[0] = new ReportParameter("RegNumber", "0000286872");
        rp[1] = new ReportParameter("DossierNumber", "122755");
        rp[2] = new ReportParameter("ShowDate", "2011年5月9日");
        rp[3] = new ReportParameter("Number", "9155000635");
        rp[4] = new ReportParameter("PatientName", "陈颖");
        rp[5] = new ReportParameter("PaymentType", "银行卡");
        rp[6] = new ReportParameter("MoneyCapital", "this.GetNumToUpper(Money1)");
        rp[7] = new ReportParameter("Money", "Money1.ToString()");
        rp[8] = new ReportParameter("Departments", "呼吸内科16病房");
        rp[9] = new ReportParameter("Operator", "张三丰");
        report.SetParameters(rp);
        Export(report);
        Print();
    }

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

    public static void Main(string[] args)
    {
        using (Demo demo = new Demo())
        {
            demo.Run();
        }
    }
}