我在尝试从 ASP.Net 页面打印 Crystal Reports 报告时遇到了一些严重问题。这是当前的设置:
- Crystal Reports 查看器设置在页面上。查看报告时报告显示正常。
- 报表查看器 PrintMode 设置为 ActiveX
- 根据 SAP 的建议(在他们的知识库文章之一中找到),我正在从会话变量设置报告数据源。通过调用 WCF 服务设置报表数据源。传递到报告中的数据很好。(同样,报告显示得很好,显示所有内容都应该如此)。
- ASP.Net 应用程序和相关服务的构建目标是 x86。
- 一切都使用 Crystal Reports 版本 13,ASP.Net Web 应用程序使用 .Net 4。它正在 Internet Explorer 8 中查看。
- 我已经尝试检查 Internet Explorer 8 上的 ActiveX 设置,它们都不应该是问题(一切都设置为允许或提示)。
- 无论是从 IDE 还是从单独服务器上的设置网站运行它,都会发生错误。
- 另一台服务器上 IIS 中的应用程序池设置被设置为允许 32 位应用程序。
当我单击报表查看器上的打印图标时,我收到以下错误消息:
“发生通信错误。将停止打印。”
同样的错误发生在不止一台机器上。如果我在错误消息上单击“确定”,下面的对话框会显示“正在加载 Crystal Reports 打印控件,请稍候。”。如果我等待,什么都不会发生。没有提示安装 ActiveX 控件,也没有弹出任何内容允许我选择打印机(我知道其中安装了几个)。
我试过做以下事情,但都没有奏效:
- 将报告类型切换为 PDF。如果我这样做,然后单击报告查看器上的打印按钮,我会收到以下错误:
Microsoft JScript 运行时错误:需要对象。”
它特别打破了这一行:
bobj.crv.stateManager.setComponentState('MainContent_reportViewer_UI ',eval('('+document.getElementById(' _CRYSTALSTATEctl00$MainContent$reportViewer').value+')'));
报告中有几个动态图像,但在查看报告时它们都正确显示。它们是我能想到的与此报告相关联的唯一二进制对象。错误发生在为页面动态创建的代码中——不是我写的。
- 我尝试从正确的 .cab 文件手动安装 ActiveX 控件。这在任何情况下都没有区别。
- 我已经安装了最新的 Crystal Reports 服务包(服务包 3)。同样,这并没有改变任何东西。
- 根据我遇到的一些论坛帖子的建议,我已尝试在默认网站内为 CrystalReportViewers13 设置虚拟目录。这也没有任何效果。
- 在页面上启用 ViewState 对打印是否有效没有影响。
- 我尝试添加我自己的打印按钮和一个包含可用打印机列表的下拉列表。当我单击自己的自定义打印按钮并调用 PrintToPrinter() 时,我收到与尝试打印 PDF 报告相同的错误消息:
“Microsoft JScript 运行时错误:需要对象”
...并且它在单击“打印”按钮时尝试打印 PDF 报告时在同一行中断。
至少一天以来,我一直在反对这一点,而且我还没有什么想法。任何人都知道可能导致这种情况的原因是什么?
编辑:
好吧,这就是我为了让事情正常工作而做的事情。它最终比我想象的要简单得多:
将整个 ReportDocument 填充到会话中。您的页面加载应如下所示:
protected void Page_Load(object sender, EventArgs e) { if (Session["report"] != null) { reportViewer.ReportSource = Session["report"]; } BuildReport(); }
使 ReportViewer 尽可能简单 - 不要指定报告类型(PDF 或 ActiveX)。将其设置为任何东西似乎都会导致问题。这是它在页面源代码中的样子:
......就是这样。我不敢相信我花了大约一天的时间试图让它工作,结果却如此简单。希望这篇文章可以帮助其他面临同样问题的人。