hemendrapadia Ответов: 1

Обработка элементов управления во вложенном групповом окне.


Я разработчик VB6. Теперь переключаемся на vb.net. в одной ситуации я чувствую странное поведение vb.net
У меня есть групповое поле в групповом поле, когда я подсчитываю элементы управления в форме по :
Me.controls.count тогда возвращает только один

у меня есть группы с 5 текстовое поле + 5 наклеек (основная группа коробка)
затем еще 1 групповой блок внутри основного группового блока с именем btnFrame(групповой блок для кнопок), который имеет 3 кнопки. так что всего около 15 контролей по форме.

для того же кода vb6 возвращает 15
а vb.net-17 возвращает только 1

Основной вопрос заключается в том, как итерацию использовать для каждого цикла для всех элементов управления?

Что я уже пробовал:

я пытался
1-me.controls.count но failed.it возвращает только 1 ( тогда я не могу выполнить цикл)
2-Затем я подключила на каждую клавишу Ctrl и контроль в меня.контроля. и это тоже не сработало.

1 Ответов

Рейтинг:
0

OriginalGriff

Me.Controls возвращает коллекцию для формы - то есть "внешнее" групповое поле.
Чтобы получить доступ к внутреннему групповому окну, вы должны повторить эту коллекцию, а затем ее вложенные коллекции:

For Each cOuter As Control In Me.Controls

    If cOuter.HasChildren Then

        For Each cInner As Control In cOuter.Controls

            If cInner.HasChildren Then

                For Each c As Control In cInner.Controls
                    ProcessYourControl(c)
                Next
            End If

            ProcessYourControl(cInner)
        Next
    End If

    ProcessYourControl(cOuter)
Next
Другое решение-написать рекурсивный метод, который принимает коллекцию элементов управления в качестве параметра и обрабатывает все элементы управления в ней:
Private Sub FindControls(ByVal controls As ControlCollection)
    For Each c As Control In controls

        If c.HasChildren Then
            FindControls(c.Controls)
        End If

        ProcessYourControl(c)
    Next
End Sub
А потом передайте это Me.Controls когда ты его назовешь.


hemendrapadia

Да, я пробовал этот рекурсивный метод, но он выдает ошибку.
Мой код выглядит следующим образом:

Sub ManageControlFocusColor(ByVal controls As ControlCollection)

Для каждого C в качестве контроля в контроля

Если у c.есть дети, то
ManageControlFocusColor(c.Controls) 'выдает ошибку здесь
Конец, Если

Если TypeOf c - это TextBox, то
Если c-это ActiveControl, то
c.BackColor = цвет.LightSteelBlue
Еще
c.BackColor = цвет.Белый
Конец, Если
Конец, Если
'
Если TypeOf c - это кнопка, то
Если c-это ActiveControl, то
c.BackColor = цвет.LightSteelBlue
Еще
гр.Кнопка Свойства Backcolor =.DefaultBackColor
Конец, Если
Конец, Если
Следующий
Конец Подводной Лодки
----------------------------
Ошибка
----------------------------
Система.Которого вызывается invalidcastexception: '[а]экземпляре коллекции controlcollection не может быть приведено в [B]в экземпляре коллекции controlcollection. Тип А происходит из системы'.Окна.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089' в контексте 'Default' at location 'C:\WINDOWS\Microsoft.Net\assembly\GAC_MSIL\System.Окна.Формы\v4.0_4.0.0.0__b77a5c561934e089\система.Окна.Forms.dll". Тип B происходит от 'System.Окна.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089' в контексте 'Default' at location 'C:\WINDOWS\Microsoft.Net\assembly\GAC_MSIL\System.Окна.Формы\v4.0_4.0.0.0__b77a5c561934e089\система.Окна.Forms.dll'.'

hemendrapadia

Но первый из них работает.

hemendrapadia

Извини, забыл поблагодарить тебя.
Большое вам спасибо за ваш ответ.