Я использую компонент ReportView в приложении VB.Net 2005. Как отключить функцию экспорта PDF, сохраняя только формат MS Excel?
ReportViewer - Скрыть экспорт PDF
Ответ 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-формате
С уважением.
Ответ 10
Вы также можете проверить мое сообщение о том, как сделать Excel первым в раскрывающемся списке:
Ответ 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 как единственный вариант.