繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM