2008-09-22 1 views
7

У кого-нибудь есть хорошие идеи по изменению панели инструментов для WinForms версии панели инструментов ReportViewer? То есть, я хочу удалить несколько кнопок и varius, но похоже, что решение заключается в создании новой панели инструментов вместо изменения той, которая есть.ReportViewer - изменить панель инструментов?

Как я должен был удалить экспорт в Excel, и сделал это так:

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

Немного trickysh, если вы спросите меня .. Для удаления toolbarbuttons, возможный путь был перебрать контроль массив внутри ReportViewer и изменить свойство Visible для скрытия кнопок, но он все время перезагружается, поэтому это не очень удобно.

КОГДА MS действительно поставляется с новой версией BTL?

ответ

3

Есть много свойств, которые можно задать, какие кнопки вы хотели бы видеть.

Например, ShowBackButton, ShowExportButton, ShowFindControls и т. Д. Проверьте их в help, все начинается с «Show».

Но вы правы, вы не можете добавить новые кнопки. Для этого вам нужно создать свою собственную панель инструментов.

Что вы подразумеваете под новой версией? Существует уже версия 2008 SP1.

0

Как правило, вы можете создать свою собственную панель инструментов, если хотите ее изменить. Ваше решение для удаления кнопок, вероятно, будет работать, если это все, что вам нужно сделать, но если вы хотите добавить свои собственные, вы, вероятно, должны просто укусить пулю и построить замену.

7

Yeap. Вы можете сделать это немного сложнее. У меня была задача добавить дополнительные масштабные коэффициенты для увеличения отчета. Я сделал это так:

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

спасибо! вы просто решили проблему, вызванную чрезмерными коэффициентами масштабирования! (500% от конкретного отчета вызывают исключение из глубины в недрах win32 ...) – matao 2011-12-01 04:44:22

5

Получить панель инструментов управления ReportViewer:

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

Добавить новые пункты:

toolStrip.Items.Add(...) 
3

Другой способ манипулировать сгенерированный HTML во время выполнения с помощью JavaScript. Это не очень элегантно, но это дает вам полный контроль над сгенерированным HTML.

+0

Я понимаю, что это старый пост, но не могли бы вы рассказать о том, как это будет сделано? Похоже, это может решить некоторые из проблем, с которыми я сталкиваюсь с кажущимся случайным и неземным HTML-кодом ReportViewer. – firedrawndagger 2010-08-20 14:43:55

+2

@firedrawndagger: Ничего особенного в этом нет. Я использую обработчик jQuery $ (document) .ready() для этого и манипулирую с html-баром reportviewer. Новый компонент ReportViewer в .NET 4 по умолчанию основан на ajax (без IFRAME), что делает это еще проще. Но даже если ваш отчет находится внутри iframe, есть еще способы получить доступ к нему через jquery. Извините, что я не могу опубликовать какой-либо код (было бы слишком много хлопот, чтобы представить его понятным образом), но я могу заверить вас, что это работает, и это не так уж сложно. – 2010-08-20 18:17:32

1

У меня был этот вопрос для al ong time. Я нашел ответ после длинного галстука, и основным источником kowledge, который я использовал, была эта webpega: я хотел бы поблагодарить всех вас, добавив код, который позволил мне это сделать и изображение с результатом.

Вместо использования ReportViewer класса, вам нужно создать новый classs, в моем случае, я назвал его ReportViewerPlus и это выглядит следующим образом:

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

Вы должны добавить кнопку непосредственно в конструкторе класса, и вы можете настроить кнопку в своем дизайнере.

Вот итог результата, не совершенный, но достаточно, чтобы пойти (безопасная ссылка, клянусь, но я не могу публиковать свои собственные фото, не хватает репутации).

http://prntscr.com/5lfssj

Если вы внимательно посмотрите на код класса, вы бы видеть больше или меньше, как это работает, и вы могли бы внести изменения и сделать возможным установить его в другом месте на панели инструментов.

Благодарим вас за помощь в прошлом, надеюсь, это поможет многим людям!

1

Для VS2013 веб-ReportViewer V11 (обозначен как rv), код ниже добавляет кнопку.

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

Вы можете изменить элементы управления ReportViewer с помощью метода CustomizeReportToolStrip. этот пример удалите кнопку настройки страницы, кнопку макета страницы в 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; ; 
} 
Смежные вопросы