Welcome to OStack Knowledge Sharing Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
405 views
in Technique[技术] by (71.8m points)

.net - Printing ServerReport without Preview

I have a SQLServer 2005 Reporting Services ServerReport deployed and frequently used by my Winforms app (Framework 2.0) via the ReportViewer control.

What I need is to provide a one-click print button from one of the forms of the app that triggers only the print dialog, without bringing up the ReportViewer.

I've been experimenting with rendering the report to a byte array, but I can't get pass that.

This report has multiple pages, so i don't know if the "Image" rendering that works for local reports it's going to work also for server reports.

I've been looking throw MSDN but there is only reference to local reports:

http://msdn.microsoft.com/en-us/library/ms252091(VS.80).aspx

And the little information that I can get on server side reports are using Web references to the ReportServer web service, and I don't want that.

http://blogs.msdn.com/bryanke/articles/71491.aspx

Is there any way to print a server report, using the print dialog, without showing the report viewer to the user (I don't mind if it's behind the scenes)?

See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Answer

0 votes
by (71.8m points)

Ok, Finally figured out.

That blog post has almost everything that I needed, but I'm going to post the full answer here for references.

I ended up using the report viewer object behind the scenes, but only for convenience, since it's not required.

The first step is asking the user for the printer settings:

Dim doc As New Printing.PrintDocument()
AddHandler doc.PrintPage, AddressOf PrintPageHandler
Dim dialog As New PrintDialog()
dialog.Document = doc
Dim print As DialogResult
print = dialog.ShowDialog()
doc.PrinterSettings = dialog.PrinterSettings

Having that, we proceed to configure our report call: Modifying this string, you can get to print on any paper size and any orientation (switching height and width for landscape), but the report itself must be configured in the same page layout.

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
Dim streamids() As String
Dim mimeType, encoding, filenameExtension, path As String
mimeType = "" : encoding = "" : filenameExtension = ""

Finally, we render the report with all its pages.

Note that if the report has only one page, the renderStream method is never used.

rpt_control is the report viewer control, previously configured and aiming at a server report.

Note allso that in this code we add pages to a list. This list is a global variable, since it's needed in the PrintPageHandler method.

Dim data() As Byte
rpt_control.ServerReport.SetParameters(_parametros)
data = rpt_control.ServerReport.Render("Image", deviceInfo, mimeType, encoding, filenameExtension, streamids, warnings)
pages.Add(New Metafile(New MemoryStream(data)))

For Each pageName As String In streamids
    data = rpt_control.ServerReport.RenderStream("Image", pageName, deviceInfo, mimeType, encoding)
    pages.Add(New Metafile(New MemoryStream(data)))
Next
doc.Print()

Until now, we haven't done any printing at all, this is actually handled by the PrintPageHandler method that we referenced earlier.

Dim pages As New List(Of Metafile)
Dim pageIndex As Integer = 0
Private Sub PrintPageHandler(ByVal sender As Object, ByVal e As PrintPageEventArgs)
    Dim page As Metafile = pages(pageIndex)
    pageIndex += 1
    e.Graphics.DrawImage(page, 0, 0, page.Width, page.Height)
    e.HasMorePages = pageIndex < pages.Count
End Sub

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome to OStack Knowledge Sharing Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...