我有一个表单,它接受搜索词列表,并为每个结果集创建一个组合框。这些框是在运行时创建的,它们都是单独命名的,并且都直接在表单上,没有一个位于面板或任何子控件中。
我想在每次完成新搜索时删除以前的搜索组合框。我制作了以下子命令来删除所有组合框
For Each c As Control In Me.Controls
If c.GetType Is GetType(ComboBox) Then
Me.Controls.Remove(c)
c.Dispose()
End If
Next c
但由于某种神秘的原因,表单看不到先前搜索创建的所有组合框。如果我创建 3 个框,它将看到第一个和第三个,但看不到第二个。如果我再次运行子程序,它将看到第二个子程序并在那时捕获它。所以我需要运行子程序两次才能真正清除创建的所有组合框。我检查了控件集合,它似乎总是比上次搜索中创建的组合框的实际数量少 1
知道为什么它总是留下一个组合框,而我需要再次清除它们才能摆脱它吗?
根据吉米在评论中所说的,我建议您使用这个:
For Each cmbx In Controls.OfType(Of ComboBox)().ToArray()
cmbx.Dispose()
Next
OfType
首先进行过滤,然后ToArray
创建一个可以循环的数组,因此您不会同时枚举和修改集合。删除和处置控件是没有意义的,因为处置会隐式删除它们。
Cuando se usa 小组:
for each ctrl in me.controls
if typeof ctrl is system.windows.forms.TextBox then
ctrl.text = ""
elseif typeof ctrl is system.windows.forms.panel then
for each pctrl in ctrl.controls
if typeof pctrl is system.windows.forms.textbox then
pctrl.text = ""
end if
next
end if
next
xt