Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > VB .NET > Как получить коллекцию всех контролов на форме?


Автор: xXxSataNxXx 31.7.2010, 19:05
Реально ли получить коллекцию всех контролов на форме? Включая те, которые находятся в панелях и гроупбоксах?
Что нить типо for each c as control in .....
Но не прибегая к таком зацикливанию

Код

Private Sub Button1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button1.Click
        Get_Item(Me)
    End Sub

    Private Sub Get_Item(ByVal Obj As Object)
        For Each a In Obj.controls
            ListBox1.Items.Add(a.name)
            If TypeName(a) = "Panel" Or TypeName(a) = "GroupBox" Then Get_Item(a)
        Next
    End Sub

И как узнать, на какой форме находится тот или иной объект?

Автор: diadiavova 31.7.2010, 22:12
Цитата(xXxSataNxXx @  31.7.2010,  20:05 Найти цитируемый пост)
Но не прибегая к таком зацикливанию

Почему нет? Не самое лучшее решение, но принцип именно такой - контролы обходятся рекурсивно. Можно еще так. Передаешь функции форму или другой контрол, она возвращает коллекцию контролов
Код

Function GetAllControls(ByVal c As Control) As List(Of Control)
    GetAllControls = New List(Of Control)
    For Each ctrl As Control In c.Controls
        GetAllControls.AddRange(GetAllControls(ctrl))
    Next
End Function
Но принцип тот же.

Автор: xXxSataNxXx 31.7.2010, 22:30
А нет такого, чтоб просто получить все контролы, не прибегая к таким образам?
А как можно сделать такую фичу, как, например, у КомбоБокс (Список выпадения поверх всех контролов)?
Если контрол добавить в панель, то при прорисовки списка надо увеличивать размер контрола(высоту), а часть, которая будет выходить за высоту панели, она не отображается... А как её отобразить?

Автор: diadiavova 31.7.2010, 22:43
Цитата(xXxSataNxXx @  31.7.2010,  23:30 Найти цитируемый пост)
А нет такого, чтоб просто получить все контролы, не прибегая к таким образам?

А чем такой способ плох?  smile 
Цитата(xXxSataNxXx @  31.7.2010,  23:30 Найти цитируемый пост)
А как можно сделать такую фичу, как, например, у КомбоБокс (Список выпадения поверх всех контролов)?

Винформовские контролы - это обертки для системных контролов. Там возможности сильно ограничены. Хочешь свободы действий - WPF тебе в руки.

Автор: xXxSataNxXx 1.8.2010, 02:19
Цитата(diadiavova @  31.7.2010,  22:43 Найти цитируемый пост)
А чем такой способ плох?  smile 

В принципе не плох, просто я думал, что можно одной строкой загнать все контролы с формы в коллекцию, вот и спросил...smile

Автор: diadiavova 1.8.2010, 09:27
Цитата(xXxSataNxXx @  1.8.2010,  03:19 Найти цитируемый пост)
В принципе не плох, просто я думал, что можно одной строкой загнать все контролы с формы в коллекцию, вот и спросил...

Кто мешает прикрутить метод-расширитель к контролам и делать одной строкой?

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)