ReportViewer - изменить панель инструментов? - PullRequest
7 голосов
/ 22 сентября 2008

У кого-нибудь есть хорошие идеи о том, как изменить панель инструментов для версии панели инструментов ReportViewer для WinForms? То есть я хочу удалить некоторые кнопки и varius, но похоже, что решение состоит в том, чтобы создать совершенно новую панель инструментов вместо изменения той, которая там есть.

Например, мне пришлось удалить экспорт в 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);
    }
  }

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

КОГДА MS приходит с новой версией?

Ответы [ 8 ]

8 голосов
/ 10 декабря 2008

Yeap. Вы можете сделать это немного хитрым способом. У меня была задача добавить больше масштабных коэффициентов для увеличения отчета. Я сделал это так:

    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;
            }
        }
    }
6 голосов
/ 05 ноября 2009

Получить панель инструментов из элемента управления ReportViewer:

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

Добавить новинки:

toolStrip.Items.Add(...)
3 голосов
/ 06 ноября 2009

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

3 голосов
/ 22 сентября 2008

Существует множество свойств для установки кнопок, которые вы хотели бы видеть.

Например ShowBackButton , ShowExportButton , ShowFindControls и т. Д. Отметьте их в справке , все начинается с "Показать".

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

Что вы имеете в виду под новой версией? Уже существует версия 2008 SP1 .

2 голосов
/ 31 марта 2015

Для VS2013 веб 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;
                                }
                            }
                        }
                    }
                }
            }
        }
    }
1 голос
/ 27 декабря 2014

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

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

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

0 голосов
/ 04 июня 2015

Вы можете изменить элементы управления ReportViewer с помощью метода CustomizeReportToolStrip. В этом примере удалите кнопку настройки страницы, кнопку разметки страницы в 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; ;
}
0 голосов
/ 22 сентября 2008

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

...