VB.Net: цикл по всем элементам формы, включая CommonDialogs
Я перевожу свое приложение 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 ответа
Нет, это компоненты, а не элементы управления. Их код фактически живет в оболочке, они были написаны на неуправляемом C/C++ Microsoft. Единственное, что им удается, - это небольшая оболочка, которая делает необходимые вызовы API, чтобы отобразить их и вернуть результат. OpenFileDialog например.
Самая первая проблема, с которой вы столкнетесь, - это запуск вашего кода при отображении такого диалога. Это диалог, элемент управления не возвращается в вашу программу после вызова ShowDialog(), пока пользователь не отклонит его. Это возможно с большим количеством хитрости. Проверьте мой код в этой теме на подход. Как уже отмечалось, этот код будет работать для любого диалога оболочки, а также для MessageBox.
Это дает вам дескриптор окна диалога. Далее вам нужно перебрать дочерние окна диалога. Вы можете сделать это с помощью вызова API EnumChildWindows. Это дает вам дескриптор окна каждого дочернего элемента, затем вы можете использовать SendMessage(), чтобы что-то сделать с дочерним элементом. Что бы это ни было, вы не указали это в своем вопросе.
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