Подтвердить что ты не робот

ReportViewer - Скрыть экспорт PDF

Я использую компонент ReportView в приложении VB.Net 2005. Как отключить функцию экспорта PDF, сохраняя только формат MS Excel?

4b9b3361

Ответ 1

У меня была точно такая же проблема и решена с использованием следующего метода С#, найденного здесь!:

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);
        }
    }
}

и на странице_load:

DisableUnwantedExportFormat(ReportViewer1, "PDF");

Ответ 2

Вот как вы отключите опцию экспорта, просто отметьте все, кроме Excel, false.
* Не забудьте перезапустить службу служб Reporting Services.

Файл: InstallPath\Reporting Services\ReportServer\rsreportserver.config

Включено:

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

Отключено:

<Extension Name="EXCEL"
Type="Microsoft.ReportingServices.Rendering.ExcelRenderer.ExcelRenderer,Microsoft.ReportingServices.ExcelRendering"
Visible="false"/>

Ответ 3

Этот простой подход jQuery работал у меня:

 $(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();  
 });

Ответ 4

Используя код jon выше в качестве ссылки, мне удается скрыть "Excel" в программе во время выполнения. Тем не менее, я не очень хороший VB.net, поэтому я поставил образец на С#. Извините, но я надеюсь, что это поможет. Еще одна вещь - отчет, встроенный в страницу 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;
          }
        }
      }
    }
  }

Я пытался выбрать элемент по умолчанию для "PDF", но не смог найти способ включения текстовой кнопки "Экспорт".:-(

Ответ 5

У меня была та же проблема. Я мог бы получить нежелательные параметры экспорта, чтобы скрыть, когда отчет был создан, но это не сработало в случае подробного отчета. Следующий код работал как для родительских, так и для отчетов, используя LocalReport:

    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);
            }
        }
    }

Хитрость заключается в вызове метода из метода PreRender страницы:

    protected void Page_PreRender(object sender, System.EventArgs e)
    {
        SuppressExportButton(rvMain, "PDF");
        SuppressExportButton(rvMain, "Word");
    }

Ответ 6

Мне удалось отключить кнопку "Экспорт PDF" с некоторыми изменениями. Класс ReportViewer не имеет никаких публичных функций, чтобы отключить кнопку "Экспортировать в PDF". Чтобы сделать это, взгляните на следующий код:

Вызовите эту функцию во время события OnLoad на странице 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

Я не смог установить свойство Visible кнопки toolstrip здесь, так как параметры экспорта загружены OnDropDownOpened. Вместо этого я добавил обработчик, чтобы позаботиться об отключении опции экспорта при нажатии на раскрывающееся меню панели инструментов. Функция обработчика выглядит следующим образом:

  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

Итак, в основном, Onload вы добавляете обработчик событий, чтобы при нажатии кнопки "Экспорт выпадающего списка" выполнялась вышеприведенная функция - это делает невидимым экспорт в PDF.

Решение будет работать точно, я только закончил работу.

Если у вас есть какие-либо вопросы, дайте мне знать.

Ответ 7

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");
        }
    }
}

Я попытался добавить выше указанный метод DisableUnwantedExportFormats() для скрытия опции Export to Excel. Когда отчет загружается с первого раза, опция Excel не становится видимой.

Однако, когда я использовал тот же метод внутри Drillthrough() события "Excel" и параметр PDF, видимый в раскрывающемся списке "Экспортные элементы управления". Я попытался вызывать ваш метод в первом выражении моего события Drillthrough() (например, то, что я использовал в методе загрузки страницы).

Пожалуйста, дайте мне знать, как я могу скрыть опцию excel в событии Drillthrough() Reportviewer.

Ответ 8

JQuery для Reportviewer 2010: Поместите это в файл aspx, содержащий элемент управления reportviewer (Предполагая, что ваш Reportviewer называется 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> 

Ожидается, что выпадающее меню будет отображено, а затем скрывает выбранную опцию. Обычно setTimeout происходит только один раз. Вы можете скрыть больше/другие, добавив больше nth-childs, причем число составляет 1 позицию в раскрывающемся списке опции, которую вы хотите скрыть.

Ответ 9

  • Ссылка на опцию Word на "WORDOPENXML"
  • Ссылка на Excel для "EXCELOPENXML"
  • Ссылка на PDF в PDF-формате

С уважением.

Ответ 11

Если это помогает... код, чтобы скрыть элемент 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

... и поместите вызов CustomizeRV(ReportViewer1) в событие page_load

Ответ 12

В коде позади загрузите скрытое значение при показе отчета

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

затем используйте следующий javascript, чтобы установить таймер, чтобы проверить, будут ли отображаться кнопки экспорта. Когда они отображаются, удалите кнопку и очистите таймер.

<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>

в добавлении нагрузки (т.е. $(document).ready())

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

Ответ 13

Мне удалось сделать это на стороне клиента, используя JavaScript в нижней части страницы.

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);

Ответ 14

Для ReportViewer > 2010 я использую этот aproach, сделанный с помощью 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");
            }
        });
    }

Просто измените селектор на свой собственный и вызовите функцию из $(document).ready(function(){//here})

Ответ 15

Через 4 часа поиска я нашел решение. Я немного изменил код marol, чтобы быть немного:

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

Ответ 16

Если вы заинтересованы в быстром решении javascript с помощью jQuery..

Просто замените селектор ReportViewer ниже вашим идентификатором выпадающего списка.

JQuery ( '# ctl00_ContentPlaceHolder1_rptViewer_ctl01_ctl05_ctl00') дети() удалить()..;         jQuery ('# ctl00_ContentPlaceHolder1_rptViewer_ctl01_ctl05_ctl00'). append ( "- Выберите формат экспорта -" );         JQuery ( '# ctl00_ContentPlaceHolder1_rptViewer_ctl01_ctl05_ctl00') добавить ( "EXCEL" );.

Это удаляет все параметры, а затем добавляет обратно в EXCEL как единственный вариант.