Crystal report viewer

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

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.