Вопрос

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

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

Кстати, КОГДА MS выйдет с новой версией?

Это было полезно?

Решение

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

Например ПоказатьНазадКнопку, ПоказатькнопкуЭкспорт, ПоказатьFindControls, и так далее.Проверьте их в помощь, все начинается с "Шоу".

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

Что вы имеете в виду под новой версией?уже есть 2008 СП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;
            }
        }
    }

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

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

Добавить новые предметы:

toolStrip.Items.Add(...)

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

Для 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 вам нужно создать новые классы, в моем случае я назвал его 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

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

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

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

Вы можете изменить элементы управления средства просмотра отчетов с помощью метода 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; ;
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top