为每个控制vb 2008处理容器内的容器

时间:2014-01-03 09:55:02

标签: vb.net loops visual-studio-2008 controls

我创建了一个翻译表单的函数。我可以循环遍历表单中的每个控件来调用此函数,但我已经做了一个情况,我无法处理。 在我的一个表单中,我在groupbox中有groupbox。 如果我只有一个组合框,则此源可用。

    Public Function translate_form(ByVal form As Form)
    Dim control As Object
    Dim controlname As String

    form.Text = Get_Control_Name(form.Name, "Form")
    Try
        For i = 0 To form.Controls.Count - 1
            control = form.Controls(i)
            If TypeOf (control) Is MenuStrip Then
                For j = 0 To control.items.count - 1
                    control.items(j).text = Get_Control_Name(form.Name, "MenuItem" & j)
                Next
            Else
                controlname = Get_Control_Name(form.Name, control.Name)
                control.Text = IIf(controlname Is Nothing, control.Text, controlname)
                If TypeOf (control) Is GroupBox Then
                    For j = 0 To control.Controls.Count - 1
                        controlname = Get_Control_Name(form.Name, control.Controls(j).Name)
                        control.Controls(j).Text = IIf(controlname Is Nothing, control.Controls(j).Text, controlname)
                        If TypeOf (control.Controls(j)) Is Button Then
                            control.Controls(j).AutoSize = True
                        End If
                    Next
                End If
                If TypeOf (control) Is Button And UCase(control.Text) <> "X" Then
                    control.AutoSize = True
                End If
            End If
        Next
    Catch ex As Exception
        MsgBox(ex.Message, MsgBoxStyle.Critical)
    End Try
End Function

但在某些情况下,我想在容器内部控制控件。

我可以再循环一次
control.Controls(j)

是一个组合框,但我想让这个功能处理任何类型的容器金字塔&#34;,如果你知道我的意思。也许我会有一个容器也有一个也有一个等等......或者是否有任何控制我可以用作一个组合框但它不算作一个容器,所以我可以看到它:

form.Controls

有什么建议吗?

提前致谢。

1 个答案:

答案 0 :(得分:1)

您的代码无法提供所需内容的原因是您没有执行控件的递归搜索。请记住,Form.Controls仅包含父控件(不是父控件最终包含的子控件;就像您引用GroupBox所包含的控件的情况一样)。另外,我看到了各种不太正确的问题(你应该在你的文件顶部写Option Strict On)这就是为什么这个答案打算为你提供一个更好的框架来处理(你只需填写)在您的代码的空白处):

Public Sub translate_form2(ByVal form As Form)

    Try

        For Each ctrl As Control In form.Controls
            actionsCurrentControl(ctrl)
            recursiveControls(ctrl)
        Next

    Catch ex As Exception
    End Try

End Sub

'Accounting for all the child controls (if any)
Public Sub recursiveControls(parentControl As Control)

    If (parentControl.HasChildren) Then

        For Each ctrl As Control In parentControl.Controls
            actionsCurrentControl(ctrl)
            recursiveControls(ctrl)
        Next

    End If

End Sub

Public Sub actionsCurrentControl(curControl As Control)

    If TypeOf curControl Is MenuStrip Then

    Else
        If TypeOf (curControl) Is GroupBox Then

        End If
        If TypeOf (curControl) Is Button And UCase(curControl.Text) <> "X" Then

        End If
    End If

End Sub

translate_form2遍历代码中的所有父控件(但依赖于一组Subs(你错误地使用了Function而没有返回任何值,这是错的),使结构更具适应性;);它还调用recursiveControls(它也为它分析的每个控件调用自己)来处理可能存在的任何子控件。我还包括actionsCurrentControl,其中包含要为每个控件执行的所有操作(您必须使用您的代码填充它)。