web-dev-qa-db-fra.com

ReportViewer - Cacher PDF Exportation

J'utilise un composant ReportView dans une application VB.Net 2005. Comment désactiver la fonctionnalité d'exportation PDF, en conservant uniquement le format MS Excel?

19
Lennie

J'ai eu exactement le même problème et résolu en utilisant la méthode C # suivante, trouvé ici !:

public void DisableUnwantedExportFormat(ReportViewer ReportViewerID, string strFormatName)
{
    FieldInfo info;

    foreach (RenderingExtension extension in ReportViewerID.LocalReport.ListRenderingExtensions())
     {
        if (extension.Name == strFormatName)
        {
             info = extension.GetType().GetField("m_isVisible", BindingFlags.Instance | BindingFlags.NonPublic);
            info.SetValue(extension, false);
        }
    }
}

et sur le page_load:

DisableUnwantedExportFormat(ReportViewer1, "PDF");
27
MMalke

Pour désactiver une option d’exportation, il vous suffit de cocher toutes les options sauf Excel sur false.
* N'oubliez pas de redémarrer le service Reporting Services.

Fichier: InstallPath\Reporting Services\ReportServer\rsreportserver.config

Activée:

<Extension Name="Excel"
Type="Microsoft.ReportingServices.Rendering.ExcelRenderer.ExcelRenderer,Microsoft.ReportingServices.ExcelRendering"/>

Désactivé:

<Extension Name="Excel"
Type="Microsoft.ReportingServices.Rendering.ExcelRenderer.ExcelRenderer,Microsoft.ReportingServices.ExcelRendering"
Visible="false"/>
10
rick schott

Cette approche simple de jQuery a fonctionné pour moi:

 $(document).ready(function () {
     $("a[title='PDF']").parent().hide();  // Remove from export dropdown.
     $("a[title='MHTML (web archive)']").parent().hide();  
     $("a[title='TIFF file']").parent().hide();  
 });
10
jabits

En utilisant le code de jon ci-dessus comme référence, je réussis à masquer "Excel" dans le programme au moment de l'exécution. Cependant, je ne suis pas un bon VB.net, j'ai donc mis un échantillon en C #. Désolé pour ça mais j'espère que ça aide. Une autre chose, le rapport intégré dans une page ASP.net.

  // This is the Load event of the reports itself.
  // Call the recursive method.
  protected void ReportViewerResults_Load(object sender, EventArgs e)
  {
    CustomizeRV((System.Web.UI.Control)sender);
  }

  // Patterned from Jon.
  // Traverse all controls/child controls to get the dropdownlist.
  // The first dropdown list is the ZoomGroup, followed by the ExportGroup.
  // We just wanted the ExportGroup.
  // When a dropdownlist is found, create a event handler to be used upon rendering.
  private void CustomizeRV(System.Web.UI.Control reportControl)
  {
    foreach (System.Web.UI.Control childControl in reportControl.Controls)
    {
      if (childControl.GetType() == typeof(System.Web.UI.WebControls.DropDownList))
      {
        System.Web.UI.WebControls.DropDownList ddList = (System.Web.UI.WebControls.DropDownList)childControl;
        ddList.PreRender += new EventHandler(ddList_PreRender);
      }
      if (childControl.Controls.Count > 0)
      {
        CustomizeRV(childControl);
      }
    }
  }

  // This is the event handler added from CustomizeRV
  // We just check the object type to get what we needed.
  // Once the dropdownlist is found, we check if it is for the ExportGroup.
  // Meaning, the "Excel" text should exists.
  // Then, just traverse the list and disable the "Excel".
  // When the report is shown, "Excel" will no longer be on the list.
  // You can also do this to "PDF" or if you want to change the text.
  void ddList_PreRender(object sender, EventArgs e)
  {
    if (sender.GetType() == typeof(System.Web.UI.WebControls.DropDownList))
    {
      System.Web.UI.WebControls.DropDownList ddList = (System.Web.UI.WebControls.DropDownList)sender;
      System.Web.UI.WebControls.ListItemCollection listItems = ddList.Items;

      if ((listItems != null) && (listItems.Count > 0) && (listItems.FindByText("Excel") != null))
      {
        foreach (System.Web.UI.WebControls.ListItem list in listItems)
        {
          if (list.Text.Equals("Excel")) 
          {
            list.Enabled = false;
          }
        }
      }
    }
  }

