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 调用打印?

C#,reportviewer控件,怎么填充整个窗口

ReportViewer 报表使用整理

解决VS2015中没有报表项(ReportViewer)的方法

FPM 打包工具安装

C# Winform reportViewer报表,动态表头能做么?