3

わかりました。現在トラバースしているコレクションを変更することは許可されていませんが、以下のコードを見ると、列挙が実行されているコレクションに触れていないことがわかります。

    MenuItemCollection tempItems = new MenuItemCollection();
    foreach (MenuItem item in mainMenu.Items)
    {
        if (item.Value != "pen")
            tempItems.Add(item);
    }

ご覧のとおり、アイテムを追加するコレクションは、繰り返し処理しているコレクションとは異なります。しかし、それでもエラーが発生します。

「コレクションが変更されました。列挙操作が実行されない可能性があります」。

ただし、コードにわずかな変更を加えてMenuItemCollectionをListに置き換えると、次のように機能します。

    List<MenuItem> tempItems = new List<MenuItem>();
    foreach (MenuItem item in mainMenu.Items)
    {
        if (item.Value != "pen")
            tempItems.Add(item);
    }

誰かが私に理由を説明できますか?

4

1 に答える 1

4

MenuItem別のものに追加するとき、MenuItemCollectionそれはその所有者(であるmainMenu)から削除されます。したがって、元のコレクションが変更されます。

public void Add(MenuItem child)
{
    if ((child.Owner != null) && (child.Parent == null))
         child.Owner.Items.Remove(child);

    if (child.Parent != null)    
        child.Parent.ChildItems.Remove(child);

    if (this._owner != null)
    {
        child.SetParent(this._owner);
        child.SetOwner(this._owner.Owner);
    }
    // etc
}

ところで、これはASP.NETとWinFormsの両方に当てはまります。WinFormsの場合、コードは少し異なります。

于 2012-10-31T06:25:33.330 に答える