2008-09-22 33 views
7

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

Al igual, que tuvo que quitar la exportación a sobresalir, y lo hizo 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 trickysh poco si me .. pedir la eliminación de toolbarbuttons, una forma posible era para iterar a través del control array dentro del ReportViewer y cambie 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 los MS vienen con una nueva versión por cierto?

Respuesta

3

Hay muchas propiedades para establecer qué botones le gustaría ver. Por ejemplo, ShowBackButton, ShowExportButton, ShowFindControls, y así sucesivamente. Verifíquelos en el help, todo comienza con "Mostrar".

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

¿Qué quieres decir con la nueva versión? Ya existe una versión de 2008 SP1.

0

Generalmente se supone que debe crear su propia barra de herramientas si desea modificarla. Su solución para quitar botones probablemente funcionará si eso es todo lo que necesita hacer, pero si desea agregar la suya probablemente solo tenga que morder la bala y crear un reemplazo.

7

Yeap. Puedes hacer eso de una manera un poco complicada. Tuve la tarea de agregar más factores de escala para ampliar el informe. 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; 
      } 
     } 
    } 
+0

gracias! ¡Acabas de resolver un problema que tenía debido a factores de zoom excesivos! (500% en un informe en particular estaba causando una excepción desde lo más profundo de las entrañas de win32 ...) – matao

5

Consigue la barra de herramientas de control ReportViewer:

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

añadir nuevos elementos:

toolStrip.Items.Add(...) 
3

Otra forma sería la de manipular el código HTML generado en tiempo de ejecución a través de javascript No es muy elegante, pero te da un control total sobre el HTML generado.

+0

Me doy cuenta de que esta es una publicación anterior, pero ¿podrían detallar cómo se haría? Parece que eso podría resolver algunos de los problemas que he tenido con el HTML aparentemente aleatorio y no semántico de ReportViewer. – firedrawndagger

+2

@firedrawndagger: no hay nada de lujoso en eso. Estoy usando un manejador jQuery $ (document) .ready() para esto y manipulo la barra html de reportviewer desde allí. El nuevo componente ReportViewer en .NET 4 se basa por defecto en ajax (sin Iframe), lo que hace que esto sea aún más fácil. Pero incluso si su informe está dentro de un Iframe, todavía hay formas de acceder a él a través de jquery. Perdón por no poder publicar ningún código (sería demasiado complicado presentarlo de manera comprensible), pero puedo asegurarle que funciona y no es realmente tan difícil. –

+0

gracias, lamentablemente todavía estoy atrapado con .NET3.5 y el iframe por ahora, pero creo que voy a perder el tiempo con JQuery y ver qué pasa. – firedrawndagger

1

Tuve esta pregunta durante bastante tiempo II encontré la respuesta después de un largo tiempo y la principal fuente de conocimiento que utilicé fue esta webpega: me gustaría agradecerles a todos ustedes al agregar el código que me permitió hacerlo y una imagen con el resultado.

En lugar de utilizar la clase ReportViewer, es necesario crear una nueva classs, en mi caso, lo he denominado ReportViewerPlus y que 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]); 
      } 
     } 
    } 
} 

Usted tiene que agregar el botón directamente en el constructor de la clase y puede configurar el botón en su diseñador.

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

http://prntscr.com/5lfssj

Si se fijan bien en el código de la clase, usted vería más o menos cómo funciona y usted podría hacer sus cambios y hacer posible el establecimiento en otro sitio de la barra de herramientas.

Muchas gracias por ayudarme en el pasado, ¡espero que esto ayude a muchas personas!

+0

Hola @Alex esta es una solución útil, pero en la barra de herramientas existente, el botón de la impresora se habilitará solo después de cargar el informe. ¿Cómo puedo activar el botón después de habilitar el informe, qué evento se utiliza para esto? –

1

Para VSView web ReportViewer V11 (se indica como rv), el código siguiente 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; 
           } 
          } 
         } 
        } 
       } 
      } 
     } 
    } 
0

Puede modificar los controles ReportViewer mediante el método CustomizeReportToolStrip. este ejemplo, elimine el botón Configurar página, 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; ; 
} 
Cuestiones relacionadas