문제

ReportViewer 도구 모음의 WinForms 버전에 대한 도구 모음을 수정하는 방법에 대한 좋은 아이디어가 있는 사람이 있습니까?즉, 일부 버튼과 다양한 항목을 제거하고 싶지만 기존 도구 모음을 수정하는 대신 완전히 새로운 도구 모음을 만드는 것이 해결책인 것 같습니다.

마찬가지로 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);
    }
  }

좀 까다롭게 물어보면..도구 모음 버튼을 제거하려면 ReportViewer 내부의 Control 배열을 반복하고 버튼의 Visible 속성을 숨기도록 변경하는 방법이 있었지만 항상 재설정되므로 좋은 방법이 아닙니다.

MS는 언제 새 버전을 출시하나요?

도움이 되었습니까?

해결책

어떤 버튼을 보려는지 설정할 수 있는 속성이 많이 있습니다.

예를 들어 표시뒤로버튼, 내보내기버튼 표시, ShowFindControls, 등등.다음에서 확인하세요. 돕다, 모두 "표시"로 시작됩니다.

하지만 당신 말이 맞습니다. 새 버튼을 추가할 수는 없습니다.이를 위해서는 자신만의 도구 모음을 만들어야 합니다.

새 버전이라니 무슨 뜻인가요?이미 2008 SP1 그것의 버전.

다른 팁

응.조금 까다로운 방법으로 그렇게 할 수 있습니다.확대/축소 보고서에 더 많은 축척 요소를 추가하는 작업이 있었습니다.나는 이렇게 했다:

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

ReportViewer 컨트롤에서 도구 모음을 가져옵니다.

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

새 항목 추가:

toolStrip.Items.Add(...)

또 다른 방법은 자바스크립트를 통해 런타임에 생성된 HTML을 조작하는 것입니다.매우 우아하지는 않지만 생성된 HTML을 완벽하게 제어할 수 있습니다.

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

나는 오랫동안 이 질문을 가지고 있었고 오랜 동점 끝에 답을 찾았고 내가 사용한 kowledge의 주요 소스는 다음 webpega였습니다.제가 이를 수행할 수 있도록 코드와 결과 사진을 추가해 주신 모든 분들께 감사의 말씀을 전하고 싶습니다.

ReportViewer 클래스를 사용하는 대신 새 클래스를 만들어야 합니다. 제 경우에는 이름을 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

클래스의 코드를 주의 깊게 살펴보면 이것이 어떻게 작동하는지 어느 정도 볼 수 있으며 변경하고 도구 모음의 다른 사이트에 이를 설정할 수 있습니다.

지난번에 도와주셔서 정말 감사합니다. 많은 분들에게 도움이 되었으면 좋겠습니다!

일반적으로 도구 모음을 수정하려면 자신만의 도구 모음을 만들어야 한다고 가정합니다.버튼을 제거하기 위한 해결책이 그것이 필요한 전부라면 아마도 효과가 있을 것입니다. 그러나 자신만의 버튼을 추가하고 싶다면 그냥 빨리 교체품을 만들어야 할 것입니다.

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; ;
}
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top