2008-09-22 14 views
7

क्या किसी के पास ReportViewer टूलबार के WinForms संस्करण के लिए टूलबार को संशोधित करने के बारे में अच्छा विचार है? यही है, मैं कुछ बटन और विविधता को हटाना चाहता हूं, लेकिन ऐसा लगता है कि समाधान वहां मौजूद एक को संशोधित करने के बजाय एक नया टूलबार बनाना है।ReportViewer - टूलबार संशोधित करें?

तरह, मैं निर्यात उत्कृष्टता प्राप्त करने को दूर करने के लिए किया था, और यह इस तरह से किया था:

// 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 के अंदर सरणी और छिपाने के लिए दृश्यों के लिए दृश्यमान संपत्ति को बदलें, लेकिन यह हर समय रीसेट हो जाता है, इसलिए यह एक अच्छा तरीका नहीं है ..

एमएस एक नए संस्करण बीटीडब्ल्यू के साथ कब आते हैं?

उत्तर

3

यह निर्धारित करने के लिए बहुत सारे गुण हैं कि आप कौन से बटन देखना चाहते हैं।

उदाहरण के लिए ShowBackButton, ShowExportButton, ShowFindControls, और इसी तरह। उन्हें help में देखें, सभी "शो" के साथ शुरू होते हैं।

लेकिन आप सही हैं, आप नए बटन नहीं जोड़ सकते हैं। ऐसा करने के लिए आपको अपनी खुद की टूलबार बनाना होगा।

नए संस्करण के बारे में आपका क्या मतलब है? इसके पहले से ही 2008 SP1 संस्करण है।

0

आम तौर पर यदि आप इसे संशोधित करना चाहते हैं तो आप अपना स्वयं का टूलबार बनाना चाहते हैं। बटन हटाने के लिए आपका समाधान शायद काम करेगा यदि आपको बस इतना करना है, लेकिन यदि आप अपना खुद का जोड़ना चाहते हैं तो आपको शायद बुलेट काटने और प्रतिस्थापन बनाना चाहिए।

7

याप। आप इसे थोड़ा मुश्किल तरीके से कर सकते हैं। मुझे ज़ूम रिपोर्ट के लिए अधिक स्केल कारक जोड़ने का कार्य था।

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

नए आइटम जोड़ें::

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

5

ReportViewer नियंत्रण से उपकरण पट्टी जाओ: मैं इसे इस तरह से किया

toolStrip.Items.Add(...) 
3

एक और तरीका है के माध्यम से कार्यावधि में सृजित HTML हेरफेर करने के लिए किया जाएगा जावास्क्रिप्ट। यह बहुत ही सुरुचिपूर्ण नहीं है, लेकिन यह आपको जेनरेट किए गए HTML पर पूर्ण नियंत्रण देता है।

+0

मुझे एहसास है कि यह एक पुरानी पोस्ट है, लेकिन क्या आप यह बता सकते हैं कि यह कैसे किया जाएगा? ऐसा लगता है कि रिपोर्टव्यूयर के प्रतीत होता है यादृच्छिक और असमान HTML के साथ कुश्ती के कुछ मुद्दों को हल कर सकता है। – firedrawndagger

+2

@firedrawndagger: इसके बारे में कुछ भी नहीं है। मैं इसके लिए एक jQuery $ (दस्तावेज़) .ready() हैंडलर का उपयोग कर रहा हूं और वहां से रिपोर्टव्यूअर एचटीएमएल बार में हेरफेर कर रहा हूं। .NET 4 में नया ReportViewer घटक डिफ़ॉल्ट रूप से AJAX (No Iframe) पर आधारित है, जो इसे और भी आसान बनाता है। लेकिन भले ही आपकी रिपोर्ट इफ्रेम के अंदर है, फिर भी jquery के माध्यम से उस तक पहुंचने के तरीके हैं। क्षमा करें कि मैं कोई कोड पोस्ट नहीं कर सकता (इसे समझने योग्य तरीके से प्रस्तुत करना बहुत परेशानी होगी), लेकिन मैं आपको आश्वस्त कर सकता हूं कि यह काम करता है और यह वास्तव में मुश्किल नहीं है। –

+0

धन्यवाद, दुर्भाग्य से मैं अभी भी .NET3.5 और आईफ्रेम के साथ फंस गया हूं लेकिन मुझे लगता है कि मैं JQuery के साथ गड़बड़ करूँगा और देखें कि क्या होता है। – firedrawndagger

1

मेरे पास अल ओजीजी समय II के लिए यह प्रश्न था, जो लंबे समय के बाद जवाब मिला और मैंने उपयोग किए गए कोउजलेज का मुख्य स्रोत यह वेबपेगा था: मैं आपको सभी लोगों को धन्यवाद देना चाहता हूं जो मुझे ऐसा करने की अनुमति देते हैं और परिणाम के साथ एक तस्वीर।

इसके बजाय 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

यदि आप वर्ग के कोड में ध्यान से देखो, तो आप कम या ज्यादा यह कैसे काम करता देखना चाहते हैं और आप अपने परिवर्तन करते हैं और यह संभव उपकरण पट्टी के अन्य साइट में यह स्थापित करने के लिए कर सकता है।

अतीत में मेरी मदद करने के लिए बहुत बहुत धन्यवाद, मुझे आशा है कि इससे बहुत से लोगों की मदद मिलती है!

+0

हाय @ एलेक्स यह एक उपयोगी समाधान है, लेकिन मौजूदा टूलबार प्रिंटर बटन में रिपोर्ट लोड होने के बाद ही सक्षम हो जाएगी। रिपोर्ट सक्षम होने के बाद मैं बटन कैसे सक्षम कर सकता हूं, इसके लिए कौन सी घटना का उपयोग किया जाता है? –

1

वीएस2013 वेब रिपोर्ट व्यूअर वी 11 (आरवी के रूप में इंगित) के लिए, नीचे दिया गया कोड एक बटन जोड़ता है।

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

आप 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; ; 
} 
संबंधित मुद्दे