2012-09-09 94 views
3

我收到錯誤:集合被修改;枚舉操作可能不會執行。我試圖從當前除了刪除所有打開的窗體對象:收藏已修改;枚舉操作可能不會執行

FormCollection fc = Application.OpenForms; 
    foreach (Form form in fc) 
    { 
     if (form.ToString().Contains("_MainFrom.Form1")) 
     { 
      // Do nothing 
     } 
     else 
     { 
      form.Hide(); 
      form.Dispose(); 
     } 
    } 
+0

您是否有興趣? – HABO

+0

@HABO - 是的,是的。 – user1559618

回答

1

你不能修改你在哪裏(例如foreach)進行枚舉集合。您應該在這裏使用其他方法,如Remove或使用for循環。

2

變化

foreach (Form form in fc) 

foreach (Form form in fc.OfType<Form>().ToList()) 

這樣,你要複製到OpenForms收集到一個新的集合開始從原來的集合去除填充之前。

+1

@Albin Sunnanbo這不起作用:(我已經試過 – user1559618

+0

@ user1559618,對不起,忘記了'OpenForms'只是實現'IEnumerable'而不是'IEnumerable ',你需要用'OfType

我的更新示例 –

0

你的問題是:「我被關的一種形式,而迭代形式和獲取我正在修改的開放形式的集合,而迭代誤差修正的開放形式的集合」。

答:要麼不使用foreach迭代或迭代過程中不修改集合。否則,他們會發現。

最常見的方法是這樣的操作分成2個步驟:需要被添加/移除從集合

  • 作用於對象
  • 在所得集合

    • 查找對象你的情況:

      var toClose = fc.Where(
          form => form.GetType().FullName.Contains("_MainFrom.Form1")); 
      toClose.ToList().ForEach(form => { 
          form.Hide(); form.Dispose(); 
      }); 
      
    7

    你不能修改一個集合wile enum erating。

    使用foreach (Form form in fc.Cast<Form>().ToList())

    +0

    謝謝,該工作正常 – user1559618

    +1

    @ user1559618然後,您需要接受它作爲答案。 –

    相關問題