Windows Form中Foreach移除控件仅删除半数元素的问题
问题原因及解决办法
为什么只移除了一个控件?
这是因为你在遍历控件集合的同时直接修改集合(移除元素),导致集合的内部索引发生了变化。举个例子:
假设$Form.Controls里按顺序是[AAD, AD]两个控件,遍历到第一个(AAD)并移除后,原集合的第二个元素(AD)会自动前移到索引0的位置,但遍历已经走到下一个索引(1),此时这个索引已经没有元素了,所以跳过了AD,最终只移除了一个。
解决办法
有两种可靠的方式可以解决这个问题:
方法1:先收集要移除的控件到独立数组,再遍历移除
先把需要移除的控件提前存到一个新数组里,再遍历这个数组执行移除操作,这样不会影响原控件集合的遍历:
# 先收集所有要移除的控件 $controlsToRemove = $Form.Controls | Where-Object { $array -contains $_.Name } # 遍历移除 foreach ($ctrl in $controlsToRemove) { $Form.Controls.Remove($ctrl) # 或者用RemoveByKey也可以:$Form.Controls.RemoveByKey($ctrl.Name) }
方法2:倒序遍历控件集合
从集合的最后一个元素开始往前遍历移除,这样前面的元素索引不会因为后面的元素被移除而错位:
for ($i = $Form.Controls.Count - 1; $i -ge 0; $i--) { $currentCtrl = $Form.Controls[$i] if ($array -contains $currentCtrl.Name) { $Form.Controls.RemoveAt($i) } }
内容的提问来源于stack exchange,提问作者Dark_Ville
相关产品推荐
相关产品推荐

