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