动态添加上下文菜单项

时间:2018-04-20 13:55:35

标签: c# winforms contextmenu

出于某种原因,无论tooltripmenuitem添加到上下文菜单的次数多少,它总是说上下文菜单不包含该项。

ToolStripMenuItem Colour = new ToolStripMenuItem("Colour");

ctmFile.Show(Cursor.Position);
Selecteditem = lvFiles.FocusedItem.Text.ToString();
if (lvFiles.FocusedItem.ImageKey.ToString() == "Folder")
{

    if (ctmFile.Items.Contains(Colour) == false)
    {
        ctmFile.Items.Add(Colour);
    }

}
else
{
    if(ctmFile.Items.Contains(Colour))
    {
        ctmFile.Items.Remove(Colour);
    }
}

2 个答案:

答案 0 :(得分:3)

您正在创建一个新菜单项并进行搜索。但由于它刚刚创建,它显然不能在菜单中。这就是为什么你永远不会在那里找到它。可能之前添加了带有该文本的不同的菜单项,但您的代码并未查找该代码。

您需要在菜单项中搜索包含该文本的项目。代码可以通过其他方式简化:

var colorItemText = "Colour";
var colorMenuItem = ctmFile.Items.Cast<ToolStripMenuItem>()
                      .FirstOrDefault(mi => mi.Text == colorItemText);

if (lvFiles.FocusedItem.ImageKey.ToString() == "Folder")
{
    //  Create and add if not already present
    if (colorMenuItem == null)
    {
        colorMenuItem = new ToolStripMenuItem(colorItemText);
        ctmFile.Items.Add(colorMenuItem);
    }
}
else if (colorMenuItem != null)
{
    //  Remove if already present. 
    ctmFile.Items.Remove(colorMenuItem);
}

答案 1 :(得分:3)

为了补充Ed的答案,我建议改用密钥:

ctmFile.Show(Cursor.Position);
Selecteditem = lvFiles.FocusedItem.Text.ToString();
if (lvFiles.FocusedItem.ImageKey.ToString() == "Folder")
{

    if (!ctmFile.Items.ContainsKey("Colour")) 
    {
        ToolStripMenuItem Colour = new ToolStripMenuItem("Colour");
        Colour.Name= "Colour"; //Add a name (key) to your menu.
        ctmFile.Items.Add(Colour);
    }

}
else
{
    if (ctmFile.Items.ContainsKey("Colour")) 
    {
        ctmFile.Items.RemoveByKey("Colour");
    }
}