2

ログアウトボタンをクリックしたときにすべてのタブ項目を削除したい私のコードは以下のとおりです

foreach (object item  in mainTab.Items)
{
  TabItem ti = (TabItem)item;
  if ("welcomeTabItem" != ti.Name)
    {
      mainTab.Items.Remove(item);
    }
}

ただし、これにより次のエラーが発生します

エラー-コレクションが変更されました。列挙操作が実行されない場合があります。

他に方法はありますか?

4

5 に答える 5

6

目的のアイテムを取得してから、コントロールをクリアしてアイテムを追加し直すことができます。

// Note that `First` will throw an exception if the item isn't found.
TabItem ti = mainTab.Items.First(t => t.Name == "WelcomTabItem");
mainTab.Items.Clear();
mainTab.Items.Add(ti);

または、「WelcomeTabItem」が含まれていない可能性がある場合Items

TabItem ti = mainTab.Items.FirstOrDefault(t => t.Name == "WelcomTabItem");
mainTab.Items.Clear();
if(ti != null)
    mainTab.Items.Add(ti);
于 2013-03-27T07:42:31.620 に答える
5

ループで編集IEnumerablesすることはできません。foreachループを使用しforます。

for (int i = mainTab.Items.Count -1; i >=0; i--)
{
  TabItem ti = (TabItem)mainTab.Items[i];
  if ("welcomeTabItem" != ti.Name)
   {
     mainTab.Items.Remove(ti);
   }
}
于 2013-03-27T07:40:18.610 に答える
4

LINQこのようなアイテムを削除するために使用できます-

mainTab.Items.RemoveAll(ti => ((TabItem)ti).Name != "welcomeTabItem");

using System.Linq;ファイルの先頭に名前空間を追加してください。

于 2013-03-27T07:50:28.537 に答える
3

Foreach内でEnumerableを編集することは許可されていません

以下のLINQコードを使用して、「welcomeTabItem」を除くすべてのアイテムを削除できます。

mainTab.Items.RemoveAll(i => i.Name != "welcomeTabItem");
于 2013-03-27T07:49:08.340 に答える
1

次のコードを使用します。

var itemsToRemove = new List(TabItem);

foreach (object item  in mainTab.Items)
{
  TabItem ti = (TabItem)item;
  if ("welcomeTabItem" != ti.Name)
   {
     itemsToRemove.Add(item);
   }
}

foreach (var itemToRemove in itemsToRemove)
{
    mainTab.Items.Remove(itemToRemove);
}

コレクションを列挙している間は、コレクションからアイテムを削除することはできません

于 2013-03-27T07:42:18.130 に答える