Loop - set Textboxes to ReadOnly in all Groupboxes

时间:2016-08-31 18:06:07

标签: vb.net textbox

I have groupboxes that contain textboxes and I want to set all of them to ReadOnly=True. Here is what I tried (doesn't work):

EDIT (I forgot about Split container):

For Each SplitCon As Control In Me.Controls
    If TypeOf SplitCon Is SplitContainer Then
        For Each GBox As Control In SplitCon.Controls
            If TypeOf GBox Is GroupBox Then
                For Each ctrl As Control In GBox.Controls
                    If TypeOf (ctrl) Is TextBox Then
                        CType(ctrl, TextBox).ReadOnly = True
                    End If
                Next
            End If
        Next
    End If
Next

1 个答案:

答案 0 :(得分:1)

You can simplify things a great deal. Rather than looking thru all sorts of Control collections, create an array to act as a ToDo list. Then you can get rid of all the TypeOf and CType in the loop used.

' the ToDo list
Dim GrpBoxes = New GroupBox() {Groupbox1, Groupbox2, 
                           Groupbox3, Groupbox4}

For Each grp In GrpBoxes
    For Each tb As TextBox In grp.Controls.OfType(Of TextBox)()
        tb.ReadOnly = True
    Next
Next

Your code no longer depends on the form layout of the moment. The only thing you have to remember is to add any new GroupBox items to your list. You can also declare the array once ever for the whole form if you prefer (or even in the For Each statement)

Rather than working with Control objects, Controls.OfType(Of T) filters the collection and returns an object variable of that type, so there is no need to cast it or skip over controls you are not interested in. You can also tack on a Where method to further refine the list to include only do those with a certain name or Tag.