由于某种原因,me.control.remove正在删除循环中的每个第二个控件

时间:2015-11-20 21:59:30

标签: vb.net

我的表单上有一些动态创建的复选框,我想要一个函数来删除它们。

我有以下功能:

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

通过上面我可以勾选每个单选按钮,它会将它们无意地删除...那么第一个函数中的内容是什么导致它跳过每一个单选按钮?

2 个答案:

答案 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集合中移除时弄乱该状态。