J'essayais de sélectionner l'élément par défaut "PDF" mais je n'ai pas trouvé le moyen d'activer le bouton de texte "Exporter". :-( 

4
user188924

J'ai eu le même problème. Je pouvais cacher les options d'exportation non désirées lorsque le rapport était rendu, mais cela ne fonctionnait pas dans le cas d'un rapport d'extraction. Le code suivant a fonctionné pour les rapports parent et d'extraction, à l'aide d'un rapport local:

    private void SuppressExportButton(ReportViewer rv, string optionToSuppress)
    {
        var reList = rv.LocalReport.ListRenderingExtensions();
        foreach (var re in reList)
        {
            if (re.Name.Trim().ToUpper() == optionToSuppress.Trim().ToUpper()) // Hide the option
            {
                re.GetType().GetField("m_isVisible", BindingFlags.NonPublic | BindingFlags.Instance).SetValue(re, false);
            }
        }
    }

L'astuce consiste à appeler la méthode à partir de la méthode page PreRender:

    protected void Page_PreRender(object sender, System.EventArgs e)
    {
        SuppressExportButton(rvMain, "PDF");
        SuppressExportButton(rvMain, "Word");
    }
3
Todd Murray
public void DisableUnwantedExportFormats()
{
    FieldInfo info;

    foreach (RenderingExtension extension in reportViewer.ServerReport.ListRenderingExtensions())
    {
        if (extension.Name != "PDF" && extension.Name != "Excel") // only PDF and Excel - remove the other options
        {
            info = extension.GetType().GetField("m_isVisible", BindingFlags.Instance | BindingFlags.NonPublic);
            info.SetValue(extension, false);
        }

        if (extension.Name == "Excel") // change "Excel" name on the list to "Excel 97-2003 Workbook"
        {
            info = extension.GetType().GetField("m_localizedName", BindingFlags.Instance | BindingFlags.NonPublic);
            if (info != null) info.SetValue(extension, "Excel 97-2003 Workbook");
        }
    }
}

J'ai essayé en ajoutant la méthode DisableUnwantedExportFormats() ci-dessus pour masquer l'option d'exportation vers Excel. Lorsque le rapport est chargé pour la première fois, l'option Excel n'est pas visible.

Cependant, lorsque j’appelais la même méthode dans l’événement Drillthrough() "Excel" & PDF, l’option étant visible dans le menu déroulant Contrôles d’exportation. J'ai essayé d'appeler votre méthode dans la première instruction de mon événement Drillthrough() (comme ce que j'ai utilisé dans la méthode de chargement de page).

Faites-moi savoir, comment masquer l'option Excel dans l'événement Drillthrough() de Reportviewer.

2
whizkidguys
  1. Vers la référence d'option Word à "WORDOPENXML"
  2. Vers l'option Excel référence à "EXCELOPENXML"
  3. Vers PDF référence d'option à "PDF"

Cordialement.

2
Ricardo

Solution Jquery pour reportviewer 2010: Insérez ceci dans le fichier aspx contenant le contrôle reportviewer (en supposant que votre rapportviewer s'appelle ReportViewer1)

<script type="text/javascript">
    $(document).ready(function () {
        hideExportOptions();
    });

    function hideExportOptions() {
        //Find the menu id by getting the parent of the parent of one of the export links
        var menuID = $("a[onclick=\"$find('ReportViewer1').exportReport('PDF');\"]").parent().parent().attr("id");
        if ($("#" + menuID).length > 0) {
            $("#" + menuID  + " div:nth-child(3)").css('display', 'none');
        }
        else {
            setTimeout("hideExportOptions()", 1000);
        }
    }

</script> 

Il attend que le menu déroulant soit affiché, puis masque l'option choisie. En règle générale, setTimeout ne se produit qu'une seule fois. Vous pouvez masquer plus/autres en ajoutant plusieurs nth-enfants, le nombre étant la position 1 dans le menu déroulant de l'option que vous souhaitez masquer.

2
Lomak

J'ai réussi à désactiver le bouton PDF Export avec quelques retouches. La classe ReportViewer ne dispose d'aucune fonction publique permettant de désactiver le bouton Exporter vers PDF de la barre d'outils. Pour le faire, jetez un oeil au code suivant:

Appelez cette fonction lors de l'événement OnLoad de votre page reportViewer:

 Private Sub CustomizeRV(ByVal ctrl As Control)
    For Each c As Control In ctrl.Controls
      If TypeOf c Is ToolStrip Then
        Dim ts As ToolStrip = DirectCast(c, ToolStrip)
        For i As Integer = 0 To ts.Items.Count - 1
          If ts.Items(i).Name = "export" Then
            Dim exp As ToolStripDropDownButton = ts.Items(i)
            AddHandler exp.DropDownOpening, AddressOf disableButton
          End If
        Next
      End If
      If c.HasChildren Then
        CustomizeRV(c)
      End If
    Next
  End Sub

Je ne pouvais pas définir la propriété Visible du bouton toolstrip ici, car les options d'exportation sont chargées dans OnDropDownOpened. Au lieu de cela, j'ai ajouté un gestionnaire chargé de désactiver l'option d'exportation lorsque l'utilisateur clique sur la liste déroulante de la barre d'outils. La fonction de gestionnaire est la suivante:

  Private Sub disableButton(ByVal sender As Object, ByVal e As System.EventArgs)
    Dim btn As ToolStripDropDownButton = DirectCast(sender, ToolStripDropDownButton)
    btn.DropDownItems(1).Visible = False
  End Sub

En résumé, lors du chargement, vous ajoutez un gestionnaire d’événements de sorte que lorsque vous cliquez sur le bouton Exporter la liste déroulante, la fonction ci-dessus s’exécute, ce qui rend l’Exportation vers PDF invisible.

La solution fonctionnera à coup sûr, je viens juste de le faire fonctionner. 

Si vous avez des questions dites le moi.

2
jgallant

Pour ReportViewer> 2010, j'utilise cette approche faite avec jQuery

function HideExtension(ext) {
        var $reportViewer = $("[id*=ReportViewer1]");
        var $botons = $reportViewer.find("a");
        $botons.each(function (index,element) {
            if($(element).html()==ext)
            {
                $(element).parent().css("display", "none");
            }
        });
    }

Il suffit de changer le sélecteur et d'appeler la fonction de $(document).ready(function(){//here})

1
Robert K

Si cela vous aide ... le code pour masquer l'élément Excel dans VB.Net (.Net 3.5)

Private Sub CustomizeRV(ByVal ctrl As ReportViewer)

    For Each c As Control In ctrl.Controls

        If c.GetType.ToString = "Microsoft.Reporting.WebForms.ToolbarControl" Then

            For Each ct In c.Controls

                If ct.GetType.ToString = "Microsoft.Reporting.WebForms.ExportGroup" Then

                    Dim cbo As DropDownList = CType(ct.controls(0), DropDownList)

                    AddHandler cbo.PreRender, AddressOf cboExportReportViewer_PreRender

                End If

            Next

        End If

    Next

End Sub

Protected Sub cboExportReportViewer_PreRender(ByVal sender As Object, ByVal e As System.EventArgs)

    Dim cbo = CType(sender, DropDownList)

    For i As Integer = 0 To cbo.Items.Count - 1

        If cbo.Items(i).Text.ToLower = "Excel" Then
            cbo.Items.Remove(cbo.Items(i))
            Exit Sub
        End If

    Next

End Sub

... et mettez un appel à CustomizeRV(ReportViewer1) dans l'événement page_load

1
Victor

Dans le code derrière, charge une valeur cachée lors de l'affichage du rapport

this.ReportServViewer.ServerReport.Refresh();
this.hidReportViewing.Value = "algo";

utilisez ensuite le javascript suivant pour définir une minuterie afin de vérifier que les boutons d'exportation doivent être rendus. Quand ils sont rendus, retirez le bouton et effacez la minuterie.

<script>
 var intervalHandler;
 var maxTries = 10;
 var currentTries = 0;

 function removePDFFromReporting() {
            var clear = false;
            if (intervalHandler != null) {                 
                if ($('#hidReportViewing').val() != '') {                    
                    var anchor = $("#<%= ReportServViewer.ClientID%>_fixedTable  a:contains('PDF')");
                    if (anchor.length == 0) {
                        currentTries = currentTries + 1;
                        clear = currentTries >= maxTries;
                    }
                    else {
                        anchor.remove();
                        clear = true;                       
                    }
                }
            }

            if (clear) {
                $('#hidReportViewing').val('');
                clearInterval(intervalHandler);
                intervalHandler = null;
            }
        }

</script>

dans le on load ajouter (ie $ (document) .ready ())

if ($('#hidReportViewing').val() != '')
 {
               intervalHandler = setInterval(removePDFFromReporting, 1500);
 }
1
Adrian M

faites ceci seulement après Refresh, comme ceci:

ReportViewer1.LocalReport.Refresh ();

                string exportOption = "PDF";
                RenderingExtension extension = ReportViewer1.LocalReport.ListRenderingExtensions().ToList().Find(x => x.Name.Equals(exportOption, StringComparison.CurrentCultureIgnoreCase));
                if (extension != null)
                {
                    System.Reflection.FieldInfo fieldInfo = extension.GetType().GetField("m_isVisible", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic);
                    fieldInfo.SetValue(extension, false);
                }

voir sur ce lien ...

https://www.aspsnippets.com/Articles/ASPNet-RDLC-Local-SSRS-Report-Viewer-Hide-Disable-specific-export-option-Word-Excel-PDF-from-Export-button.aspx

1
willian martinez

J'ai réussi à le faire côté client en utilisant JavaScript au bas de la page.

var exportSelectBox = document.getElementById("ReportViewer1__ctl1__ctl5__ctl0");
exportSelectBox.remove(7);
exportSelectBox.remove(6);
exportSelectBox.remove(5);
exportSelectBox.remove(4);
exportSelectBox.remove(1);
exportSelectBox.remove(1);
1
Leon

Après 4 heures de recherche, j'ai trouvé la solution. J'ai apporté quelques modifications au code de marol pour qu'elles soient plus petites:

        Control ReportViewerControl = ReportViewer1.FindControl("Ctl01");
        Control ExportGroupControl = ReportViewerControl.FindControl("Ctl05");
        DropDownList DropDownControl = (DropDownList)ExportGroupControl.FindControl("Ctl00");
        DropDownControl.PreRender += new EventHandler(ddList_PreRender);
0
edoardo

Si vous êtes intéressé par une solution javascript rapide utilisant jQuery ..

Il suffit de remplacer le sélecteur reportViewer ci-dessous par votre ID de liste déroulante.

jQuery ( '# ctl00_ContentPlaceHolder1_rptViewer_ctl01_ctl05_ctl00') Les enfants () remove (); jQuery ( '# ctl00_ContentPlaceHolder1_rptViewer_ctl01_ctl05_ctl00') append ( "- Sélectionnez le format d'exportation -")... [. .____] jQuery ( '# ctl00_ContentPlaceHolder1_rptViewer_ctl01_ctl05_ctl00 ') .append ("Excel");

Cela supprime toutes les options, puis ajoute de nouveau dans Excel comme seule option.

0
Jamsi

Inspiré par la réponse https://stackoverflow.com/a/9192978/1099519 j'ai créé deux méthodes d'extension.

Dans mon cas, j'utilise une approche de liste blanche en activant uniquement les formats que je veux (vous auriez donc besoin d'inclure ceux que vous voulez sauf PDF):

reportViewer.ServerReport.SetExportFormats("EXCELOPENXML", "Excel", "XML", "CSV");

Les méthodes d’extension se présentent comme suit (prenant en charge les rapports serveur et les rapports locaux):

/// <summary>
/// Extension for ReportViewer Control
/// </summary>
public static class ReportViewerExtensions
{
    private const string VisibleFieldName = "m_isVisible";
    /// <summary>
    /// Sets the supported formats on the <see cref="ServerReport"/>
    /// </summary>
    /// <param name="serverReport"><see cref="ServerReport"/> instance to set formats on</param>
    /// <param name="formatNames">Supported formats</param>
    public static void SetExportFormats(this ServerReport serverReport, params string[] formatNames)
    {
        SetExportFormats(serverReport.ListRenderingExtensions(), formatNames);
    }
    /// <summary>
    /// Sets the supported formats on the <see cref="LocalReport"/>
    /// </summary>
    /// <param name="localReport"><see cref="LocalReport"/> instance to set formats on </param>
    /// <param name="formatNames">Supported formats</param>
    public static void SetExportFormats(this LocalReport localReport, params string[] formatNames)
    {
        SetExportFormats(localReport.ListRenderingExtensions(), formatNames);
    }

    /// <summary>
    /// Setting the visibility on the <see cref="RenderingExtension"/>
    /// </summary>
    /// <param name="renderingExtensions">List of <see cref="RenderingExtension"/></param>
    /// <param name="formatNames">A list of Formats that should be visible (Case Sensitive)</param>
    private static void SetExportFormats(RenderingExtension[] renderingExtensions, string[] formatNames)
    {
        FieldInfo fieldInfo;
        foreach (RenderingExtension extension in renderingExtensions)
        {
            if (!formatNames.Contains(extension.Name))
            {
                fieldInfo = extension.GetType().GetField(VisibleFieldName, BindingFlags.Instance | BindingFlags.NonPublic);
                fieldInfo.SetValue(extension, false);
            }

        }
    }
}
0
DominikAmon