繁体   English   中英

C# .net 如何从上下文菜单条中删除字符串项

[英]C# .net How do I remove a string item from a context menu strip

我正在尝试从上下文菜单条中删除带有字符串“服务器列表”的项目,但是 function Remove() 不采用带有“ToolStripItem 值”的字符串。 我还尝试将上下文菜单条转换为数组和列表,但这些东西也不起作用。 抱歉,如果我很愚蠢,但我有点卡住了。

这是我的代码

if (!MenuStrip.Items.ToString().Contains("Server List"))
{
    // it comes up with the error CS1503 and won't 
    // compile: cannot convert from string to System.Windows.Forms.ToolStripItem
    MenuStrip.Items.Remove("Server List");
} 

没有看到您的代码的 rest,感觉就像您缺少 MenuStrip 声明。 然后,使用变量

    var menuStrip = new MenuStrip();
    // or  MunuStrip menuStrip = new MenuStrip();
    
    if (!menuStrip.Items.ToString().Contains("Server List"))
    {
        // it comes up with the error CS1503 and won't 
        // compile: cannot convert from string to System.Windows.Forms.ToolStripItem
        menuStrip.Items.Remove("Server List");
    }

Items 不是字符串列表,而是“ToolStripItem”列表。

这意味着第二行(删除)将无法编译。

这也意味着“if”将无法按预期工作,因为列表的 ToString 将为您提供类似“System.Collections.Generic.List`1[System.Int32]”的列表<int>,因此您永远找不到其中的一个值。

假设值“服务器列表”在“文本”属性中,代码如下:

if (menuStrip.Items.Any(i => i.Text == "Server List")) 
{
    menuStrip.Items.Remove(menuStrip.Items.First(i => i.Text == "Server List"));
}

该代码将起作用,但不是最佳的,因为它将搜索包含“服务器列表”的项目两次(一次在 Any 期间,一次在 First 期间)。

最好的选择是:

var serverListToolStripItem = menuStrip.Items.FirstOrDefault(i => i.Text == "Server List")
if (serverListToolStripItem != null) 
{
    menuStrip.Items.Remove(serverListToolStripItem);
}

@arcord 接受的答案通常会起作用,在这种情况下可能永远不会失败,但确实包含 Linq 语句中的常见错误。 当.SingleOrDefault() 更正确时,经常使用.FirstOrDefault() 的使用。 如果有两个或更多实例的值为“服务器列表”,则仅删除返回的第一个实例。 留下其他实例。 这可能是也可能不是预期的结果。 使用 .SingleOrDefault() 将引发可以适当处理的异常。 检查此: LINQ:何时使用 SingleOrDefault 与 FirstOrDefault() 与过滤条件

原来我以前搞砸了,现在我有了这个解决方案,可以在上下文菜单条中添加和删除项目。

List<string> items = new List<string>();
foreach (object obj in MenuStrip.Items)
{
    items.Add(obj.ToString());
}
// items.Add(string);
// items.Remove(string);

MenuStrip.Items.Clear();
foreach (string item in items)
{
    MenuStrip.Items.Add(item);
}

此外,要确定单击了哪个项目,您可以在单击上下文菜单项时创建一个事件,然后获取该项目

private void MenuStrip_ItemClicked(object sender, ToolStripItemClickedEventArgs e)
{
    if (e.ClickedItem.ToString() == "Server List")
    {
        // code
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM