加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MsSql教程 > 正文

.net – 无预览打印ServerReport

发布时间:2020-12-12 08:46:13 所属栏目:MsSql教程 来源:网络整理
导读:我有一个SQLServer 2005 Reporting Services ServerReport通过ReportViewer控件部署和经常由我的 Winforms应用程序(Framework 2.0)使用. 我需要的是从应用程序的一种形式提供一键式打印按钮,仅触发打印对话框,而不会打开ReportViewer. 我一直在尝试将报表呈现
我有一个SQLServer 2005 Reporting Services ServerReport通过ReportViewer控件部署和经常由我的 Winforms应用程序(Framework 2.0)使用.

我需要的是从应用程序的一种形式提供一键式打印按钮,仅触发打印对话框,而不会打开ReportViewer.

我一直在尝试将报表呈现到一个字节数组,但是我无法得到这样的结果.

该报告有多个页面,所以我不知道“Image”渲染是否适用于本地报告,它也将用于服务器报告.

我一直在扔MSDN,但只有参考本地报告:

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

而我可以在服务器端报告中得到的一些信息是使用对ReportServer Web服务的Web引用,我不希望这样.

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

有没有办法打印服务器报告,使用打印对话框,而不向用户显示报告查看器(我不介意是否在幕后)?

解决方法

好的,终于想出来了.

检查此链接:
Printing Reporting Services 2005 Reports

那个博客文章几乎有我需要的一切,但是我将在这里发表完整的答案以供参考.

我最终在幕后使用报表查看器对象,但仅为方便起见,因为它不是必需的.

第一步是要求用户打印机设置:

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

这样,我们继续配置我们的报告电话:
修改此字符串后,您可以在任何纸张尺寸和任何方向(切换高度和宽度)进行打印,但报表本身必须在相同的页面布局中进行配置.

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 = ""

最后,我们将报告与其所有页面一起呈现.

请注意,如果报表只有一页,则不会使用renderStream方法.

rpt_control是以前配置并针对服务器报告的报表查看器控件.

请注意,在本代码中,我们将页面添加到列表.该列表是一个全局变量,因为它需要在PrintPageHandler方法中.

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

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

到目前为止,我们根本没有完成任何打印,这实际上是由我们前面引用的PrintPageHandler方法处理的.

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,page.Width,page.Height)
    e.HasMorePages = pageIndex < pages.Count
End Sub

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读