捕获单击事件以编程方式生成的上下文菜单子菜单

时间:2018-10-30 02:33:56

标签: c# contextmenu

我试图捕获由以下代码动态创建的上下文菜单子菜单上的click事件。上下文菜单cmList在设计器中创建,并且单击事件代码从属性菜单中添加。

(cmListTags.Items[i] as ToolStripMenuItem).DropDownItems.Add(i.ToString(), Properties.Resources.InfoBig, new EventHandler(InfoClicked));

当单击任何上下文菜单项的子菜单并具有该子菜单项的标识(在text属性中设置)时,如何创建要执行的代码?

我尝试使用添加事件处理程序

public void InfoClicked(object sender, EventArgs e)
{
}

我在其中创建函数的地方

(cmListTags.Items[i] as ToolStripMenuItem).DropDownItems.Add(i.ToString(), Properties.Resources.InfoBig, new ToolStripItemClickedEventHandler(InfoClicked));

单击子菜单但发件人或e都没有有关子菜单项被单击的任何信息-发件人为空且e为空。

如果我将e设置为ToolStripItemClickedEventArgs,然后将Dropdown添加行更改为

{{1}}

我得到了DropDownItems.Add的最后一个参数的编译时类型不匹配。

1 个答案:

答案 0 :(得分:1)

您可以使用anonymous method-一种没有名称的方法主体。

pc : [<17800070>]          lr : [<4ff83c64>]
sp : 4f579ac0  ip : 00000030     fp : 4f57be58
r10: 00000002  r9 : 4f579efc     r8 : 4ffbe2b0
r7 : 4f57be68  r6 : 17800000     r5 : fffff200  r4 : 000002cc
r3 : 17800000  r2 : 4f57be6c     r1 : 4f57be6c  r0 : 00000000
Flags: nZCv  IRQs off  FIQs off  Mode SVC_32
Resetting CPU ...

由于匿名方法就地声明为 ,因此它可以访问局部变量 i 。因此,您无需使用发送器

编辑:结果证明 i 在for循环中被修改了。因此,我必须使用本地副本 index 来保留其值。

关于第二个问题,

我得到了DropDownItems.Add的最后一个参数的编译时类型不匹配。

这是因为int index = i; cmListTags.Items[i] as ToolStripMenuItem).DropDownItems.Add( i.ToString(), Properties.Resources.InfoBig, (s, args) => { MessageBox.Show(index.ToString(); } )); 的签名与委托人InfoClicked的签名不匹配。