[英]Trapping a click event for a programmatically generated context menu sub-menu
我试图捕获由以下代码动态创建的上下文菜单子菜单上的click事件。 上下文菜单cmList在设计器中创建,并且单击事件代码从属性菜单中添加。
for (int i = 0; i <= sTagsContext.GetUpperBound(0); i++)
{
cmListTags.Items.Add(sTagsContext[i]);
ToolStripMenuItem submenu = new ToolStripMenuItem();
submenu.Text = i.ToString();
submenu.Image = Properties.Resources.InfoBig;
(cmListTags.Items[i] as ToolStripMenuItem).DropDownItems.Add(submenu);
chkListTags.ContextMenuStrip = cmListTags;
}
当单击任何上下文菜单项的子菜单并使该子菜单项的标识(在text属性中设置)可用时,如何创建要执行的代码?
我尝试使用添加事件处理程序
(cmListTags.Items[i] as ToolStripMenuItem).DropDownItems.Add(i.ToString(), Properties.Resources.InfoBig, new EventHandler(InfoClicked));
我在哪里创建函数
public void InfoClicked(object sender, EventArgs e)
{
}
单击子菜单但发件人或e都没有有关子菜单项被单击的任何信息时,将调用此函数-发件人为null,e为空。
如果我将e设置为ToolStripItemClickedEventArgs并将Dropdown加法行更改为
(cmListTags.Items[i] as ToolStripMenuItem).DropDownItems.Add(i.ToString(), Properties.Resources.InfoBig, new ToolStripItemClickedEventHandler(InfoClicked));
我得到了DropDownItems.Add的最后一个参数的编译时类型不匹配。
您可以使用匿名方法 -没有名称的方法主体。
int index = i;
cmListTags.Items[i] as ToolStripMenuItem).DropDownItems.Add(
i.ToString(),
Properties.Resources.InfoBig,
(s, args) => {
MessageBox.Show(index.ToString();
} ));
由于匿名方法已在适当位置声明,因此可以访问局部变量i 。 因此,您无需使用sender 。
编辑 :原来我正在for循环中被修改。 因此,我必须使用本地副本索引来保留其值。
关于第二个问题,
我得到了DropDownItems.Add的最后一个参数的编译时类型不匹配。
这是因为InfoClicked
的签名与委托ToolStripItemClickedEventHandler
的签名不匹配。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.