我想出了一個解決這個問題的方法。由於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();
});
單擊事件拷貝從主頁兩個視圖狀態,然後提交表單。我很快寫了這篇文章,所以我很抱歉,如果我留下不清楚的東西。
當您單擊下一頁或上一頁按鈕時,它也會掛起。我也需要解決這個問題。 – JMS10 2015-05-13 21:05:07