设置表单控件循环的顺序

时间:2013-12-12 15:35:29

标签: vb.net foreach

我循环浏览某个标签页上的所有控件,并抓取.tag属性,以便从checked的复选框中执行一些进一步的操作。

但是,我要求这些控件按特定顺序循环(我希望它们可以按tab index排序),但看起来它们不是。

有没有办法强制他们循环的顺序?感谢。

Dim objCtrl As Control
For Each objCtrl In Me.objConfigForm.tabPageGeneral.Controls

    If TypeOf objCtrl Is CheckBox AndAlso DirectCast(objCtrl, CheckBox).Checked Then

        Dim strProp As String = DirectCast(objCtrl, CheckBox).Tag
        Dim strListItem As String = CallByName(objUser, strProp, CallType.Get)
        lstGeneral.Add(strListItem)

    End If

Next

2 个答案:

答案 0 :(得分:4)

使用LINQ按TabIndex对控件进行排序,如下所示:

For Each objCtrl As Control In Me.Controls.Cast(Of Control).OrderBy(Function(c) c.TabIndex)
    If TypeOf objCtrl Is CheckBox AndAlso DirectCast(objCtrl, CheckBox).Checked Then
        Dim strProp As String = DirectCast(objCtrl, CheckBox).Tag
        Dim strListItem As String = CallByName(objUser, strProp, CallType.Get)
        lstGeneral.Add(strListItem)
    End If
Next

  

注意:上面的代码要求将System.Linq命名空间导入到您的代码文件中,以支持Cast()OrderBy() LINQ扩展方法。

答案 1 :(得分:1)

使用.OrderBy()扩展程序选择订单。此外,在我们处理此问题时,您可以将If块替换为Where()OfType()扩展名,以减少嵌套和转换:

For Each box As CheckBox In Me.Controls.OfType(Of CheckBox)() _
                         .Where(Function(b) b.Checked) _
                         .OrderBy(Function(b) b.TabIndex)

    lstGeneral.Add(CallByName(objUser, box.Tag, CallType.Get))
Next