ReportViewer - ツールバーを変更しますか?
-
02-07-2019 - |
質問
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 内の 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(...)
もう 1 つの方法は、生成された HTML を実行時に JavaScript を介して操作することです。これはあまり洗練されたものではありませんが、生成された 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]);
}
}
}
}
ボタンはクラスのコンストラクターに直接追加する必要があり、デザイナーでボタンを構成できます。
これが結果の写真です。完璧ではありませんが、十分に機能します(安全なリンクを誓いますが、自分の写真を投稿することはできません。十分な評判がありません)。
クラスのコードを注意深く見ると、それがどのように機能するかが多かれ少なかれわかり、変更を加えてツールバーの他のサイトに確立できるようになります。
これまで私を助けてくれて本当にありがとう。これが多くの人に役立つことを願っています!
一般に、ツールバーを変更したい場合は、独自のツールバーを作成することになります。ボタンを削除するためのソリューションがそれだけであればおそらく機能しますが、独自のボタンを追加したい場合は、おそらく思い切って代替のボタンを作成する必要があります。
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; ;
}