动态添加上下文菜单项

Dynamically adding Context Menu items

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

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);
    }
}

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

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

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);
}

除了 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");
    }
}