2016-07-29 104 views
0

我创建了一些用户控件,我在VS 2013中以编程方式放置在窗体上。这些控件有时需要删除和重新创建。我试过用两种不同的方式删除控件。一个工作,一个不工作。我希望有人能提供洞察力,为什么一个人不工作。从窗体C中删除控件#

这个版本不工作(只发现四分之二的控制):

// delete user controls from the front panel 
foreach (UserControl ctrl in this.Controls.OfType<StationControl>()) 
{ 
    this.Controls.Remove(ctrl); 
} 

这个版本不工作(发现四分之四的控件):

// delete user controls from the front panel 
var uc_list = this.Controls.OfType<StationControl>().ToArray(); 
foreach (var ctrl in uc_list) 
{ 
    this.Controls.Remove(ctrl); 
} 

我可以计数匹配类型的用户控件的数量没有问题(例如

int controlCount = this.Controls.OfType<StationControl>().Count() 

那么为什么第一个foreach st工作不全面?

+2

因为,在第一个例子,你从你所在的同一个集合中移除控制循环结束。在第二个你循环不同的集合,并从窗体控件集合中删除 – Steve

+0

可能的重复[有效地从'foreach'内删除项目](http://stackoverflow.com/questions/8791557/efficiently-deleting-item-从在之内的foreach) –

回答

0

这项工作?

foreach (UserControl ctrl in this.Controls.OfType<StationControl>()) 
{ 
    ctrl.Dispose(); 
    this.Controls.Remove(ctrl); 
} 

我希望这有助于。

编辑:

以上将无法正常工作,这里是一个工作方法:

while (this.Controls.OfType<StationControl>().Count() > 0) 
{ 
    UserControl ctrl = this.Controls.OfType<StationControl>().First(); 

    ctrl.Dispose(); 
    this.Controls.Remove(ctrl); 
}