ReportViewer - 修改工具栏?
Posted
技术标签:
【中文标题】ReportViewer - 修改工具栏?【英文标题】:ReportViewer - modify toolbar? 【发布时间】:2010-09-11 23:59:06 【问题描述】:是否有人对如何修改 WinForms 版本的 ReportViewer 工具栏的工具栏有好的想法? 也就是说,我想删除一些按钮和变量,但看起来解决方案是创建一个全新的工具栏,而不是修改那里的工具栏。
就像,我不得不删除导出到 excel,并这样做:
// Disable excel export
foreach (RenderingExtension extension in lr.ListRenderingExtensions())
if (extension.Name == "Excel")
//extension.Visible = false; // Property is readonly...
FieldInfo fi = extension.GetType().GetField("m_isVisible", BindingFlags.Instance | BindingFlags.NonPublic);
fi.SetValue(extension, false);
如果你问我有点棘手.. 对于删除工具栏按钮,一种可能的方法是遍历 ReportViewer 中的 Control 数组并更改按钮的 Visible 属性以隐藏,但它一直被重置,所以这不是一个好方法..
顺便说一句,MS 什么时候推出新版本?
【问题讨论】:
【参考方案1】:是的。你可以用一个有点棘手的方式做到这一点。 我的任务是为缩放报告添加更多比例因子。我是这样做的:
private readonly string[] ZOOM_VALUES = "25%", "50%", "75%", "100%", "110%", "120%", "125%", "130%", "140%", "150%", "175%", "200%", "300%", "400%", "500%" ;
private readonly int DEFAULT_ZOOM = 3;
//--
public ucReportViewer()
InitializeComponent();
this.reportViewer1.ProcessingMode = ProcessingMode.Local;
setScaleFactor(ZOOM_VALUES[DEFAULT_ZOOM]);
Control[] tb = reportViewer1.Controls.Find("ReportToolBar", true);
ToolStrip ts;
if (tb != null && tb.Length > 0 && tb[0].Controls.Count > 0 && (ts = tb[0].Controls[0] as ToolStrip) != null)
//here we go if our trick works (tested at .NET Framework 2.0.50727 SP1)
ToolStripComboBox tscb = new ToolStripComboBox();
tscb.DropDownStyle = ComboBoxStyle.DropDownList;
tscb.Items.AddRange(ZOOM_VALUES);
tscb.SelectedIndex = 3; //100%
tscb.SelectedIndexChanged += new EventHandler(toolStripZoomPercent_Click);
ts.Items.Add(tscb);
else
//if there is some problems - just use context menu
ContextMenuStrip cmZoomMenu = new ContextMenuStrip();
for (int i = 0; i < ZOOM_VALUES.Length; i++)
ToolStripMenuItem tsmi = new ToolStripMenuItem(ZOOM_VALUES[i]);
tsmi.Checked = (i == DEFAULT_ZOOM);
//tsmi.Tag = (IntPtr)cmZoomMenu;
tsmi.Click += new EventHandler(toolStripZoomPercent_Click);
cmZoomMenu.Items.Add(tsmi);
reportViewer1.ContextMenuStrip = cmZoomMenu;
private bool setScaleFactor(string value)
try
int percent = Convert.ToInt32(value.TrimEnd('%'));
reportViewer1.ZoomMode = ZoomMode.Percent;
reportViewer1.ZoomPercent = percent;
return true;
catch
return false;
private void toolStripZoomPercent_Click(object sender, EventArgs e)
ToolStripMenuItem tsmi = sender as ToolStripMenuItem;
ToolStripComboBox tscb = sender as ToolStripComboBox;
if (tscb != null && tscb.SelectedIndex > -1)
setScaleFactor(tscb.Items[tscb.SelectedIndex].ToString());
else if (tsmi != null)
if (setScaleFactor(tsmi.Text))
foreach (ToolStripItem tsi in tsmi.Owner.Items)
ToolStripMenuItem item = tsi as ToolStripMenuItem;
if (item != null && item.Checked)
item.Checked = false;
tsmi.Checked = true;
else
tsmi.Checked = false;
【讨论】:
谢谢!您刚刚解决了我因缩放系数过大而遇到的问题! (特定报告中的 500% 导致了来自 win32 内部深处的异常......)【参考方案2】:从 ReportViewer 控件中获取工具栏:
ToolStrip toolStrip = (ToolStrip)reportViewer.Controls.Find("toolStrip1", true)[0]
添加新项目:
toolStrip.Items.Add(...)
【讨论】:
【参考方案3】:有很多属性可以设置你想看到哪些按钮。
例如ShowBackButton、ShowExportButton、ShowFindControls 等。在help查看它们,都以“Show”开头。
但你是对的,你不能添加新按钮。为此,您必须创建自己的工具栏。
新版本是什么意思?它已经有一个2008 SP1 版本。
【讨论】:
【参考方案4】:另一种方法是在运行时通过 javascript 操作生成的 html。它不是很优雅,但它确实让您可以完全控制生成的 HTML。
【讨论】:
我知道这是一篇旧帖子,但您能否详细说明一下如何做到这一点?听起来这可以解决我与 ReportViewer 看似随机且无语义的 HTML 搏斗的一些问题。 @firedrawndagger:没有什么特别的。我为此使用 jQuery $(document).ready() 处理程序并从那里操作 reportviewer html 栏。 .NET 4 中的新 ReportViewer 组件默认基于 ajax(无 Iframe),这使得这更加容易。但即使您的报告在 iframe 中,仍然可以通过 jquery 访问它。抱歉,我无法发布任何代码(以易于理解的方式呈现它会很麻烦),但我可以向您保证它是有效的,而且并不是那么困难。 谢谢,不幸的是,我现在仍然坚持使用 .NET3.5 和 iframe,但我想我会弄乱 JQuery 看看会发生什么。 @firedrawndagger:我以前版本的 ReportViewer mod 脚本也是基于 3.5 ReportViewer 和 jQuery 编写的,大约需要 2-3 个小时来编写代码,所以它绝对是可行的。祝你好运! 我这样做是为了添加一个自定义打印按钮,它适用于任何浏览器:)【参考方案5】:对于VS2013 web ReportViewer V11(表示为rv),下面的代码添加了一个按钮。
private void AddPrintBtn()
foreach (Control c in rv.Controls)
foreach (Control c1 in c.Controls)
foreach (Control c2 in c1.Controls)
foreach (Control c3 in c2.Controls)
if (c3.ToString() == "Microsoft.Reporting.WebForms.ToolbarControl")
foreach (Control c4 in c3.Controls)
if (c4.ToString() == "Microsoft.Reporting.WebForms.PageNavigationGroup")
var btn = new Button();
btn.Text = "Criteria";
btn.ID = "btnFlip";
btn.OnClientClick = "$('#pnl').toggle();";
c4.Controls.Add(btn);
return;
【讨论】:
【参考方案6】:我有这个问题很长时间了,我在很长一段时间后找到了答案,我使用的知识的主要来源是这个 webpega:我要感谢所有添加代码的人,让我可以做到这一点,并且结果图片。
您需要创建一个新的类,而不是使用 ReportViewer 类,在我的例子中,我将它命名为 ReportViewerPlus,它是这样的:
using Microsoft.Reporting.WinForms;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace X
class ReportViewerPlus : ReportViewer
private Button boton get; set;
public ReportViewerPlus(Button but)
this.boton = but;
testc(this.Controls[0]);
public ReportViewerPlus()
private void testc(Control item)
if(item is ToolStrip)
ToolStripItemCollection tsic = ((ToolStrip)item).Items;
tsic.Insert(0, new ToolStripControlHost(boton));
return;
for (int i = 0; i < item.Controls.Count; i++)
testc(item.Controls[i]);
你必须直接在类的构造函数中添加按钮,你可以在你的设计器中配置按钮。
这是一张结果图片,不完美,但足够了(我发誓安全链接,但我不能发布自己的照片,没有足够的声誉)。
http://prntscr.com/5lfssj
如果您仔细查看该类的代码,您会或多或少地看到它是如何工作的,您可以进行更改并使其可以在工具栏的其他站点中建立。
非常感谢您过去对我的帮助,我希望这可以帮助很多人!
【讨论】:
嗨@Alex这是一个有用的解决方案,但在现有的工具栏中,打印机按钮只有在加载报告后才会启用。启用报告后如何启用按钮,使用哪个事件?【参考方案7】:一般来说,如果您想修改它,您应该创建自己的工具栏。如果您只需要这样做,您删除按钮的解决方案可能会起作用,但如果您想添加自己的按钮,您可能应该硬着头皮构建一个替代品。
【讨论】:
【参考方案8】:您可以通过 CustomizeReportToolStrip 方法修改报表查看器控件。 本例去掉WinForm中的Page Setup Button、Page Layout Button
public CustOrderReportForm()
InitializeComponent();
CustomizeReport(this.reportViewer1);
private void CustomizeReport(Control reportControl, int recurCount = 0)
Console.WriteLine("".PadLeft(recurCount + 1, '.') + reportControl.GetType() + ":" + reportControl.Name);
if (reportControl is Button)
CustomizeReportButton((Button)reportControl, recurCount);
else if (reportControl is ToolStrip)
CustomizeReportToolStrip((ToolStrip)reportControl, recurCount);
foreach (Control childControl in reportControl.Controls)
CustomizeReport(childControl, recurCount + 1);
//-------------------------------------------------------------
void CustomizeReportToolStrip(ToolStrip c, int recurCount)
List<ToolStripItem> customized = new List<ToolStripItem>();
foreach (ToolStripItem i in c.Items)
if (CustomizeReportToolStripItem(i, recurCount + 1))
customized.Add(i);
foreach (var i in customized) c.Items.Remove(i);
//-------------------------------------------------------------
void CustomizeReportButton(Button button, int recurCount)
//-------------------------------------------------------------
bool CustomizeReportToolStripItem(ToolStripItem i, int recurCount)
Console.WriteLine("".PadLeft(recurCount + 1, '.') + i.GetType() + ":" + i.Name);
if (i.Name == "pageSetup")
return true;
else if (i.Name == "printPreview")
return true;
return false; ;
【讨论】:
以上是关于ReportViewer - 修改工具栏?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 reportviewer 控件上从 asp.net 调用打印?