我正在嘗試為 WinForms.ReportViewer 控制元件實作自定義背景關系選單。我可以讓我的自定義選單顯示用戶是否右鍵單擊控制元件頂部的 ReportViewer 控制元件的“工具列”區域,但是當單擊顯示實際報告資料的控制元件的主要部分時,默認ReportViewer 附帶的背景關系選單顯示。有沒有辦法讓我的背景關系選單替換默認值?
我搜索了 ReportViewer 的控制元件集合,它們都不是 ContextMenuStrip。如果重要的話,ReportViewer 控制元件版本是 15.0.0.0。
private void CreateContextMenu()
{
ContextMenuStrip menuStrip = new ContextMenuStrip();
ToolStripMenuItem menuItem = new ToolStripMenuItem("Exit");
menuItem.Click = new EventHandler(MenuItem_Click);
menuItem.Name = "Exit";
menuStrip.Items.Add(menuItem);
// This makes no difference.
//this.reportViewer1.ContextMenu = null;
this.reportViewer1.ContextMenuStrip = menuStrip;
}
private void MenuItem_Click(object sender, EventArgs e)
{
ToolStripItem menuItem = (ToolStripItem)sender;
if(menuItem.Name == "Exit")
{
Application.Exit();
}
}
uj5u.com熱心網友回復:
是的,您可以替換報告的默認值ContextMenuStrip。您需要獲取包含并顯示默認 CMS 的渲染器容器。控制元件樹中唯一ReportViewer具有 CMS 的控制元件是型別為 的無名控制元件ReportPanel。我們可以利用這一事實來獲得控制權并替換 CMS。
解決方案 1
目標面板沒有名稱/鍵可以直接通過該ControlCollection.Find方法獲取。但是,它的父級確實有一個名稱,即winRSviewer. 所以你可以寫:
//
// using System.Linq;
// ...
var c = reportViewer1.Controls.Find("winRSviewer", true)
.FirstOrDefault()?.Controls.OfType<Control>()
.FirstOrDefault(x => x.ContextMenuStrip != null);
if (c != null) c.ContextMenuStrip = contextMenuStrip1;
解決方案 2
使用遞回函式獲取目標控制元件:
private void SomeCaller()
{
var c = GetChildren(reportViewer1).FirstOrDefault(x => x.ContextMenuStrip != null);
if (c != null) c.ContextMenuStrip = contextMenuStrip1;
}
private IEnumerable<Control> GetChildren(Control parent) => parent.Controls
.Cast<Control>().Concat(parent.Controls
.Cast<Control>().SelectMany(GetChildren));
解決方案 3
創建一個新類并從ReportViewer控制元件繼承。添加一個允許您在默認 CMS 和您選擇的內容之間切換的屬性。
public class ReportViewerEx : ReportViewer
{
private readonly Control reportPanel;
private readonly ContextMenuStrip defaultCMS;
public ReportViewerEx() : base()
{
reportPanel = GetChildren(this).FirstOrDefault(x => x.ContextMenuStrip != null);
if (reportPanel != null) defaultCMS = reportPanel.ContextMenuStrip;
}
private ContextMenuStrip customCMS;
[DefaultValue(null)]
public ContextMenuStrip ReportPanelContextMenuStrip
{
get => customCMS;
set
{
customCMS = value;
if (reportPanel != null) reportPanel.ContextMenuStrip = value ?? defaultCMS;
}
}
private IEnumerable<Control> GetChildren(Control parent) => parent.Controls
.Cast<Control>().Concat(parent.Controls
.Cast<Control>().SelectMany(GetChildren));
}
構建和洗掉一個實體。ReportPanelContextMenuStrip在屬性視窗中找到以從下拉串列中選擇不同的 CMS。重置屬性以使用默認 CMS。或者,通過代碼設定屬性。null重置。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/450319.html
上一篇:FilePath錯誤/不支持
