水晶报告在打印后向下钻取

时间:2011-05-05 19:20:39

标签: asp.net crystal-reports

在我使用水晶报表查看器(版本13.0.2000.0)的ASP.NET应用程序中,当用户单击“打印”然后打印或取消打印时,当他们在报表中下一次向下钻取时它将永远挂起使用水晶对话框“请等待文档处理时”,旋转三角形圆圈动画。

它在IE和Firefox中执行此操作,但它不会在Chrome中执行此操作:而是打印按钮启动PDF导出,其中“查看器必须导出为PDF才能打印”。消息。这就是旧版水晶的作用。

现在我正在迫使IE和Firefox做与chrome相同的事情 - 但如果有一个真正的解决方案来解决打印问题 - 我宁愿使用它。当用户点击打印(与导出)时,他们想要打印(与导出)。

1 个答案:

答案 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事件从主页复制两个视图状态,然后提交表单。我很快就写了这篇文章,所以如果我留下一些不清楚的东西,我会道歉。