Me.Controls遍历窗体控件时无法找到全部ComboBox的问题咨询
问题原因
你在正向遍历Me.Controls控件集合的同时,直接移除集合内的元素,导致遍历的索引发生偏移:
For Each遍历控件集合时会从索引0开始按顺序访问,当你移除索引为N的控件后,集合中所有索引大于N的控件都会自动向前移动一位,原索引N+1的控件会变为新的索引N,此时遍历指针会自动跳转到下一个位置N+1,刚好跳过了刚移动到N位置的控件,就出现了漏删的情况。
修复方案
方案1:倒序遍历控件集合
倒序遍历过程中删除元素不会影响未遍历部分的索引,是最简单的修复方案:
For i As Integer = Me.Controls.Count - 1 To 0 Step -1 Dim c As Control = Me.Controls(i) If c.GetType Is GetType(ComboBox) Then Me.Controls.Remove(c) c.Dispose() End If Next
方案2:先筛选目标控件再批量删除
先将所有需要删除的ComboBox筛选出来存入独立列表,再遍历列表执行删除操作,避免修改正在遍历的原集合:
' 先把所有ComboBox提取到独立列表,不会随原控件集合变化 Dim delList = Me.Controls.OfType(Of ComboBox)().ToList() For Each c As ComboBox In delList Me.Controls.Remove(c) c.Dispose() Next
内容的提问来源于stack exchange,提问作者SluggerB
相关产品推荐
相关产品推荐

