2010-11-18 16 views
1

Hey guys. Bir şey kaçırmam lazım. Ben formları üzerinde lables düşünce döngüsü çalışıyorum ama ben birkaç etiket eksik olduğum ortaya çıkıyor ... Ben formunda toplam 69 lables var ve sadece msgbox 5 isabet olsun. Tüm kontroller, panel üzerinde veya sekmelerde değil, form üzerinde tasarım süresine yerleştirildi. Ayrıca me.controls teftiş üzerine. Tam olarak 64 kontrol eksik olduğundan sayım yanlış. (Eksik lables).Neden Me.Controls eksik()

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

Neden olmasın diye bir fikrin var mı?

Brad Swindell

cevap

4

Kontroller koleksiyonu hiyerarşi olduğunu. Sadece üst düzey kontroller alıyorsunuz. Tüm kontrolleri almak istiyorsanız, her çocuk kontrol kontrol koleksiyonunu tekrar tekrar girmeniz gerekecektir.

Tüm kontroller form üzerinde değil panellerin veya sekmede tasarım zamanında yerleştirildi.

GroupBox'un da kendi Controls özelliği ile birlikte bir denetim olduğunu unutmayın.

Bu işlev, istediğiniz şeyi vermelidir, ancak VB.Net'im çok, çok paslıdır, bu nedenle derleme yapmazsa özür dilerim.

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

Fiyat: "Panel veya sekmelerde değil". Pekala belki. –

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

yassılaştırın.

Sadece hiyerarşi düzleştirmek SelectMany ile LINQ ve özyinelemeli lambda kullanın:

-1

emin olun ... hepsi ne de tekrarlanan öğeleri veya belirsiz hataların fırsatta

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 

Değil çiftlik programlama sen misin' Kontrolleri bulma formu tamamlandıktan sonra tamamlandı, aksi takdirde yükleme işlemi sırasında kontrol listelerini denerseniz, me.controls.count sıfır olacaktır.

İlgili konular