001.
Imports
System
002.
Imports
System.IO
003.
Imports
System.Data
004.
Imports
System.Text
005.
Imports
System.Drawing
006.
Imports
System.Drawing.Imaging
007.
Imports
System.Drawing.Printing
008.
Imports
System.Collections.Generic
009.
Imports
System.Windows.Forms
010.
Imports
Microsoft.Reporting.WinForms
011.
012.
Public
Class
Demo
013.
Implements
IDisposable
014.
Private
m_currentPageIndex
As
Integer
015.
Private
m_streams
As
IList(Of Stream)
016.
017.
Private
Function
LoadSalesData()
As
DataTable
018.
019.
020.
Dim
dataSet
As
New
DataSet()
021.
dataSet.ReadXml(
"..\..\data.xml"
)
022.
Return
dataSet.Tables(0)
023.
End
Function
024.
025.
026.
027.
Private
Function
CreateStream(
ByVal
name
As
String
,
ByVal
fileNameExtension
As
String
,
ByVal
encoding
As
Encoding,
ByVal
mimeType
As
String
,
ByVal
willSeek
As
Boolean
)
As
Stream
028.
Dim
stream
As
Stream =
New
MemoryStream()
029.
m_streams.Add(stream)
030.
Return
stream
031.
End
Function
032.
033.
034.
Private
Sub
Export(
ByVal
report
As
LocalReport)
035.
Dim
deviceInfo
As
String
=
"<DeviceInfo>"
& _
036.
"<OutputFormat>EMF</OutputFormat>"
& _
037.
"<PageWidth>8.5in</PageWidth>"
& _
038.
"<PageHeight>11in</PageHeight>"
& _
039.
"<MarginTop>0.25in</MarginTop>"
& _
040.
"<MarginLeft>0.25in</MarginLeft>"
& _
041.
"<MarginRight>0.25in</MarginRight>"
& _
042.
"<MarginBottom>0.25in</MarginBottom>"
& _
043.
"</DeviceInfo>"
044.
Dim
warnings
As
Warning()
045.
m_streams =
New
List(Of Stream)()
046.
report.Render(
"Image"
, deviceInfo,
AddressOf
CreateStream, warnings)
047.
For
Each
stream
As
Stream
In
m_streams
048.
stream.Position = 0
049.
Next
050.
End
Sub
051.
052.
053.
Private
Sub
PrintPage(
ByVal
sender
As
Object
,
ByVal
ev
As
PrintPageEventArgs)
054.
Dim
pageImage
As
New
Metafile(m_streams(m_currentPageIndex))
055.
056.
057.
Dim
adjustedRect
As
New
Rectangle(ev.PageBounds.Left -
CInt
(ev.PageSettings.HardMarginX), _
058.
ev.PageBounds.Top -
CInt
(ev.PageSettings.HardMarginY), _
059.
ev.PageBounds.Width, _
060.
ev.PageBounds.Height)
061.
062.
063.
ev.Graphics.FillRectangle(Brushes.White, adjustedRect)
064.
065.
066.
ev.Graphics.DrawImage(pageImage, adjustedRect)
067.
068.
069.
m_currentPageIndex += 1
070.
ev.HasMorePages = (m_currentPageIndex < m_streams.Count)
071.
End
Sub
072.
073.
Private
Sub
Print()
074.
If
m_streams
Is
Nothing
OrElse
m_streams.Count = 0
Then
075.
Throw
New
Exception(
"Error: no stream to print."
)
076.
End
If
077.
Dim
printDoc
As
New
PrintDocument()
078.
If
Not
printDoc.PrinterSettings.IsValid
Then
079.
Throw
New
Exception(
"Error: cannot find the default printer."
)
080.
Else
081.
AddHandler
printDoc.PrintPage,
AddressOf
PrintPage
082.
m_currentPageIndex = 0
083.
printDoc.Print()
084.
End
If
085.
End
Sub
086.
087.
088.
089.
Private
Sub
Run()
090.
Dim
report
As
New
LocalReport()
091.
report.ReportPath =
"..\..\Report.rdlc"
092.
report.DataSources.Add(
New
ReportDataSource(
"Sales"
, LoadSalesData()))
093.
Export(report)
094.
Print()
095.
End
Sub
096.
097.
Public
Sub
Dispose()
Implements
IDisposable.Dispose
098.
If
m_streams IsNot
Nothing
Then
099.
For
Each
stream
As
Stream
In
m_streams
100.
stream.Close()
101.
Next
102.
m_streams =
Nothing
103.
End
If
104.
End
Sub
105.
106.
Public
Shared
Sub
Main(
ByVal
args
As
String
())
107.
Using demo
As
New
Demo()
108.
demo.Run()
109.
End
Using
110.
End
Sub
111.
End
Class