سؤال

هل لدى أي شخص أفكار جيدة حول كيفية تعديل شريط الأدوات لإصدار WinForms من شريط أدوات 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);
    }
  }

صعبة بعض الشيء إذا سألتني ..لإزالة أزرار شريط الأدوات، كانت إحدى الطرق الممكنة هي التكرار من خلال مصفوفة التحكم داخل ReportViewer وتغيير الخاصية المرئية لإخفاء الأزرار، ولكن تتم إعادة تعيينها طوال الوقت، لذا فهي ليست طريقة جيدة.

متى يأتي 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 web 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;
                                }
                            }
                        }
                    }
                }
            }
        }
    }

كان لدي هذا السؤال لفترة طويلة ووجدت الإجابة بعد فترة طويلة وكان المصدر الرئيسي للمعرفة الذي استخدمته هو 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