2011-05-05 4 views
2

Dans mon application ASP.NET à l'aide de la visionneuse de rapports Crystal (ver 13.0.2000.0), lorsque l'utilisateur clique sur "Imprimer", puis imprime ou annule l'impression, lors de la prochaine opération. Dans le rapport, il sera suspendu pour toujours avec le dialogue de cristal "S'il vous plaît attendez pendant que le document est en cours de traitement" avec animation de cercle triangle en rotation. Il le fait dans IE et Firefox, mais il ne le fait PAS dans Chrome: le bouton d'impression lance plutôt l'exportation PDF avec le "Le visualiseur doit exporter au format PDF pour imprimer". Messagerie. C'est ce que les anciennes versions de cristal ont fait.Le rapport Crystal se bloque après l'impression

En ce moment je vais devoir forcer IE et Firefox à faire la même chose que le chrome - mais s'il y a une vraie solution au problème d'impression - je préfère l'utiliser. Il semble que lorsqu'un utilisateur clique sur Imprimer (vs export), il veut imprimer (vs exporter).

+0

Il se bloque également lorsque vous cliquez sur les boutons de page Suivant ou Précédent. J'ai aussi besoin d'une solution à ce problème. – JMS10

Répondre

0

J'ai trouvé un travail pour cela. Comme Crystal Reports ne permet pas de surcharger les boutons, j'ai fini par cacher le bouton d'impression et j'ai ajouté mon propre bouton d'impression en utilisant JavaScript/jQuery.

Voici quelques informations sous-jacentes sur le fonctionnement de l'impression. Lorsque vous appuyez sur le bouton d'impression, il effectue une publication avec les états d'affichage et les arguments d'événement. La publication renvoie un fichier PDF que le navigateur ouvre en ligne. Le fichier PDF est intégré avec une commande d'impression qui est exécutée lors de l'ouverture du fichier. Donc, ce que nous pouvons faire est d'utiliser un IFRAME caché pour charger le PDF imprimable. De cette façon, la page principale n'est pas affectée. Je pense que le chargement de PDF en ligne est ce qui amène la page/le navigateur à corrompre son état.

Placez le code ci-dessous en haut de votre page ASPX. Vous devez le placer en haut de la page sinon la boîte de dialogue d'impression sera hors de l'écran si vous la mettez en bas.

Voici le code 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> 

Comme mentionné ci-dessus, l'IFRAME chargera notre PDF. Le formulaire est utilisé pour effectuer un POST sur le serveur avec les états d'affichage et les arguments d'événement. L'attribut target indique le formulaire à charger dans l'IFRAME.

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

Les copies d'événements cliquez sur les deux états d'affichage de la page principale et soumet ensuite la forme. J'ai écrit ce post rapidement, donc je m'excuse si j'ai laissé quelque chose de flou.