Элемент - изменять панель инструментов?


Есть ли у кого-нибудь хорошие идеи о том, как изменить панель инструментов для 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);
    }
  }

Немного хитрый, если вы спросите меня.. Для удаления toolbarbuttons, возможный способ состоял в том, чтобы повторить через управляющий массив внутри ReportViewer и изменить свойство Visible для кнопок, чтобы скрыть, но он получает сброс все время, так что это не очень хороший способ..

Когда MS приходит с новой версией кстати?

8 7

8 ответов:

Есть много свойств, чтобы установить, какие кнопки вы хотели бы видеть.

Например 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(...)

Другой способ-манипулировать сгенерированным HTML во время выполнения с помощью javascript. Это не очень элегантно,но зато дает вам полный контроль над сгенерированным HTML.

У меня был этот вопрос в течение всего времени, когда я нашел ответ после долгой связи, и главным источником знаний, которые я использовал, была эта 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

Если вы внимательно посмотрите в коде класса,вы увидите более или менее, как он работает, и вы можете внести свои изменения и сделать возможным установить его в другом месте панели инструментов.

Большое Спасибо за помощь мне в прошлом, я надеюсь, что это поможет много людей!

Для 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;
                                }
                            }
                        }
                    }
                }
            }
        }
    }

Как правило, вы должны создать свою собственную панель инструментов, если хотите ее изменить. Ваше решение для удаления кнопок, вероятно, будет работать, если это все, что вам нужно сделать, но если вы хотите добавить свои собственные, вы, вероятно, должны просто укусить пулю и построить замену.

Вы можете изменить элементы управления reportviewer с помощью метода CustomizeReportToolStrip. в этом примере кнопка Удалить страницу Setup, кнопка макет страницы в WinForm

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