mardi 17 février 2009

[ReportViewer] Ajouter un LinkButton dans la Toolbar du ReportViewer

Avec le ReportViewer fournit dans VS2008, il est possible d’exporter les rapports dans plusieurs formats.

Il suffit pour cela de mettre la propriété “ShowExportControls” à True.

image Voilà ce qui apparait dans la toolbar du ReportViewer.

Mais dans ce cas, où l’on a qu’un seul type d’export (ici PDF), l’utilisateur ne comprend pas pourquoi il devrait choisir vu qu’il n’y a qu’un type.

Donc dans ce qui suit, je vais rapidement exposer comment faire pour rajouter un linkButton qui permettra le téléchargement du PDF.

 

Tout d’abord, pour faire simple, je créé une méthode permettant de rechercher le reportViewer contenu dans un control

[sourcecode language='c-sharp']

public static ReportViewer GetReportViewerFromControl(Control ctrl)
        {
            // récupere le ContentPlaceHolder1
            return Xtr.ToolBox.WebUiExtensions.ControlsAvecRecursivite(ctrl)
            .OfType()
            .FirstOrDefault();
        }

[/sourcecode]

Pour récupérer le premier reportViewer d’un control, j’utilise la méthode de Jérémy ( ControlsAvecRecursivite)

 

Dans le OnLoad de ma page je vais donc cacher le groupe Export et ajouter mon bouton d’export

[sourcecode language='c-sharp']

ReportViewer rv = GetReportViewerFromControl(this);
                if (rv != null)
                {
                    //la liste déroulante du format d'export
                    rv.ShowExportControls = false;

                    //Ajoute le bouton d'export PDF
                    AddExportButtonToReportToolbar(rv);
                }

[/sourcecode]

Dans mon cas, j’ai décidé d’ajouter mon bouton d’exportation dans le groupe d’impression.

Je passe donc le reportViewer en argument de ma méthode et celle-ci, cherchera le groupe d’impression et y ajoutera mon bouton.

[sourcecode language='c-sharp']

private void AddExportButtonToReportToolbar(ReportViewer rv)
        {
                if (rv != null)
                {
                    foreach (Control c in rv.Controls)
                    {
                        //recherche de la toolbar
                        if (c.ToString() == "Microsoft.Reporting.WebForms.ToolbarControl")
                        {
                            foreach (Control ssc in c.Controls)
                            {
                                //on l'ajoute dans le groupe de l'impression
                                if (ssc.ToString() == "Microsoft.Reporting.WebForms.PrintGroup")
                                {
                                    LinkButton lkButton = new LinkButton();
                                    lkButton.ID = "lkButtonExportPDF";
                                    lkButton.CausesValidation = false;
                                    lkButton.Text = "Exporter en PDF";
                                    lkButton.Click+=new EventHandler(lkButton_Click);
                                    lkButton.ToolTip = "Export PDF";
                                    ssc.Controls.Add(lkButton);
                                }
                            }
                        }
                    }
                }
        }

[/sourcecode]

La dernière étape consiste donc à gérer l’évenement click de mon bouton qui permettra l’ouverture du rapport exporté au format PDF

[sourcecode language='c-sharp']

private void lkButton_Click(object sender, EventArgs e)
        {
            ReportViewer rv = HelperBase.GetReportViewerFromControl(this);

            if (rv != null)
            {
                Warning[] warnings = null;
                string[] streamids = null;
                string mimeType = string.Empty;
                string encoding = string.Empty;
                string extension = string.Empty;
                Byte[] bytes = rv.LocalReport.Render("PDF", string.Empty, out mimeType, out encoding, out extension, out streamids, out warnings);
                Response.ContentType = "Application/pdf";
                Response.AddHeader("Content-Disposition", "attachment; filename=export.pdf");
                Response.AddHeader("Cache-Control", "must-revalidate, post-check=0, pre-check=0");
                Response.AddHeader("Pragma", "no-cache");
                Response.AddHeader("Expires", "0");
                Response.OutputStream.Write(bytes, 0, bytes.Length);
                Response.Flush();
            }
        }

[/sourcecode]

Le résultat est le suivant :

image

Le code est assez simple et certainement pas optimisé mais il permet une première approche dans l’ajout de fonctionnalités à la toolbar des reportViewer.

Aucun commentaire:

Enregistrer un commentaire