web-dev-qa-db-ja.com

ReportViewer-非表示PDFエクスポート

VB.Net 2005アプリでReportViewコンポーネントを使用しています。 PDFエクスポート機能を無効にして、MS Excel形式のみを維持するにはどうすればよいですか?

19
Lennie

私はまったく同じ問題を抱えており、次のC#メソッドを使用して解決しました 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);
        }
    }
}

そして、page_load:

DisableUnwantedExportFormat(ReportViewer1, "PDF");
28
MMalke

これは、エクスポートオプションを無効にする方法です。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"/>
10
rick schott

この単純な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();  
 });
10
jabits

上記のjonのコードを参照として使用して、実行時にプログラムで「Excel」を非表示にしています。しかし、私はVB.netが苦手なので、サンプルをC#に入れました。申し訳ありませんが、お役に立てば幸いです。もう1つは、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
user188924

私も同じ問題を抱えていました。レポートが表示されるときに不要なエクスポートオプションを非表示にすることができましたが、ドリルスルーレポートの場合は機能しませんでした。次のコードは、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");
    }
3
Todd Murray

次のように、更新後にのみこれを実行します。

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

このリンクを参照してください...

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

2
_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()をExcelへのエクスポートオプションを非表示にするために追加してみました。レポートが初めて読み込まれたときに、Excelオプションが表示されない。

ただし、Drillthrough() event "Excel"&PDFオプション内で同じメソッドを呼び出すために使用した場合、エクスポートコントロールのドロップダウンにオプションが表示されます。メソッドを呼び出してみましたDrillthrough()イベントの最初のステートメント(Page loadメソッドで使用したものと同様)。

ReportviewerのDrillthrough()イベントでExcelオプションを非表示にする方法を教えてください。

2
whizkidguys
  1. 「WORDOPENXML」へのWordオプション参照
  2. 「EXCELOPENXML」へのExcelオプション参照
  3. PDF「PDF」へのオプション参照)

よろしく。

2
Ricardo

Reportviewer 2010のjqueryソリューション:これを、reportviewerコントロールを含むaspxファイルに配置します(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は1回だけ発生します。 n番目の子を追加することで、より多くの/その他を非表示にできます。数値は、非表示にするオプションのドロップダウンの1から始まる位置です。

2
Lomak

ページの下部にある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);
2
Leon

PDFエクスポートボタンをいじくり回して無効にできました。ReportViewerクラスには、PDFツールバーボタンへのエクスポートを無効にするパブリックファンクションがありません。それを行うには、次のコードを見てください。

この関数は、reportViewerページのOnLoadイベント中に呼び出します。

 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

エクスポートオプションがOnDropDownOpenedに読み込まれているため、ここではツールストリップボタンのVisibleプロパティを設定できませんでした。代わりに、ツールストリップのドロップダウンをクリックしたときにエクスポートオプションを無効にする処理を行うハンドラーを追加しました。ハンドラー関数は次のとおりです。

  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でイベントハンドラーを追加して、[Export Drop Down]ボタンをクリックすると上記の関数が実行され、PDFへのエクスポートが非表示になります。

ソリューションは確かに機能します。私はそれを機能させることを終えました。

ご不明な点がございましたら、お気軽にお問い合わせください。

2
jgallant

4時間の検索の後、私は解決策を見つけました。 marolのコードを少し変更して、より小さくしました。

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

ReportViewer> 2010の場合、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})から関数を呼び出すだけです。

1
Robert K

それが役立つ場合... 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_イベントに入れます

1
Victor

コードビハインドでは、レポートを表示するときに非表示の値をロードします

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);
 }
1
Adrian M

JQueryを使用した簡単なJavaScriptソリューションに興味がある場合.

以下のreportViewerセレクターをドロップダウンIDに置き換えるだけです。

jQuery( '#ctl00_ContentPlaceHolder1_rptViewer_ctl01_ctl05_ctl00')。children()。remove(); jQuery( '#ctl00_ContentPlaceHolder1_rptViewer_ctl01_ctl05_ctl00')。append( "-エクスポート形式を選択-"); jQuery( '#ctl00_ContentPlaceHolder1_rptViewer_ctl01_ctl05_ctl00')。append( "Excel");

これにより、すべてのオプションが削除され、Excelに唯一のオプションとして追加されます。

0
Jamsi

答えに触発 https://stackoverflow.com/a/9192978/1099519 2つの拡張メソッドを作成しました。

私の場合、必要なフォーマットのみを有効にすることでホワイトリストアプローチを使用します(したがって、PDF以外の必要なフォーマットを含める必要があります)。

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

拡張メソッドは次のようになります(サーバーレポートとローカルレポートの両方をサポート)。

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