Controls-Collection für Windows Forms

Veröffentlicht: 09. Mrz 2004 | Aktualisiert: 29. Jun 2004

Von Mathias Schiffer

Unter Visual Basic konnten Sie auf alle Controls einer Form über deren Controls-Collection zugreifen. Unter Visual Basic .NET funktioniert das nicht mehr. Dieser MSDN Quickie schafft Abhilfe.

Iterieren Sie unter Visual Basic 6.0 über die Controls Collection einer Form, so erhalten Sie reihum Referenzen auf alle Controls, die auf dieser Form mittelbar oder unmittelbar platziert sind.

Unter Visual Basic .NET hingegen enthält die Controls-Collection einer Windows Form nur die unmittelbar auf ihr selber platzierten Controls. Controls, die in anderen Container-Controls untergebracht sind, werden hier nicht erfasst. Das Gleiche gilt auch für die Controls-Collection von Controls: Nur unmittelbar darauf platzierte Controls finden sich in der Collection.

Um ein Visual Basic 6.0 vergleichbares Verhalten zu erreichen, müssen Sie rekursiv vorgehen: Die Elemente der Controls-Collection einer Form werden daraufhin überprüft, ob sie Control-enthaltende Controls enthalten (diese Formulierung alleine riecht schon herrlich nach Rekursion, nicht wahr?). Etwas einfacher gesagt: Sie werden darauf geprüft, ob sie als Container noch weitere Controls enthalten - die wiederum ihrerseits möglicherweise auch Container sein könnten.

Keine Angst: Diese Rekursionsformulierung klingt bereits viel komplizierter, als sie sich in Code ausdrücken lässt. Verwenden Sie für ein VB6-Verhalten einfach die Funktion CollectedControls statt der Controls-Collection einer Windows Form:

Private Function CollectedControls(ByVal frmForm As Form) As ArrayList 
  ' Erzeugt eine VB6-artige Controls-Auflistung, in der sich 
  ' nicht nur unmittelbar, sondern auch mittelbar auf einer 
  ' Form befindliche Steuerelemente finden. 
  ' ArrayList-Objekt für Rückgabe bereitstellen 
  CollectedControls = New ArrayList 
  ' Rekursiv die Container durchsuchen (beginnend 
  ' mit der übergebenen Form als oberstem Container) 
  AddContainedControls(frmForm, CollectedControls) 
End Function 
Private Sub AddContainedControls(ByVal Container As Control, _ 
   ByVal CollControls As ArrayList) 
  ' Fügt alle in einem Container "Container" enthaltenen 
  ' Controls der übergebenen CollControls-Auflistung hinzu. 
  For Each ctl As Control In Container.Controls 
 CollControls.Add(ctl) 
 ' Rekursiver Aufruf für Controls "im" gefundenen Control 
 AddContainedControls(ctl, CollControls) 
  Next 
End Sub

Zum Schluss soll ein wenig Code zur Verdeutlichung des Unterschieds nicht fehlen. Platzieren Sie ihn gemeinsam mit dem obigen Beispielcode im Codemodul einer Form, auf der Sie ineinander verschachtelte Steuerelemente angebracht haben:

  ' Controls-Collection a la VB .NET: 
  Console.WriteLine("Controls-Collection a la VB .NET:") 
  For Each ctl As Control In Me.Controls 
 Console.WriteLine(ctl.Name) 
  Next 
  ' Controls-Collection a la VB 6: 
  Console.WriteLine("Controls-Collection a la VB 6:") 
  For Each ctl As Control In CollectedControls(Me) 
 Console.WriteLine(ctl.Name) 
  Next