Pergunta

Do Alguém tem boas idéias de como modificar a barra de ferramentas para a versão WinForms da barra de ferramentas ReportViewer? Ou seja, eu quero remover alguns botões e varius, mas parece que a solução é criar uma barra de ferramentas nova marca em vez de modificar o que está lá.

Como, eu tinha que remover exportação para Excel, e fiz isto deste 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);
    }
  }

A trickysh pouco se você me perguntar .. Para a remoção toolbarbuttons, uma maneira possível era percorrer a matriz de controle dentro do ReportViewer e alterar a propriedade Visible para os botões para esconder, mas torna-se repor o tempo todo, por isso não é uma maneira boa ..

Quando MS vêm com uma versão nova btw?

Foi útil?

Solução

Há uma grande quantidade de propriedades para definir quais os botões que gostaria de ver.

Por exemplo ShowBackButton , ShowExportButton , ShowFindControls , e assim por diante. Vê-los no ajuda , tudo começa com "Show".

Mas você está certo, você não pode adicionar novos botões. Você tem que criar sua própria barra de ferramentas, a fim de fazer isso.

O que quer dizer sobre a nova versão? Já existe um 2008 SP1 versão do mesmo.

Outras dicas

Pois é. Você pode fazer isso em um pouco complicado. Eu tinha uma tarefa para adicionar mais fatores de escala de zoom relatório. Eu fiz isto deste 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;
            }
        }
    }

Obter a barra de ferramentas do controle ReportViewer:

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

Adicionar novos itens:

toolStrip.Items.Add(...)

Outra forma seria a de manipular o HTML gerado em tempo de execução via javascript. Não é muito elegante, mas lhe dá total controle sobre o HTML gerado.

Para VS2013 web ReportViewer V11 (indicado como rv), o código abaixo adiciona um botão.

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

Eu tive esta pergunta para al ong tempo II encontrou a resposta depois de um empate longo e a principal fonte de de saberes que eu usei foi esse webpega: Eu gostaria de agradecer a todos vocês adicionar o código que me permitiu fazer isso e uma foto com o resultado.

Em vez de usar a classe ReportViewer, você precisa criar uma nova classs, no meu caso, eu nomeei-ReportViewerPlus e vai como esta:

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

Você tem que adicionar o botão diretamente no construtor da classe e você pode configurar o botão no seu designer.

Aqui está uma foto do resultado, não é perfeito, mas o suficiente para ir (ligação segura, eu juro, mas eu não posso postar minhas fotos, não tem reputação suficiente).

http://prntscr.com/5lfssj

Se você olhar cuidadosamente no código da classe, você veria mais ou menos como funciona e você pode fazer as alterações e torná-lo possível estabelecer-la em outro local da barra de ferramentas.

Muito obrigado por me ajudar no passado, eu espero que isso ajude muitas pessoas!

Geralmente você está supor para criar sua própria barra de ferramentas, se você quiser modificá-lo. Sua solução para remover botões, provavelmente, o trabalho se isso é tudo que você precisa fazer, mas se você quiser adicionar seu próprio você deve provavelmente apenas morder a bala e construir uma substituição.

Você pode modificar controles ReportViewer pelo método CustomizeReportToolStrip. Neste exemplo Remover Page botão de configuração, Layout de Página Button em 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 em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top