You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 03:27:06