簡體   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