VB.Net:循环遍历所有表单项,包括CommonDialogs

时间:2010-01-30 13:21:55

标签: vb.net controls translation winforms common-dialog

我正在翻译我的VB.Net应用程序,我需要遍历表单上的所有控件。使用递归函数,如

Public Sub TranslateControl(ByVal Ctrl As Control)
    For Each ChildCtrl As Control In Ctrl.Controls
        ChildCtrl.Text = Translate(ChildCtrl.Text)

        If TypeOf ChildCtrl Is Label Then
            CType(ChildCtrl, Label).Tag = Translate(CType(ChildCtrl, Label).Tag)
        End If

        TranslateControl(ChildCtrl)
    Next
End Sub

效果很好,但它不包含CommonDialog个对象,例如FolderBrowser个对象。我如何访问这些对象?我试过这个

    For Each ChildDialog As CommonDialog In Ctrl.Controls
        ChildDialog.Tag = Translate(ChildDialog.Tag)
    Next

但显然存在继承问题,因为CommonDialog个对象不是controls

有没有办法让我遍历表单上显示的所有项目?

非常感谢!

CFP

2 个答案:

答案 0 :(得分:1)

不,它们是组件,而不是控件。他们的代码实际上存在于shell中,它们是由Microsoft用非托管C / C ++编写的。管理它们的唯一事情是一个小包装器,它进行必要的API调用以显示它们并返回它们的结果。例如OpenFileDialog。

您将遇到的第一个问题是在显示此类对话框时运行您的代码。这是一个对话框,在ShowDialog()调用之后,控件不会返回到您的程序,直到用户将其解除。这可能有相当多的诡计。检查this thread中的代码以了解该方法。如上所述,该代码适用于任何shell对话框以及MessageBox。

它可以获得对话框的窗口句柄。接下来,您必须迭代对话框的子窗口。您可以使用EnumChildWindows API调用执行此操作。这为您提供了每个孩子的窗口句柄,然后您可以使用SendMessage()对孩子做一些事情。无论那是什么,你都没有在你的问题中指明。

答案 1 :(得分:-2)

 Friend Sub resetFormControls(zForm As Form)

尝试使用子程序将所有控件重置为未使用状态:空白文本框,未选中复选框和单选按钮等。

        For Each zCntl As Control In zForm.Controls
            If zCntl.HasChildren Then
                For Each zChildCntl As Control In zCntl.Controls
                    If zChildCntl.GetType Is GetType(CheckBox) Then
                        CType(zChildCntl, CheckBox).Checked = False
                    End If

                    If zChildCntl.GetType Is GetType(TextBox) Then CType(zChildCntl, TextBox).Text = ""
                    If zChildCntl.GetType Is GetType(TextBox) Then CType(zChildCntl, TextBox).BackColor = Color.White
                    If zChildCntl.GetType Is GetType(RichTextBox) Then CType(zChildCntl, RichTextBox).Text = ""
                    If zChildCntl.GetType Is GetType(RichTextBox) Then CType(zChildCntl, RichTextBox).BackColor = Color.White
                    If zChildCntl.GetType Is GetType(RadioButton) Then CType(zChildCntl, RadioButton).Checked = False

                Next
            End If
            If zCntl.GetType Is GetType(CheckBox) Then CType(zCntl, CheckBox).Checked = False
            If zCntl.GetType Is GetType(TextBox) Then CType(zCntl, TextBox).Text = ""
            If zCntl.GetType Is GetType(TextBox) Then CType(zCntl, TextBox).BackColor = Color.White
            If zCntl.GetType Is GetType(RichTextBox) Then CType(zCntl, RichTextBox).Text = ""
            If zCntl.GetType Is GetType(RichTextBox) Then CType(zCntl, RichTextBox).BackColor = Color.White
            If zCntl.GetType Is GetType(RadioButton) Then CType(zCntl, RadioButton).Checked = False
            If zCntl.GetType Is GetType(DateTimePicker) Then CType(zCntl, DateTimePicker).Text = Now.Date
            If zCntl.GetType Is GetType(ComboBox) Then CType(zCntl, ComboBox).SelectedIndex = 0

        Next
        Application.DoEvents()

    Catch ex As Exception

    End Try
End Sub