演练:使用 LocalReport 对象进行打印 (VB)

本演练说明如何使用 LocalReport 对象和 CreateStreamCallback 回调函数以编程方式进行打印。

先决条件

您必须具有对示例报表和数据源的访问权限。有关详细信息,请参阅用于打印演练的示例数据和报表

执行下列步骤可将向报表添加到 Microsoft Visual Studio 控制台应用程序项目。在本示例中,将用 Microsoft Visual Basic 创建应用程序。

创建新的控制台应用程序项目

  1. 在“文件”菜单上,指向“新建”,然后选择“项目”。

  2. 在“项目类型”窗格中,选择 Visual Basic。

  3. 在“模板”窗格中,选择“控制台应用程序”以创建控制台应用程序。

  4. 在“名称”框中,键入项目的名称 LocalReport Printing VB。

  5. 在“位置”框中,输入要保存项目的目录,或单击“浏览”导航到该目录。. 项目将打开,同时“代码”窗口中显示 Module1.vb。

添加引用

  1. 从“项目”菜单上,选择“添加引用”。将显示“添加引用”对话框。

  2. 从 .NET 选项卡上显示的列表框中,选择 >Winforms 和 >Drawing 组件。

添加代码

  1. Module1.vb 文件应已处于打开状态以供编辑。如果未打开,请在“解决方案资源管理器”窗口中双击 Module1.vb 文件。

  2. 将 Module1.vb 文件中的现有代码替换为下面的代码。确保用指向本地计算机上的示例报表的有效路径替换报表引用。不要将 Data.xml 和 Report.rdlc 添加到项目。基础代码将以编程方式访问这些文件。

    Imports System.IO
    Imports System.Data
    Imports System.Text
    Imports System.Drawing.Imaging
    Imports System.Drawing.Printing
    Imports System.Collections.Generic
    Imports Microsoft.Reporting.WinForms
    
    Public Class Demo
        Implements IDisposable
    
        private m_currentPageIndex As Integer
        private m_streams As IList(Of Stream)
    
        Private Function LoadSalesData() As DataTable
            Dim dataSet As New DataSet()
            dataSet.ReadXml("c:\My Reports\data.xml")
            Return dataSet.Tables(0)
        End Function
    
        Private Function CreateStream(name As String,_
          fileNameExtension As String, _
         encoding As Encoding, mimeType As String, willSeek As Boolean) 
    As Stream
            Dim stream As Stream = _
                New FileStream("c:\My Reports\" + _
                 name + "." + fileNameExtension, FileMode.Create)
            m_streams.Add(stream)
            Return stream
        End Function
    
        Private Sub Export(report As LocalReport)
            Dim deviceInfo As string = _
              "<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>"
            Dim warnings() As Warning = Nothing
            m_streams = New List(Of Stream)()
            report.Render("Image", deviceInfo, AddressOf CreateStream, 
    warnings)
    
            Dim stream As Stream
            For Each stream In m_streams
                stream.Position = 0
            Next
        End Sub
    
        Private Sub PrintPage(sender As Object, ev As 
    PrintPageEventArgs)
            Dim pageImage As New Metafile(m_streams(m_currentPageIndex))
            ev.Graphics.DrawImage(pageImage, ev.PageBounds)
          
            m_currentPageIndex += 1
            ev.HasMorePages = (m_currentPageIndex < m_streams.Count)
        End Sub
    
        Private Sub Print()
            Const printerName As String = "Microsoft Office Document 
    Image Writer"
    
            If m_streams Is Nothing Or m_streams.Count = 0 Then
                Return
            End If 
    
            Dim printDoc As New PrintDocument()
            printDoc.PrinterSettings.PrinterName = printerName
            If Not printDoc.PrinterSettings.IsValid Then
                Dim msg As String = String.Format("Can't find printer 
    ""{0}"".", printerName)
                Console.WriteLine(msg)
                Return
            End If
            AddHandler printDoc.PrintPage, AddressOf PrintPage
            printDoc.Print()
        End Sub
    
        Private Sub Run()
            Dim report As LocalReport = new LocalReport()
            report.ReportPath = "c:\My Reports\Report.rdlc"
            report.DataSources.Add(new ReportDataSource("Sales", 
    LoadSalesData()))
    
            Export(report)
    
            m_currentPageIndex = 0
            Print()
        End Sub
    
        Public Overloads Sub Dispose() Implements IDisposable.Dispose
            If Not (m_streams Is Nothing) Then
                Dim stream As Stream
                For Each stream In m_streams
                   stream.Close()
                Next
                m_streams = Nothing
            End If
        End Sub
    
        Public Shared Sub Main(args as string())
            Using demo As Demo = new Demo()
                demo.Run()
            End Using
        End Sub
    End Class
        
生成并运行应用程序

  1. 在“解决方案资源管理器”窗口中,右键单击“LocalReport Printing VB”项目,然后选择“属性”。将显示“属性”窗口。

  2. 从“属性”窗口的“启动对象”下拉列表中,选择 Sub Main。

  3. 关闭“属性”窗口。

  4. 从“生成”菜单中,单击“生成解决方案”以生成应用程序。在生成过程中,将编译报表并将找到的所有错误(如报表中使用的表达式中的语法错误)添加到“任务列表”中。

  5. 按 F5 运行应用程序。

另请参见

参考信息

>LocalReport
Microsoft.Reporting.WinForms.CreateStreamCallback
Microsoft.Reporting.WebForms.CreateStreamCallback

概念

添加和配置 ReportViewer 控件

其他资源

示例和演练

标记 :


Page view tracker