在我使用水晶报表查看器(版本13.0.2000.0)的ASP.NET应用程序中,当用户单击“打印”然后打印或取消打印时,当他们在报表中下一次向下钻取时它将永远挂起使用水晶对话框“请等待文档处理时”,旋转三角形圆圈动画。
它在IE和Firefox中执行此操作,但它不会在Chrome中执行此操作:而是打印按钮启动PDF导出,其中“查看器必须导出为PDF才能打印”。消息。这就是旧版水晶的作用。
现在我正在迫使IE和Firefox做与chrome相同的事情 - 但如果有一个真正的解决方案来解决打印问题 - 我宁愿使用它。当用户点击打印(与导出)时,他们想要打印(与导出)。
答案 0 :(得分:0)
我想出了一个解决这个问题的方法。由于Crystal Reports不允许覆盖按钮,因此我最终隐藏了打印按钮并使用JavaScript / jQuery添加了我自己的打印按钮。
以下是有关打印工作方式的一些内幕消息。当您按下打印按钮时,它会使用视图状态和事件参数进行回发。帖子返回一个PDF文件,浏览器以内联方式打开。 PDF文件嵌入了打印命令,该命令在文件打开时执行。
所以我们可以做的是使用隐藏的IFRAME来加载可打印的PDF。这样主页面就不会受到影响。我认为PDF加载内联是导致页面/浏览器破坏其状态的原因。
将以下代码放在ASPX页面的顶部。您必须将它放在页面顶部,否则如果您将其放在屏幕底部,则打印对话框将不在屏幕上。
这是HTML:
<iframe id="HiddenFrame" name="HiddenFrame" style="display: none;"></iframe>
<form id="PrintForm" action="MyPage.aspx" method="post" target="HiddenFrame">
<!-- Change the name if your object is not named 'CrystalReportViewer1' -->
<input type="hidden" name="__CRYSTALSTATECrystalReportViewer1" id="CRState" />
<input type="hidden" name="__VIEWSTATE" id="VState" />
<!-- Change this value to match your CrystalReportViewer object's name. -->
<input type="hidden" name="__EVENTTARGET" value="CrystalReportViewer1" />
<!-- This is the print command that is sent. -->
<input type="hidden" name="__EVENTARGUMENT" value='{"text":"PDF", "range":"false", "tb":"crpdfprint"}' />
</form>
如上所述,IFRAME将加载我们的PDF。该表单用于使用视图状态和事件参数对服务器执行POST。 target
属性告诉表单加载IFRAME。
这是JavaScript:
// Hide the print button.
$('#CrystalReportViewer1_toptoolbar_print').hide();
// Inject our own print button. You can apply the same icon to your print button using CSS to make it look like the original icon.
$('#CrystalReportViewer1_toptoolbar_print').parent().append('<div id="PrintButtonOverride"></div>');
// When user clicks our print button, copy the states and submit the form.
$('#PrintButtonOverride').click(function () {
$('#CRState').val($('#__CRYSTALSTATECrystalReportViewer1').val());
$('#VState').val($('#__VIEWSTATE').val());
$('#PrintForm').submit();
});
click事件从主页复制两个视图状态,然后提交表单。我很快就写了这篇文章,所以如果我留下一些不清楚的东西,我会道歉。