Domanda

Qualcuno ha buone idee su come modificare la barra degli strumenti per la versione WinForms della barra degli strumenti di ReportViewer? Cioè, voglio rimuovere alcuni pulsanti e vari, ma sembra che la soluzione sia creare una nuova barra degli strumenti invece di modificare quella che è lì.

Ad esempio, ho dovuto rimuovere export per eccellere e l'ho fatto in questo modo:

  // 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 po 'ingannevole se mi chiedi .. Per rimuovere i pulsanti della barra degli strumenti, un modo possibile era di scorrere attraverso l'array Control all'interno di ReportViewer e modificare la proprietà Visible per nascondere i pulsanti, ma viene reimpostato continuamente, quindi non è un buon modo ..

QUANDO viene fornita una nuova versione di MS?

È stato utile?

Soluzione

Ci sono molte proprietà per impostare quali pulsanti vorresti vedere.

Ad esempio ShowBackButton , ShowExportButton , ShowFindControls e così via. Controllali nella aiuto , tutto inizia con " Mostra " ;.

Ma hai ragione, non puoi aggiungere nuovi pulsanti. Devi creare la tua barra degli strumenti per farlo.

Cosa intendi per nuova versione? Esiste già un 2008 SP1 versione di esso.

Altri suggerimenti

Yeap. Puoi farlo in un modo un po 'complicato. Avevo il compito di aggiungere più fattori di scala al rapporto dello zoom. L'ho fatto in questo modo:

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

Ottieni la barra degli strumenti dal controllo ReportViewer:

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

Aggiungi nuovi elementi:

toolStrip.Items.Add(...)

Un altro modo sarebbe quello di manipolare l'HTML generato in fase di esecuzione tramite JavaScript. Non è molto elegante, ma ti dà il pieno controllo sull'HTML generato.

Per VS2013 web ReportViewer V11 (indicato come rv), il codice seguente aggiunge un pulsante.

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

Ho fatto questa domanda per tutto il tempo II ho trovato la risposta dopo un lungo pareggio e la principale fonte di kowledge che ho usato era questa webpega: vorrei ringraziare tutti voi ragazzi aggiungendo il codice che mi ha permesso di farlo e un'immagine con il risultato.

Invece di usare la classe ReportViewer, devi creare una nuova classe, nel mio caso l'ho chiamata ReportViewerPlus e va così:

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

Devi aggiungere il pulsante direttamente nel costruttore della classe e puoi configurare il pulsante nel tuo designer.

Ecco una foto del risultato, non perfetta, ma abbastanza per andare (collegamento sicuro giuro, ma non posso pubblicare le mie foto, non ho abbastanza reputazione).

http://prntscr.com/5lfssj

Se osservi attentamente il codice della classe, vedresti più o meno come funziona e potresti apportare le modifiche e consentire di stabilirlo in un altro sito della barra degli strumenti.

Grazie mille per avermi aiutato in passato, spero che questo aiuti molte persone!

In genere si suppone di creare la propria barra degli strumenti se si desidera modificarla. La tua soluzione per la rimozione dei pulsanti funzionerà probabilmente se questo è tutto ciò che devi fare, ma se vuoi aggiungere il tuo dovresti probabilmente mordere il proiettile e costruire un rimpiazzo.

È possibile modificare i controlli di reportviewer con il metodo CustomizeReportToolStrip. in questo esempio rimuovere il pulsante Imposta pagina, il pulsante Layout pagina in 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; ;
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top