注意:这已经很好了,但是我试图理解为什么它会这样运作,而不是另一种。
现在,如果您点击“删除”'按钮,这些图像应该删除(除其他外),我最初使用的是:
foreach(Control ctrl in Controls)
if(ctrl is PictureBox) ctrl.Dispose();
或
for(int i = 0; i < Controls.Count; i++)
if(Controls[i] is PictureBox) Controls[i].Dispose();
现在如果我运行这个,我得到:
但如果我只是更改for
语句以向后发送,有效?
for(int i = Controls.Count - 1; i >= 0; i--)
if(Controls[i] is PictureBox) Controls[i].Dispose();
(我不会上传其他图片,但会删除所有元素(我只留下最后留下的按钮))
有人可以告诉我为什么一个有效,但不是另一个?
编辑:我在Windows 10上使用VS2015社区版是否存在调试错误(?)
答案 0 :(得分:12)
您正在尝试更改您正在迭代的列表,这当然会更改此列表的索引,因此索引1处的索引现在位于索引0处。
通过从数组末尾删除(即反向),以前的索引将始终相同。
如Matthew Watson的评论中所述,这一点也很重要:
Control.Dispose()是特殊的,它将从父容器的控件列表中删除控件。
大多数Dispose方法都不是默认行为,因此在使用Dispose