我的表单上有一些动态创建的复选框,我想要一个函数来删除它们。
我有以下功能:
Sub delete_checkboxes()
Dim radios = Controls.OfType(Of RadioButton).AsQueryable()
For Each r As RadioButton In radios
Me.Controls.Remove(r)
Next
End Sub
出于某种原因,上述功能仅删除每隔一个单选按钮,剩下的就是其余部分。
正如测试一样,我更改了删除单选按钮的功能:
Dim radios = Controls.OfType(Of RadioButton).AsQueryable()
For Each r As RadioButton In radios
If r.Checked Then
Me.Controls.Remove(r)
End If
Next
通过上面我可以勾选每个单选按钮,它会将它们无意地删除...那么第一个函数中的内容是什么导致它跳过每一个单选按钮?
答案 0 :(得分:1)
这通常是我完成它的方式。
For Each cont As Control In Me.Controls
If cont.GetType().Name = "RadioButton" Then Me.Controls.Remove(cont)
Next
答案 1 :(得分:1)
将AsQueryable()
更改为ToList()
它失败的原因是你不应该在循环它时修改迭代器。 AsQueryable()
只是在内部使用状态机来了解您在Me.Controls
集合中的当前位置。它实际上并没有保留它自己的控件集合,但只知道你需要从原始集合中控制哪些控件。
当你在循环中间删除一个控件时,那个位置状态现在是错误的......事实上,它已经被一个人关闭了。然后删除下一个控件,将该内部位置状态再次关闭,依此类推。经过一整套一对一的调整后,您最终仍然会在表单上保留一半的控件。
ToList()
可以正常使用,因为它会为您的控件创建一个单独的集合,这样您就不必在将这些状态从Me.Controls
集合中移除时弄乱该状态。