Перебор контролов

Язык Visual Basic на платформе .NET.

Модераторы: Ramzes, Sebas

Calhoon
Новичок
Новичок
Аватара пользователя
 
Сообщения: 25
Зарегистрирован: 07.10.2007 (Вс) 18:01
Откуда: Новосибирск

Перебор контролов

Сообщение Calhoon » 18.09.2009 (Пт) 14:59

Необходимополучить именавсех контролов на форме. Копался на тему "как перебрать контролы". Сами-то они на форме вызываются Form.<Name>, а вот как перебрать все имена в цикле? Почти все контролы находятся в контейнерах, контейнеры сами содержат контейнеры, и т.д., так что For Each in Controls выдает только единственный внешний контейнер =) Дайте идею
Самое простое решение вывести на экран 15 простых чисел:
Print "2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47"
____________________________
VS2008 & VS2010
VB6

Williams
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1280
Зарегистрирован: 06.05.2008 (Вт) 18:35
Откуда: System.Reflection.Williams (увидел себя в зеркале :))

Re: Перебор контролов

Сообщение Williams » 18.09.2009 (Пт) 15:15

Рекурсивно Control.Controls.
И вы думаете, что вас оставят в живых после прочтения этого поста?

Dmitry81
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 52
Зарегистрирован: 20.06.2009 (Сб) 0:43
Откуда: Украина, Запорожье

Re: Перебор контролов

Сообщение Dmitry81 » 18.09.2009 (Пт) 21:50

Код: Выделить всё
Dim ctrl As System.Windows.Forms.Control
        Dim Names As String = "Список имеющихся контролов:"
        For Each ctrl In Me.Controls
            Names = Names & vbCrLf & ctrl.Name
        Next
        MsgBox(Names)

и будет тебе счастье :)
А.Эйнштейн: Есть две бесконечные вещи - вселенная и человеческая глупость. Хотя, насчет вселенной я сомневаюсь...

Williams
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1280
Зарегистрирован: 06.05.2008 (Вт) 18:35
Откуда: System.Reflection.Williams (увидел себя в зеркале :))

Re: Перебор контролов

Сообщение Williams » 18.09.2009 (Пт) 22:01

Dmitry81 писал(а):и будет тебе счастье :)


Не будет.
И вы думаете, что вас оставят в живых после прочтения этого поста?

Dmitry81
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 52
Зарегистрирован: 20.06.2009 (Сб) 0:43
Откуда: Украина, Запорожье

Re: Перебор контролов

Сообщение Dmitry81 » 18.09.2009 (Пт) 22:15

и чего не будет?
А... ты про вложенные контейнеры.
Ну да, ну да.
А.Эйнштейн: Есть две бесконечные вещи - вселенная и человеческая глупость. Хотя, насчет вселенной я сомневаюсь...

ndemidov
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 285
Зарегистрирован: 14.11.2007 (Ср) 16:23
Откуда: Earth planet

Re: Перебор контролов

Сообщение ndemidov » 19.09.2009 (Сб) 9:58

Вот как я делал в своей программе для назначения единого стиля для ЭУ:

Код: Выделить всё
Public Sub ApplyStyle(ByVal cntrl As Control)
        ' Действия ф-ии:
        ' 1) Устанавливает для cntrl стиль;
        ' 2) Рекурсия для всех SubControls.


        ' Для cntrl
        If TypeOf (cntrl) Is Form Then
            With CType(cntrl, Form)
                ' Внешний вид окна
                .BackColor = Me.BackColor
                .ForeColor = Me.MajorTextColor

                .Opacity = CDbl(Me.Opacity) / 100
                .TopMost = Me.TopMost

               ...

        Else
            Call APPL(cntrl)
        End If


        ' Для каждого Sub Control
        For Each SubCntrl As Control In cntrl.Controls
           ' Рекурсия
            Call ApplyStyle(SubCntrl)
        Next
    End Sub
Большинство людей не понимает, что великое многообразие и красочность мира будут служить им крепчайшей душевной поддержкой на протяжении всей жизни. Иван Ефремов

Williams
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1280
Зарегистрирован: 06.05.2008 (Вт) 18:35
Откуда: System.Reflection.Williams (увидел себя в зеркале :))

Re: Перебор контролов

Сообщение Williams » 19.09.2009 (Сб) 11:09

ndemidov писал(а):Вот как я делал в своей программе для назначения единого стиля для ЭУ:

Код: Выделить всё
Call APPL(cntrl)
...
Call ApplyStyle(SubCntrl)



Call - пережиток прошлого. Тем не менее, это уже ближе к истине :)
И вы думаете, что вас оставят в живых после прочтения этого поста?

ndemidov
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 285
Зарегистрирован: 14.11.2007 (Ср) 16:23
Откуда: Earth planet

Re: Перебор контролов

Сообщение ndemidov » 19.09.2009 (Сб) 12:07

:) Ну, чтобы при чтении дать понять что это Sub.
Большинство людей не понимает, что великое многообразие и красочность мира будут служить им крепчайшей душевной поддержкой на протяжении всей жизни. Иван Ефремов

Dmitry81
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 52
Зарегистрирован: 20.06.2009 (Сб) 0:43
Откуда: Украина, Запорожье

Re: Перебор контролов

Сообщение Dmitry81 » 19.09.2009 (Сб) 18:28

