Crystal report viewer

Soyez le premier à donner votre avis sur cette source.

Vue 14 362 fois - Téléchargée 1 349 fois

Description

Ce UserControl permet de changer dynamiquement le type de rapport (en plus de la source de données).

De plus, il résout le problème de cache dans le composant Crystal Report Viewer, qui empêche de mettre à jour correctement le rapport.
Plus exactement, le bug qui existe avec Crystal Report Viewer est le suivant : Chargez un jeu de données dans un rapport, visionnez quelques pages de ce rapport, puis regénérez le rapport avec un autre jeu de données. Les pages déjà affichées après la 1ère génération restent en cache et leurs données ne sont pas mises à jour.

Ce User Control est un projet de type Windows Control Library.

Source / Exemple :


// Load Crystal Report
crViewerInterop1.SetDataSource(typeof(MY_CR), dataTable);

// Le code qui se cache derrière cette fonction est le suivant :

/// <summary>
/// Loads ans shows the CR Viewer. Thread-safe
/// </summary>
/// <param name="crReportType">Type of the Report</param>
/// <param name="dtSource">DataTable that contains the data</param>
public void SetDataSource(Type crReportType, DataTable dtSource)
{
    if (this.InvokeRequired)
        this.Invoke(new SetDataSourceDelegate(SetDataSource), new object[] { crReportType, dtSource });
    else
    {
        ReportClass crReport = ReloadCrPreview(crReportType);
        try
        {
            crReport.SetDataSource(dtSource);
            crPreview.CrViewer.RefreshReport();
            crReport.Refresh();
        }
        catch
        {
            /* A msgbox "Load Report Failed" id shown */
        }
    }
}

/// <summary>
/// Recharger le composant CR pour effacer le cache.
/// Sinon les pages visualisées restent dans le cache et ne seront pas mises à jour dans l'aperçu
/// </summary>
private ReportClass ReloadCrPreview(Type crReportType)
{
    // Ne pas cacher le panel parent pendant le redessinage -> "Load Report Failed" !
    crPreview.CrViewer.ReportSource = null;
    crPreview.Dispose();

    // Create ReportClass
    crReport = (ReportClass)Activator.CreateInstance(crReportType);
    crPreview = new CrViewerControl();
    crPreview.CrViewer.ReportSource = crReport;
    // 
    // crPreview (from Designer.cs)
    // 
    crPreview.Dock = System.Windows.Forms.DockStyle.Fill;
    crPreview.Name = "crPreview";

    // Add new control
    panelCrViewer.Controls.Add(this.crPreview);

    Application.DoEvents(); // NE PAS RETIRER -> "Load Report Failed" !

    return crReport;
}

Conclusion :


L objet ReportClass (le rapport) est accessible via la propriété CrViewerInterop.CrReport.
Par exemple :

// Export PDF
crViewerInterop1.CrReport.ExportToDisk(
CrystalDecisions.Shared.ExportFormatType.PortableDocFormat,
filename);

Comment utiliser le contrôle compilé ?
Pour utiliser ce User Control, il faut d abord créer un dossier « res » (pour Ressources) dans votre solution, puis y copier la dll.
Ouvrez votre solution dans Visual Studio, faites un « Choose Items... » dans la Toolbox, puis à l aide du bouton « Browse » allez chercher la dll dans votre répertoire Res pour ajouter le contrôle. Le contôle apparait alors dans votre Toolbox. Vous n'avez plus qu a glisser déposer le controle dans une form, et utiliser la ligne suivante pour charger votre rapport de type MY_CR :

// Load Crystal Report
crViewerInterop1.SetDataSource(typeof(MY_CR), dataTable);

Codes Sources

A voir également

Ajouter un commentaire

Commentaires

TheOnlyMaX
Messages postés
37
Date d'inscription
lundi 6 octobre 2003
Statut
Membre
Dernière intervention
26 avril 2010
-
L'avantage de ce User Control est que vous n'avez pas a determiner a l avance le type de rapport qui sera utilise : vous pouvez changer instantanément la source et le type de rapport.
khedidija
Messages postés
34
Date d'inscription
samedi 16 février 2008
Statut
Membre
Dernière intervention
11 mai 2011
2 -
mercii c vraiment utile
tayebchemingui
Messages postés
12
Date d'inscription
mercredi 30 mars 2011
Statut
Membre
Dernière intervention
19 septembre 2012
-
Bonjour tous,

Comment je peut intégrer ce code sous mon application vb6 ?, je le copie sous USERCONTROLE? car j'ai déjà un code copié dedans pour l'affichage, ou je crée un nouveau contrôle d'utilisateur et je copie le code dedans?
tayebchemingui
Messages postés
12
Date d'inscription
mercredi 30 mars 2011
Statut
Membre
Dernière intervention
19 septembre 2012
-
j'utilise VB6 et non .NET

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.