VB.Net 2005アプリでReportViewコンポーネントを使用しています。 PDFエクスポート機能を無効にして、MS Excel形式のみを維持するにはどうすればよいですか?
私はまったく同じ問題を抱えており、次の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");
これは、エクスポートオプションを無効にする方法です。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"/>
この単純な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();
});
上記の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」のデフォルト項目を選択しようとしましたが、「エクスポート」テキストボタンを有効にする方法が見つかりませんでした。 :-(
私も同じ問題を抱えていました。レポートが表示されるときに不要なエクスポートオプションを非表示にすることができましたが、ドリルスルーレポートの場合は機能しませんでした。次のコードは、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");
}
次のように、更新後にのみこれを実行します。
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);
}
このリンクを参照してください...
_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オプションを非表示にする方法を教えてください。
よろしく。
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から始まる位置です。
ページの下部にある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);
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へのエクスポートが非表示になります。
ソリューションは確かに機能します。私はそれを機能させることを終えました。
ご不明な点がございましたら、お気軽にお問い合わせください。
4時間の検索の後、私は解決策を見つけました。 marolのコードを少し変更して、より小さくしました。
Control ReportViewerControl = ReportViewer1.FindControl("Ctl01");
Control ExportGroupControl = ReportViewerControl.FindControl("Ctl05");
DropDownList DropDownControl = (DropDownList)ExportGroupControl.FindControl("Ctl00");
DropDownControl.PreRender += new EventHandler(ddList_PreRender);
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})
から関数を呼び出すだけです。
それが役立つ場合... 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
_イベントに入れます
コードビハインドでは、レポートを表示するときに非表示の値をロードします
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);
}
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に唯一のオプションとして追加されます。
答えに触発 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);
}
}
}
}