代码改变世界

修改ReportViewer的右键菜单

2010-04-22 23:26  听雨到天明  阅读(837)  评论(1编辑  收藏  举报

微软的ReportViewer功能很强大。特别是Visual Studio 2010 带的ReportViewer 10.0导出Excel功能堪称完美,以前版本的不能导出子报表的问题也解决了。

ReportViewer提供了一系列的属性用于控制右键菜单,例如showPrintButton设置为false,右键菜单里面的Print项就自动被隐藏了。

不过,不知道是我找的原因还是什么,常规的方法都用遍了都没法隐藏右键菜单的Page Setup项。下午用IL看了下ReportViewer,终于找到了一种方法能修改右键菜单的那个异常顽固的项了。

共享给大家,提供的这种方式,经修改,可以完全自定义右键菜单。

 

1 /// <summary>
2 /// 禁用掉右键菜单的 print setup 选项
3 /// </summary>
4 /// <param name="rv">ReportViewer</param>
5 private void DisableContextMenuStrip(ref ReportViewer rv)
6 {
7 BindingFlags bf = BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance;
8
9 //get winRSviewer
10 FieldInfo fiwinRSviewer = rv.GetType().GetField("winRSviewer", bf);
11 object objwinRSviewer = fiwinRSviewer.GetValue(rv);
12
13 //get m_reportPanel
14 FieldInfo fireportPanel = objwinRSviewer.GetType().GetField("m_reportPanel", bf);
15 object objreportPanel = fireportPanel.GetValue(objwinRSviewer);
16
17 //get m_contextMenu
18 FieldInfo ficontextMenuStrip = objreportPanel.GetType().GetField("m_contextMenu", bf);
19 ContextMenuStrip cms = ficontextMenuStrip.GetValue(objreportPanel) as ContextMenuStrip;
20
21 //
22 if (cms == null)
23 {
24 return;
25 }
26
27 //replace "Page Setup"
28 int nIndex = -1;
29 for (int i = 0; i < cms.Items.Count; i++)
30 {
31 nIndex ++;
32 if (cms.Items[i].Text == "P&age Setup")
33 {
34 break;
35 }
36 }
37
38 //create new item
39 ToolStripMenuItem tsmiNewPS = new ToolStripMenuItem("P&age Setup");
40 tsmiNewPS.Click += new EventHandler(tsmiNewPS_Click);
41
42 //add item
43 cms.Items.RemoveAt(nIndex);
44 cms.Items.Add(tsmiNewPS);
45 }
46
47 /// <summary>
48 /// 自定义item响应
49 /// </summary>
50 /// <param name="sender"></param>
51 /// <param name="e"></param>
52 void tsmiNewPS_Click(object sender, EventArgs e)
53 {
54 MessageBox.Show("自定义的item响应!!");
55 }

 

运行截图: