【问题标题】:ReportViewer - modify toolbar?ReportViewer - 修改工具栏?
【发布时间】: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 什么时候推出新版本?

【问题讨论】:

    标签: reportviewer toolbar rdlc


    【解决方案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】:

      有很多属性可以设置你想看到哪些按钮。

      例如ShowBackButtonShowExportButtonShowFindControls 等。在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; ;
            }
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2013-09-10
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多