2010-11-18 5 views
1

Эй, ребята. Я должен что-то упустить. Я пытаюсь пройти через таблицы в моей форме, но, похоже, мне не хватает нескольких ярлыков ... У меня в общей сложности 69 таблиц на моей форме, и я получаю только 5 хитов в msgbox. Все элементы управления были помещены во время разработки на форме, а не на панели или вкладки. Также при проверке me.controls. счет неверен, так как отсутствует ровно 64 элемента управления. (Недостающие элементы).Почему элементы управления отсутствуют у Me.Controls()

Dim ctl As Control 
For Each ctl In Me.Controls 
    If TypeOf ctl Is Label Then 
    MsgBox(ctl.Name) 
    End If 
Next ctl 

Любые идеи, почему они не появятся?

Брэд Swindell

ответ

4

коллекция Controls является иерархия. Вы получаете только элементы управления верхнего уровня. Если вы хотите получить все элементы управления, вам придется рекурсивно выкапывать в каждый дочерний элемент Control Control.

Все элементы управления размещены на дизайн времени на форме, а не на панели или вкладок.

Помните, что GroupBox - это также элемент управления, обладающий собственным свойством Controls.

Эта функция должна дать вам то, что вы хотите, но мой VB.Net очень, очень ржавый, поэтому, если он не скомпилируется, я приношу свои извинения.

Private Sub PrintAllControlsRecursive(col As Control.ControlCollection, ctrlType As Type) 
If col Is Nothing OrElse col.Count = 0 Then 
    Return 
End If 

For Each c As Control In col 
    If c.GetType() = ctrlType Then 
    MessageBox.Show(c.Name) 
    End If 

    If c.HasChildren Then 
    PrintAllControlsRecursive(c.Controls, ctrlType) 
    End If 
Next 
End Sub 
+0

Цитата: «Не на панелях или вкладках». Ну, может быть. –

0
Sub PrintAllControls(ByVal ParentCtl As Control) 
     Dim ctl As Control 
     MsgBox(ParentCtl.Name + " start", MsgBoxStyle.Exclamation) 
     For Each ctl In ParentCtl.Controls 
      MsgBox(ctl.Name) 
      If ctl.HasChildren = True Then 
       PrintAllControls(ctl) 
      End If 
     Next 
     MsgBox(ParentCtl.Name + " End", MsgBoxStyle.Information) 
    End Sub 
0

Flatten.

Просто используйте LINQ и рекурсивное лямбда с SelectMany выравниваться по иерархии:

Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load 

    Dim act As Func(Of Control, IEnumerable(Of Control)) = 
    Function(ctl) ctl.Controls.Cast(Of Control)().SelectMany(
     Function(ctl2) ctl2.Controls.Cast(Of Control)(). 
     Union(act(ctl2))).Union(ctl.Controls.Cast(Of Control)) 

    MsgBox(Join((From c In act(Me).Distinct Order By c.Name 
     Select c.Name & "--" & c.GetType.ToString).ToArray, vbCrLf)) 

End Sub 

Не Barnyard программирование вообще ни случайно повторяющихся элементов или непонятных ошибок ...

-1

быть уверены, что вы» повторное определение элементов управления ПОСЛЕ того, как форма была полностью заряжена, иначе, если вы попытаетесь перечислить элементы управления во время загрузки, me.controls.count будет равен нулю.

Смежные вопросы