簡體   English   中英

檢查在上下文菜單條中單擊了哪個子菜單項

[英]Check which submenu item was clicked in context menu strip

網格控件中有一個 ContextMenuStrip。

我將其命名為 GridContextMenu。

GridContextMenu 使用以下代碼填充了 4-5 個項目:

 gridcontextMenu.Items.Add(new ToolStripMenuItem
                        {
                            Name = Plants,
                            Text = Plants,
                            Tag = Plants,
                            Width = 100,
                            Image = <image source is put here>
                        });

gridcontextMenu.Items.Add(new ToolStripMenuItem
                        {
                            Name = Animals,
                            Text = Animals,
                            Tag = Animals,
                            Width = 100,
                            Image = <image source is put here>
                        });

對於工具條中的動物菜單,我通過以下方式添加了子菜單

(gridcontextMenu.Items[1] as ToolStripMenuItem).DropDownItems.Add("Tiger", image_source, new EventHandler(SubmenuItem_Click));
(gridcontextMenu.Items[1] as ToolStripMenuItem).DropDownItems.Add("Lion", image_source, new EventHandler(SubmenuItem_Click));
(gridcontextMenu.Items[1] as ToolStripMenuItem).DropDownItems.Add("Elephant", image_source, new EventHandler(SubmenuItem_Click));

在 SubmenuItem_Click 事件處理程序中,我需要知道點擊了哪個動物子菜單。

如何實現這一目標?

目前我有以下方式的事件處理程序代碼:

private void SubmenuItem_Click(object sender, EventArgs e)
{
}

在這種情況下如何檢查選擇了哪個動物子菜單的情況? 歡迎分享答案。

你可以這樣做:

private void SubmenuItem_Click(object sender, EventArgs e)
{
    var clickedMenuItem = sender as MenuItem; 
    var menuText = clickedMenuItem.Text;

    switch(menuText) {
        case "Tiger":
           break;

        case "Lion":
          break;
         . ...
    }
}

如果您應該將應用程序本地化,則可以使用Tag來實現此目的。 此外, Tag是一個對象,因此您可以在其中放置任何數據。 例如Enum類型。

private void SubmenuItem_Click(object sender, EventArgs e)
{
    var clickedMenuItem = sender as MenuItem; 
    EnumType item = (EnumType)clickedMenuItem.Tag;

    switch(item) {
        case TigeItem:
           break;
        case LionItem:
          break;
         ...
    }
}

當我發現其他答案都沒有在這里工作時,我去挖掘並找到了合適的解決方案。 這可能僅適用於.NET Framework 4+,但這是我發現的工作方式。

實際上, ContextMenuStrip控件中的ItemClicked事件在引發事件時將自身作為發送者和ToolStripItemClickedEventArgs對象傳遞。 由於無法從ContextMenuStrip本身獲取單擊的項目,獲取此信息的唯一方法是詢問ToolStripItemClickedEventArgs對象,並且單擊的項目作為ToolStripItem對象駐留在那里。 然后,可以根據需要使用它來提取要在if / switch語句中使用的選項的名稱。 見下文:

要配置EventHandler:

...
contextMenuStrip1.ItemClicked += OnContextMenuItem_Clicked;
...

要處理事件並檢索所單擊項目的文本:

private void OnContextMenuItem_Clicked(object sender, ToolStripMenuItemClickedEventArgs e)
{
    ToolStripItem clickedItem = e.ClickedItem;
    string itemName = clickedItem.Text;
    ...
}

希望這有助於將來尋找這個答案:)

如果您已動態創建 ContextMenuStrip,則這是一種檢索 ToolStripMenuItem 索引的方法。 獲取枚舉值真的很有幫助。 我的上下文菜單是動態創建的,並填充了枚舉名稱。 我希望它可以幫助某人。 抱歉,發布時的格式仍然是新的。

  `private void DynamiallyCreatedContextMenu_Click(object sender, EventArgs e)
    {
        ToolStripMenuItem item = sender as ToolStripMenuItem;

        var parent = (item.Owner as ContextMenuStrip);

        for (int i = 0; i < parent.Items.Count; i++)
        {
            if (item == parent.Items[i])
            {
                index = i;
                break;
            }
        }
    }`
private void SubmenuItem_Click(object sender, EventArgs e)
{        
    string clickedItemName=e.ClickedItem.Text;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM