Me.Controls 未找到表单上的所有控件

问题描述 投票:0回答:2

我有一个表单,它接受搜索词列表,并为每个结果集创建一个组合框。这些框是在运行时创建的,它们都是单独命名的,并且都直接在表单上,没有一个位于面板或任何子控件中。

我想在每次完成新搜索时删除以前的搜索组合框。我制作了以下子命令来删除所有组合框

        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

知道为什么它总是留下一个组合框,而我需要再次清除它们才能摆脱它吗?

vb.net controls
2个回答
2
投票

根据吉米在评论中所说的,我建议您使用这个:

For Each cmbx In Controls.OfType(Of ComboBox)().ToArray()
    cmbx.Dispose()
Next

OfType
首先进行过滤,然后
ToArray
创建一个可以循环的数组,因此您不会同时枚举和修改集合。删除和处置控件是没有意义的,因为处置会隐式删除它们。


0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.