I'm translating my VB.Net application, and I need to loop through all the controls on my form. Using a recursive function such as
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
works very well, but it doesn't include CommonDialog
objects, such as FolderBrowser
objects. How can I access these objects ? I tried this
For Each ChildDialog As CommonDialog In Ctrl.Controls
ChildDialog.Tag = Translate(ChildDialog.Tag)
Next
But there is obviously an inheritance problem, since CommonDialog
objects are not controls
.
Is there a way for me to loop through really all the items displayed on my form?
Thanks a lot!
CFP
No, they are components, not controls. Their code actually lives in the shell, they were written in unmanaged C/C++ by Microsoft. The only thing that's managed about them is a small wrapper that makes the necessary API calls to display them and return their result. OpenFileDialog for example.
The very first problem you'll run into is run your code when such a dialog is displayed. It is a dialog, control doesn't return to your program after the ShowDialog() call until the user dismisses it. It is possible with a fair amount of trickery. Check my code in this thread for the approach. As noted, that code will work for any shell dialog, as well as MessageBox.
That gets you the window handle of the dialog. Next, you have to iterate the child windows of the dialog. You can do that with the EnumChildWindows API call. That gives you the window handle of each child, you can then use SendMessage() to do something with the child. Whatever that might be, you didn't specify that in your question.