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