本演练说明如何使用 LocalReport 对象和 CreateStreamCallback 回调函数以编程方式进行打印。
您必须具有对示例报表和数据源的访问权限。有关详细信息,请参阅用于打印演练的示例数据和报表。
执行下列步骤可将向报表添加到 Microsoft Visual Studio 控制台应用程序项目。在本示例中,将用 Microsoft Visual Basic 创建应用程序。
-
在“文件”菜单上,指向“新建”,然后选择“项目”。
-
在“项目类型”窗格中,选择 Visual Basic。
-
在“模板”窗格中,选择“控制台应用程序”以创建控制台应用程序。
-
在“名称”框中,键入项目的名称 LocalReport Printing VB。
-
在“位置”框中,输入要保存项目的目录,或单击“浏览”导航到该目录。. 项目将打开,同时“代码”窗口中显示 Module1.vb。
-
从“项目”菜单上,选择“添加引用”。将显示“添加引用”对话框。
-
从 .NET 选项卡上显示的列表框中,选择 >Winforms 和 >Drawing 组件。
-
Module1.vb 文件应已处于打开状态以供编辑。如果未打开,请在“解决方案资源管理器”窗口中双击 Module1.vb 文件。
-
将 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
-
在“解决方案资源管理器”窗口中,右键单击“LocalReport Printing VB”项目,然后选择“属性”。将显示“属性”窗口。
-
从“属性”窗口的“启动对象”下拉列表中,选择 Sub Main。
-
关闭“属性”窗口。
-
从“生成”菜单中,单击“生成解决方案”以生成应用程序。在生成过程中,将编译报表并将找到的所有错误(如报表中使用的表达式中的语法错误)添加到“任务列表”中。
-
按 F5 运行应用程序。
参考信息
>LocalReport
Microsoft.Reporting.WinForms.CreateStreamCallback
Microsoft.Reporting.WebForms.CreateStreamCallback
概念
添加和配置 ReportViewer 控件
其他资源
示例和演练