我试图捕获由以下代码动态创建的上下文菜单子菜单上的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的最后一个参数的编译时类型不匹配。
答案 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
的签名不匹配。