簡體   English   中英

從菜單欄刪除項目

[英]Remove item from Menu Strip

我在Windows窗體中有一個具有以下結構的菜單條,名為mstMain

  • 文件
  • 程式
    • 地址
    • 往來
      • PRG1001
      • PRG1002
    • 詢問
    • 設置
      • PRG8003
  • 救命

我正在執行for循環,以刪除Programs (名為mnuPrograms )中的所有項目,其中項目的數量為== 0 我的嘗試是:

  for (int n = 0; n < mnuPrograms.MenuItems.Count; n++)
                        if (mnuPrograms.MenuItems[n].MenuItems.Count == 0)
                            mnuPrograms.MenuItems.Remove(mnuPrograms.MenuItems[n]);

而且它不會刪除正確的項目。 我也用過foreach

foreach (
     MenuItem item in
       mnuPrograms.MenuItems.Cast<MenuItem>().Where(item => item.MenuItems.Count == 0))
                        mnuPrograms.MenuItems.Remove(item);

但是在這種情況下,我收到InvalidOperationException 我該如何執行呢?

您正在遍歷列表時對其進行修改。

  • for子句中,刪除項目時索引會更改。 嘗試從頭到尾遍歷列表。
  • foreach子句中,在枚舉枚舉時修改列表以InvalidOperationException結尾。

而且pid是正確的,您可以禁用一個項目而不是刪除它。

從可用性的角度來看,您可能希望禁用這些項目。 用戶希望看到他們不能做某事。 通過刪除它們,他們可能會感到困惑。 禁用項目后,您的問題可能已經解決。

編輯:

您也有一個錯誤的假設,表示存在更深的誤解。 您正在做兩件事:

  • 遍歷一組
  • 修改集合

您不應同時執行這兩種操作,因為如果您沒有枚舉所依據的不變集,則終止條件將變得不可預測(在某些情況下,NP會不完整)。 這就是為什么如果您修改塊內的枚舉集,則foreach將引發異常的原因。

為了避免這種情況,您應該僅在不刪除時增加它,但那一刻while()更優雅,就像這樣:

while (i < list.Count)
{
    // do stuff with list[i]

    if (removal_condition) // only do one of these, never both
    {
        list.RemoveAt(i);
    }
    else
    {
        i++;
    }
}

暫無
暫無

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

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