Pregunta

¿Alguien tiene buenas ideas sobre cómo modificar la barra de herramientas para la versión WinForms de la barra de herramientas ReportViewer?Es decir, quiero eliminar algunos botones y varios, pero parece que la solución es crear una nueva barra de herramientas en lugar de modificar la que está allí.

Tuve que eliminar la exportación a Excel y lo hice de esta manera:

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

Un poco complicado si me preguntas..Para eliminar los botones de la barra de herramientas, una forma posible era iterar a través de la matriz de control dentro de ReportViewer y cambiar la propiedad Visible para que los botones se oculten, pero se restablece todo el tiempo, por lo que no es una buena manera.

¿CUÁNDO viene MS con una nueva versión por cierto?

¿Fue útil?

Solución

Hay muchas propiedades para establecer qué botones le gustaría ver.

Por ejemplo Mostrar botón atrás, Mostrar botón Exportar, Mostrar controles de búsqueda, etcétera.Compruébalos en el ayuda, todo comienza con "Mostrar".

Pero tienes razón, no puedes agregar nuevos botones.Tienes que crear tu propia barra de herramientas para poder hacer esto.

¿Qué quieres decir con la nueva versión?Ya hay un 2008 SP1 versión del mismo.

Otros consejos

Sí.Puedes hacerlo de una manera un poco complicada.Tenía la tarea de agregar más factores de escala al informe de zoom.Lo hice de esta manera:

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

Obtenga la barra de herramientas del control ReportViewer:

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

Agregar nuevos elementos:

toolStrip.Items.Add(...)

Otra forma sería manipular el HTML generado en tiempo de ejecución mediante javascript.No es muy elegante, pero te da control total sobre el HTML generado.

Para VS2013 web ReportViewer V11 (indicado como rv), el siguiente código agrega un botón.

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

Tenía esta pregunta desde hacía mucho tiempo y encontré la respuesta después de un largo rato y la principal fuente de conocimiento que utilicé fue esta webpega:Me gustaría agradecerles a todos los que agregaron el código que me permitió hacerlo y una imagen con el resultado.

En lugar de usar la clase ReportViewer, necesitas crear una nueva clase; en mi caso, la llamé ReportViewerPlus y dice así:

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

Tienes que agregar el botón directamente en el constructor de la clase y puedes configurar el botón en tu diseñador.

Aquí hay una foto del resultado, no perfecta, pero suficiente (enlace seguro, lo juro, pero no puedo publicar mis propias fotos, no tengo suficiente reputación).

http://prntscr.com/5lfssj

Si miras detenidamente el código de la clase, verás más o menos cómo funciona y podrás hacer tus cambios y permitir establecerlo en otro sitio de la barra de herramientas.

¡Muchas gracias por ayudarme en el pasado, espero que esto ayude a mucha gente!

Generalmente se supone que debes crear tu propia barra de herramientas si deseas modificarla.Su solución para eliminar botones probablemente funcionará si eso es todo lo que necesita hacer, pero si desea agregar el suyo propio, probablemente debería hacer el esfuerzo y crear un reemplazo.

Puede modificar los controles del visor de informes mediante el método CustomizeReportToolStrip.este ejemplo elimina el botón Configurar página, el botón Diseño de página en 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; ;
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top