2011-05-05 58 views
2

在我的ASP.NET應用程序使用水晶報表查看器(版本13.0.2000.0),當用戶點擊「打印」,然後打印或取消打印,當他們下一次鑽在報告中,它將隨着旋轉三角形圓圈動畫的水晶對話框「請稍候文件正在處理」而永久掛起。水晶報告掛在打印後鑽取

它在IE和Firefox中這樣做,但它不在Chrome中執行此操作:取而代之的是打印按鈕啓動PDF導出,「查看器必須導出爲PDF才能打印」。消息。這是水晶的舊版本所做的。

現在我正在強迫IE和Firefox做同樣的事情 - 但如果真的有解決打印問題的方法 - 我寧願使用它。看起來,當用戶點擊打印(與導出)他們想要打印(對比出口)。

+0

當您單擊下一頁或上一頁按鈕時,它也會掛起。我也需要解決這個問題。 – JMS10 2015-05-13 21:05:07

回答

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(); 
}); 

單擊事件拷貝從主頁兩個視圖狀態,然後提交表單。我很快寫了這篇文章,所以我很抱歉,如果我留下不清楚的東西。