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.
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