Vb.net 循环检查表单上的所有复选框

Vb.net 循环检查表单上的所有复选框,vb.net,controls,Vb.net,Controls,我需要循环检查表单上的所有复选框,并获取每个复选框的Tag属性。复选框位于GroupBox和嵌套GroupBox中。我的代码适用于主窗体,它不是从GroupBox中的复选框中获取值 …以下是一种方法,您可以将其添加到表单中,通过选项卡顺序提供对表单上每个控件的访问: 公共迭代器函数GetControls()作为IEnumerable(控件的) Dim ctrl=GetNextControl(Me,True) 直到ctrl不起作用为止 屈服控制 ctrl=GetNextControl(ctrl,

我需要循环检查表单上的所有复选框,并获取每个复选框的Tag属性。复选框位于GroupBox和嵌套GroupBox中。我的代码适用于主窗体,它不是从GroupBox中的复选框中获取值


以下是一种方法,您可以将其添加到表单中,通过选项卡顺序提供对表单上每个控件的访问:

公共迭代器函数GetControls()作为IEnumerable(控件的)
Dim ctrl=GetNextControl(Me,True)
直到ctrl不起作用为止
屈服控制
ctrl=GetNextControl(ctrl,True)
环
端函数
因为它是一个迭代器,所以可以将其他LINQ方法链接到它。要将每个
复选框的
标记
放入数组,请执行以下操作:

Dim checkBoxTags=GetControls(),类型为(复选框的)()。
选择(功能(cb)CStr(cb.Tag))。
ToArray()
如果要对多个表单使用此方法,则可以添加单个扩展方法,而不是在每个表单中重复代码:

导入System.Runtime.CompilerServices
公共模块表单扩展
公共迭代器函数GetControls(源代码为表单)作为IEnumerable(控件的)
Dim ctrl=source.GetNextControl(source,True)
直到ctrl不起作用为止
屈服控制
ctrl=source.GetNextControl(ctrl,True)
环
端函数
端模块

然后在每个表单中调用它,就好像它是一个成员一样。

您需要通过控件树执行递归搜索。不要使用
ReDim
-而是使用
List(Of t)
。感谢jmchilney,这看起来几乎可以工作了。它确实返回所需的值,但它们不符合顺序。数组元素0应设置为Checkbox00的标记属性,元素1设置为checkbox01,等等。tabindexes是有序的,有什么建议吗?复选框名称的数字部分确实指示数组元素的位置。@Terabithia,
GetNextControl
按选项卡顺序工作。您是否为窗体上的控件设置了合理的选项卡顺序?虽然不能保证,但我通常希望这些控件的制表符顺序和数字顺序匹配。不管怎样,如果它们的名称一致且以数字命名,则在获取
标记
值之前,您可以按名称对它们进行排序。在第二个代码段中,将
.OrderBy(Function(cb)cb.Name)
放在类型
选择
调用之间。这个建议很有效,谢谢,不过我需要更改复选框命名。由于涉及100多个控件,我需要在名称的数字部分添加前导零,以使其正确排序,这是可行的。(CheckBox1变成CheckBox001)@Terabithia,您可以在
OrderBy
方法中包含代码,以获取名称末尾的数字,并将其转换为实际数字,但添加零会使代码更简单。
            i = 0

            For Each ctrl As Control In Me.Controls

                If (TypeOf ctrl Is CheckBox) Then

                    'Resize array
                    ReDim Preserve g_str_Array(i)

                    'Add Tag to array
                    g_str_Array(i) = CStr(ctrl.Tag)

                    i += 1

                End If

            Next