ReportViewer-修改工具栏?

时间:2020-03-06 14:32:20  来源:igfitidea点击:

是否有人对如何为WinForms版本的ReportViewer Toolbar修改工具栏有个好主意?
也就是说,我想删除一些按钮和变量,但是看起来解决方案是创建一个全新的工具栏,而不是修改那里的工具栏。

就像,我不得不将导出删除为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何时随附新版本btw?

解决方案

通常,如果我们要修改工具栏,则假设我们要创建自己的工具栏。如果我们只需要这样做,则删除按钮的解决方案可能会起作用,但是,如果要添加自己的按钮,则可能应该硬着头皮建造一个替代品。

有很多属性可以设置我们要查看的按钮。

例如ShowBackButton,ShowExportButton,ShowFindControls等。选中帮助中的所有内容,所有内容均以"显示"开头。

但是我们是对的,我们无法添加新按钮。为此,我们必须创建自己的工具栏。

我们对新版本的意思是什么?它已经有一个2008 SP1版本。

是的我们可以用一些棘手的方式做到这一点。
我的任务是为缩放报告添加更多比例因子。我这样做是这样的:

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;
            }
        }
    }

从ReportViewer控件获取工具栏:

ToolStrip toolStrip = (ToolStrip)reportViewer.Controls.Find("toolStrip1", true)[0]

添加新项目:

toolStrip.Items.Add(...)

另一种方法是在运行时通过javascript处理生成的HTML。它不是很优雅,但确实可以完全控制生成的HTML。