2009-06-29 12 views
2

こんにちは!
タブコントロールの各タブページに11個のパネルがあり、10個のパネルを削除したいと考えています。私はこのコードを書いた:
コントロールの削除プログラム的に期待どおりに機能しません!

 var PnlsToRemove = tabControl.SelectedTab.Controls.OfType<Panel>() 
      .Where(p => !p.Name.StartsWith("BasePanel")); 
     foreach (var pnl in PnlsToRemove) 
      pnl.Dispose(); 

をしかしトレースした後、私はそれは順序が交互で取り除くと思いました!
は、上記のコードを実行するとパネル0,2,4,6,8,10だけが削除され、残りのパネルは残ることを意味します。
ので、私はこのような交互パネルを除去するために、ループ内で自分のコードを置くべきである:()は、すべてのパネルを除去するために4回ループしながら、この場合

while (tabControl.SelectedTab.Controls.OfType<Panel>().Count() != 1) 
    { 
     var PnlsToRemove = tabControl.SelectedTab.Controls.OfType<Panel>() 
      .Where(p => !p.Name.StartsWith("BasePanel")); 
     foreach (var pnl in PnlsToRemove) 
      pnl.Dispose(); 
    } 

(10枚のパネル用)。

注意:私のパネルはすべて「PnlsToRemove」に存在し、このバグはforeachの「PnlsToRemove」の実行時に発生します。

私のコードには何が問題なのですか?
なぜforeach()が次のパネルからジャンプするのですか?

私はすべてが明らかだと思います!

答えて

5

リストからパネルを削除すると、基になるコレクションが変更されています。これは明らかに "foreach"の値に反映されています。解決策は、新しいコレクションに値を格納し、それを反復することです。これを行うには、 ".ToList()"をPnlsToRemoveの定義に追加してください。

+0

あなたのアドバイスに従って.ToList ()を使用しました。それはうまくいった。しかし、私は不安を払わなかったし、何が問題だったのだろうか? は、なぜ「リストからパネルを削除すると突然変異しているのですか」という意味ですか? – mahdiahmadirad

+2

多くのLINQメソッドはレイジー評価をもたらします。つまり、基になる列挙体のコピーを作成しない場合は作成しません。 あなたは配列を持っているとし、それをコピーする代わりに単にインデックスを覚えておいてください。 "次の要素を取得する"操作は、インデックスをインクリメントし、配列から次の値を返します。要素ゼロから始めます。それが返され、インデックスが1に更新されます。しかし、今では配列から要素ゼロを取り除いているので、現在インデックス1はインデックス2だったものです。ありがとうございます。 –

+0

ありがとうございます。私は理解した。 – mahdiahmadirad

関連する問題