Вот:
Код: Выделить всё
Dim ss As String

    Private Sub search_ctrl(ByVal CtrlP As System.Windows.Forms.Control)
        Dim CtrlCh As Control
        For Each CtrlCh In CtrlP.Controls
            ss = CtrlCh.Parent.Name & "." & CtrlCh.Name & vbCrLf & ss
            If CtrlCh.Controls.Count > 0 Then Me.search_ctrl(CtrlCh)
        Next
    End Sub

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        ss=VbNullString
        Me.search_ctrl(Me)
        MsgBox(ss)
    End Sub

Набрасываем на форму кучу контролов с произвольным уровнем вложенности. По клику кнопки Button1 ( в моем примере) вылезет месиджбокс со списком контролов на форме, включая и контролы, размещенные не непосредственно на форме а в контейнерах. При этом указывается и имя контейнера:
Form1.Button1
GroupBox2.Button3
GroupBox1.GroupBox2
GroupBox1.Button2
Form1.GroupBox1


P.S.
Williams, я конечно понимаю что ты типа гуру , но мог бы и сам давно нашлепать код. Толку-то от твоих сообщений (особенно последнего). Ну да, ну да, это ж не для асов.
А.Эйнштейн: Есть две бесконечные вещи - вселенная и человеческая глупость. Хотя, насчет вселенной я сомневаюсь...

Calhoon
Новичок
Новичок
Аватара пользователя
 
Сообщения: 25
Зарегистрирован: 07.10.2007 (Вс) 18:01
Откуда: Новосибирск

Re: Перебор контролов

Сообщение Calhoon » 19.09.2009 (Сб) 18:57

Спасибо. Я попробовал код Williams'а - все хорошо, но такой подход не отображает дочерние элементы SplitContainer, ToolSplitPanel - видимо, для такие контролы придется распознавать и получать имена дочерних через их свойства... Жаль, ведь это могут быть не единственные подобные контролы, а я пытаюсь получить универсальный код)

Williams
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1280
Зарегистрирован: 06.05.2008 (Вт) 18:35
Откуда: System.Reflection.Williams (увидел себя в зеркале :))

Re: Перебор контролов

Сообщение Williams » 19.09.2009 (Сб) 19:05

Calhoon писал(а):Спасибо. Я попробовал код Williams'а - все хорошо


К сожалению, или к счастью, я не постил в этой теме никакого кода.
И вы думаете, что вас оставят в живых после прочтения этого поста?

Dmitry81
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 52
Зарегистрирован: 20.06.2009 (Сб) 0:43
Откуда: Украина, Запорожье

Re: Перебор контролов

Сообщение Dmitry81 » 19.09.2009 (Сб) 19:15

Calhoon писал(а):Спасибо. Я попробовал код Williams'а - все хорошо, но такой подход не отображает дочерние элементы SplitContainer, ToolSplitPanel - видимо, для такие контролы придется распознавать и получать имена дочерних через их свойства... Жаль, ведь это могут быть не единственные подобные контролы, а я пытаюсь получить универсальный код)

Ну так понятное дело: у сплитконтейнера дочерние контролы располагаются на панелях, которые имен не имеют. А у тулстрипа контролы - это коллекция items, а не controls.
Поэтому мой код не вернет их имена, а со сплитконтейнером тож хитро: у его дочерних не удается получить имя родителя (т.к. панели безымянны) и для самого сплитконтейнера не отображаются дочерние - та же причина...
А.Эйнштейн: Есть две бесконечные вещи - вселенная и человеческая глупость. Хотя, насчет вселенной я сомневаюсь...

Williams
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1280
Зарегистрирован: 06.05.2008 (Вт) 18:35
Откуда: System.Reflection.Williams (увидел себя в зеркале :))

Re: Перебор контролов

Сообщение Williams » 19.09.2009 (Сб) 19:17

Вот теперь мой код:

Код: Выделить всё

Public Sub ProcessControls(ByVal c As Windows.Forms.Control)

        If Not String.IsNullOrEmpty(c.Name) Then Console.WriteLine(c.Name)

        If c.Controls.Count <> 0 Then
            For Each c1 As System.Windows.Forms.Control In c.Controls
                ProcessControls(c1)
            Next
        End If

End Sub


Вызов:

Код: Выделить всё
ProcessControls(Me)
И вы думаете, что вас оставят в живых после прочтения этого поста?

Dmitry81
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 52
Зарегистрирован: 20.06.2009 (Сб) 0:43
Откуда: Украина, Запорожье

Re: Перебор контролов

Сообщение Dmitry81 » 19.09.2009 (Сб) 19:32

ну и чем он отличается от других?..
Ну я понимаю, учел возможность отсутствия имени, но как же быть с указанием родителя?
А.Эйнштейн: Есть две бесконечные вещи - вселенная и человеческая глупость. Хотя, насчет вселенной я сомневаюсь...

Williams
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1280
Зарегистрирован: 06.05.2008 (Вт) 18:35
Откуда: System.Reflection.Williams (увидел себя в зеркале :))

Re: Перебор контролов

Сообщение Williams » 19.09.2009 (Сб) 19:45

Dmitry81 писал(а):ну и чем он отличается от других?..


Ну во-первых чистотой и ясностью :mrgreen:

Все что не берется этим методом, можно достать через Reflection, как мне думается.
И вы думаете, что вас оставят в живых после прочтения этого поста?


Вернуться в Visual Basic .NET

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 28

    TopList