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?
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");
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"/>
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();
});
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". :-(
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");
}
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.
Cordialement.
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.
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.
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})
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
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);
}
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 ...
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);
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);
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.
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);
}
}
}
}