如何移除Name以ToClear开头的所有Label控件?代码执行异常
解决移除Label控件时仅删除一半的问题
你遇到的问题根源是直接在foreach循环中修改Controls集合——当你移除一个控件时,集合的元素位置会发生变化,foreach的枚举器会跳过下一个元素,导致只能处理一半目标控件。
修正后的代码
先把所有需要移除的Label收集到一个独立列表中,再遍历这个列表执行移除操作,这样就不会影响原集合的枚举:
private void ClearLabel() { // 先筛选出所有符合条件的Label,存入临时列表 var labelsToRemove = this.Controls.OfType<Label>() .Where(lbl => lbl.Name.StartsWith("ToClear")) .ToList(); // 遍历临时列表移除控件 foreach (var label in labelsToRemove) { this.Controls.Remove(label); // 可选:如果控件不再使用,记得释放资源 label.Dispose(); } }
补充说明
- 使用
OfType<Label>()可以直接筛选出所有Label类型的控件,避免强制类型转换的麻烦 - 先转成
ToList()将筛选结果存入独立列表,确保遍历过程中原集合的变化不会影响遍历逻辑 - 移除后调用
Dispose()可以及时释放控件占用的资源,避免内存泄漏
内容的提问来源于stack exchange,提问作者Illia
相关产品推荐
相关产品推荐

