Question

Quelqu'un at-il une bonne idée sur la façon de modifier la barre d’outils pour la version WinForms de la barre d’outils ReportViewer? C’est-à-dire que je veux supprimer certains boutons et varius, mais il semble que la solution consiste à créer une nouvelle barre d’outils au lieu de modifier celle qui y figure.

Par exemple, j'ai dû supprimer l'export pour exceller et je l'ai fait comme suit:

  // 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 peu piège si vous me demandez .. Pour supprimer les boutons de barre d’outils, il était possible de parcourir le tableau de contrôle à l’intérieur de ReportViewer et de modifier la propriété Visible des masques à masquer, mais cette opération est réinitialisée à tout moment. Ce n'est donc pas un bon moyen.

QUAND les États membres ont-ils une nouvelle version?

Était-ce utile?

La solution

Il y a beaucoup de propriétés pour définir les boutons que vous aimeriez voir.

Par exemple, ShowBackButton , ShowExportButton , ShowFindControls , etc. Vérifiez-les dans le help , tout commence par "Afficher".

Mais vous avez raison, vous ne pouvez pas ajouter de nouveaux boutons. Pour ce faire, vous devez créer votre propre barre d’outils.

Que voulez-vous dire par nouvelle version? Il existe déjà un 2008 SP1 version de celui-ci.

Autres conseils

Oui. Vous pouvez le faire de manière délicate. J'avais pour tâche d'ajouter plus de facteurs d'échelle au rapport de zoom. Je l'ai fait de cette façon:

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

Obtenir la barre d'outils à partir du contrôle ReportViewer:

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

Ajouter de nouveaux éléments:

toolStrip.Items.Add(...)

Une autre solution consisterait à manipuler le code HTML généré lors de l'exécution via JavaScript. Ce n'est pas très élégant, mais cela vous donne un contrôle total sur le HTML généré.

Pour VS2013 web ReportViewer V11 web (indiqué par rv), le code ci-dessous ajoute un bouton.

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

J'avais cette question tout le temps. J'ai trouvé la réponse après une longue cravate et la principale source de connaissances que j'ai utilisée était ce webpega: je voudrais remercier tous les gars qui ont ajouté le code qui m'a permis de le faire et une image avec le résultat.

Au lieu d'utiliser la classe ReportViewer, vous devez créer une nouvelle classe. Dans mon cas, je l'ai nommée ReportViewerPlus et voici comment:

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

Vous devez ajouter le bouton directement dans le constructeur de la classe et vous pouvez le configurer dans votre concepteur.

Voici une photo du résultat, pas parfaite, mais suffisante pour continuer (lien sécurisé, je le jure, mais je ne peux pas publier mes propres photos, je n'ai pas assez de réputation).

http://prntscr.com/5lfssj

Si vous examinez attentivement le code de la classe, vous verrez plus ou moins comment il fonctionne et vous pouvez apporter vos modifications et permettre de l’établir dans un autre site de la barre d’outils.

Merci beaucoup pour votre aide dans le passé, j'espère que cela aidera beaucoup de monde!

Généralement, vous êtes censé créer votre propre barre d’outils si vous souhaitez la modifier. Votre solution pour supprimer des boutons fonctionnera probablement si c'est tout ce que vous avez à faire, mais si vous souhaitez ajouter les vôtres, vous devriez probablement mordre la balle et créer un remplaçant.

Vous pouvez modifier les contrôles reportviewer par la méthode CustomizeReportToolStrip. cet exemple enlève le bouton de mise en page, le bouton de mise en page dans 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; ;
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top