asp.net - services - ReportViewer-Ocultar Exportar PDF
sql reporting services vb net (17)
- A la opción de la palabra referencia a "WORDOPENXML"
- A la opción de Excel referencia a "EXCELOPENXML"
- A la opción de PDF referencia a "PDF"
Saludos.
Hago uso de un componente ReportView en una aplicación VB.Net 2005. ¿Cómo puedo deshabilitar la funcionalidad de exportación de PDF, solo manteniendo el formato MS Excel?
Después de 4 horas de búsqueda encontré la solución. Hice algunos pequeños cambios en el código de marol para ser más pequeños:
Control ReportViewerControl = ReportViewer1.FindControl("Ctl01");
Control ExportGroupControl = ReportViewerControl.FindControl("Ctl05");
DropDownList DropDownControl = (DropDownList)ExportGroupControl.FindControl("Ctl00");
DropDownControl.PreRender += new EventHandler(ddList_PreRender);
En el código detrás, cargue un valor oculto al mostrar el informe
this.ReportServViewer.ServerReport.Refresh();
this.hidReportViewing.Value = "algo";
luego use el siguiente javascript para configurar un temporizador para verificar que los botones de exportación se procesen. Cuando estén renderizados, quite el botón y borre el temporizador.
<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>
en el complemento de carga (es decir, $ (documento) .ready ())
if ($(''#hidReportViewing'').val() != '''')
{
intervalHandler = setInterval(removePDFFromReporting, 1500);
}
Esta es la forma en que deshabilita una opción de exportación, simplemente marque todas las opciones excepto Excel a falso.
* No olvide reiniciar el servicio de Reporting Services.
Archivo: InstallPath / Reporting Services / ReportServer / rsreportserver.config
Habilitado:
<Extension Name="EXCEL"
Type="Microsoft.ReportingServices.Rendering.ExcelRenderer.ExcelRenderer,Microsoft.ReportingServices.ExcelRendering"/>
Discapacitado:
<Extension Name="EXCEL"
Type="Microsoft.ReportingServices.Rendering.ExcelRenderer.ExcelRenderer,Microsoft.ReportingServices.ExcelRendering"
Visible="false"/>
Este simple enfoque de jQuery me funcionó:
$(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();
});
He logrado hacer esto en el lado del cliente usando JavaScript en la parte inferior de la página.
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);
Inspirado en la respuesta https://.com/a/9192978/1099519 , creé dos métodos de extensión.
En mi caso, utilizo un enfoque de lista blanca al habilitar solo los formatos que deseo (por lo que deberá incluir los que desee, excepto PDF):
reportViewer.ServerReport.SetExportFormats("EXCELOPENXML", "EXCEL", "XML", "CSV");
Los Métodos de Extensión se ven así (soportando Informes de Servidor y Local):
/// <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);
}
}
}
}
Me las arreglé para deshabilitar el botón Exportar PDF con algunos retoques. La clase ReportViewer no tiene funciones de orientación pública para deshabilitar el botón de la barra de herramientas Exportar a PDF. Para hacerlo, eche un vistazo al siguiente código:
Llame a esta función durante el evento OnLoad de su página 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
No pude establecer la propiedad Visible del botón de la barra de herramientas aquí, ya que las opciones de Exportación se cargan OnDropDownOpened. En su lugar, agregué un controlador para desactivar la opción de exportación cuando se hace clic en el menú desplegable de la barra de herramientas. La función del controlador es la siguiente:
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
Básicamente, Onload está agregando un controlador de eventos para que cuando se haga clic en el botón desplegable Exportar, se ejecute la función anterior, haciendo que la exportación a PDF sea invisible.
La solución funcionará seguro, acabo de hacer que funcione.
Si tiene alguna pregunta, hágamelo saber.
Para ReportViewer> 2010 utilizo este enfoque hecho con 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");
}
});
}
Simplemente cambie el selector por su cuenta y llame a la función desde $(document).ready(function(){//here})
Si ayuda ... el código para ocultar el elemento excel em 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
... y CustomizeRV(ReportViewer1)
una llamada a CustomizeRV(ReportViewer1)
en el evento page_load
Si estás interesado en una solución javascript rápida usando jQuery ...
Simplemente reemplace el selector de reportViewer a continuación con su ID desplegable.
jQuery (''# ctl00_ContentPlaceHolder1_rptViewer_ctl01_ctl05_ctl00''). children (). remove (); jQuery (''# ctl00_ContentPlaceHolder1_rptViewer_ctl01_ctl05_ctl00''). append ("- Seleccionar formato de exportación -"); jQuery (''# ctl00_ContentPlaceHolder1_rptViewer_ctl01_ctl05_ctl00''). append ("EXCEL");
Esto elimina todas las opciones y luego vuelve a agregar en EXCEL como la única opción.
Solo haz esto después de actualizar, así:
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);
}
ver en este enlace ...
Solución de Jquery para reportviewer 2010: coloque esto en el archivo aspx que contiene el control reportviewer (asumiendo que su reportviewer se llama 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>
Espera hasta que se muestre el menú desplegable, luego oculta la opción elegida. Normalmente, el setTimeout solo ocurre una vez. Puede ocultar más / otros agregando más nth-childs, siendo el número la posición basada en 1 en el menú desplegable de la opción que desea ocultar.
Utilizando el código de Jon anterior como referencia, logro ocultar "Excel" en el programa en tiempo de ejecución. Sin embargo, no soy un buen VB.net, así que puse una muestra en C #. Lo siento, pero espero que esto ayude. Una cosa más, el informe está incrustado dentro de una página 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;
}
}
}
}
}
Estaba intentando seleccionar el elemento predeterminado a "PDF" pero no pude encontrar una manera de habilitar el botón de texto "Exportar". :-(
Yo tuve el mismo problema. Podría obtener las opciones de exportación no deseadas para ocultarlas cuando se procesó el informe, pero no funcionó en el caso de un informe detallado. El siguiente código funcionó tanto para los informes principales como para los detallados, utilizando un Informe 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);
}
}
}
El truco es llamar al método desde el método PreRender de la página:
protected void Page_PreRender(object sender, System.EventArgs e)
{
SuppressExportButton(rvMain, "PDF");
SuppressExportButton(rvMain, "Word");
}
Tuve exactamente el mismo problema y lo resolví usando el siguiente método de C #, que se encuentra here :
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);
}
}
}
y en la page_load:
DisableUnwantedExportFormat(ReportViewer1, "PDF");
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");
}
}
}
He intentado agregar el método mencionado DisableUnwantedExportFormats()
para ocultar la opción Exportar a Excel. Cuando el informe se carga por primera vez, la opción de Excel no se hace visible.
Sin embargo, cuando solía llamar al mismo método dentro del evento Drillthrough()
, la opción "Excel" y PDF se hace visible en la lista desplegable de controles de Exportación. Lo he intentado llamando a su método en la primera declaración de mi evento Drillthrough()
(como lo que usé en el método de carga de página).
Por favor, avíseme, ¿Cómo puedo ocultar la opción de Excel en el evento Drillthrough()
de Reportviewer?