Control-Arrays mit VB.NET erzeugen

Von Mathias Schiffer

Viele VB6-Anwender vermissen Steuerelementfelder in Visual Basic .NET: In der Entwicklungsumgebung können Sie keine solchen Arrays anlegen. Wir zeigen Ihnen, wie Sie trotzdem auf einfache Weise zum Ziel kommen.

In Visual Basic 6.0 war es sehr einfach, ein Steuerelement-Feld (Control-Array) anzulegen: Wurde ein Steuerelement in die Zwischenablage befördert und durch Einfügen zu weiterem Leben erweckt, fragte die Entwicklungsumgebung nach, ob ein Control-Array erzeugt werden solle. Es war noch nicht einmal notwendig, die Indizes selber zu setzen.

Ganz so einfach macht das .NET Framework die Sache nicht: Windows Forms unterstützen keine Steuerelement-Felder. Auch eine Index-Eigenschaft werden Sie vergeblich suchen. Andererseits ist das Erzeugen von Steuerelementen zur Laufzeit noch einfacher als unter Visual Basic 6 - vor allem, was das Behandeln von Ereignissen angeht. Was aus Sicht des Codes fehlt, ist dann eigentlich nur noch ein Array. Natürlich werden Sie die Design-Möglichkeiten zur Entwurfszeit schmerzlich vermissen. Daran allerdings werden wir im Rahmen dieses MSDN Quickies leider nichts ändern können.

Die Idee zur Ersetzung der Steuerelement-Felder in Visual Basic 6 beruht darauf, einfach ein entsprechend typisiertes Array per Code zur Verfügung zu stellen, neue Instanzen des jeweiligen Steuerelements zu erzeugen und diese dem Array zuzuweisen. Zusätzlich muss das jeweils neu erzeugte Steuerelement noch zugewiesen, positioniert und bemaßt werden. Auch die Controls-Sammlung des Parents, einer Windows Form, darf nicht vergessen werden. Und natürlich müssen zumindest die wichtigsten Ereignisse mit berücksichtigt werden - dies erreichen Sie über Verwendung von AddHandler.

Codebeispiel

Im folgenden Beispiel wird ein Array von 10 Button-Steuerelementen erzeugt. Als Tragwerk steht dafür das als Button typisierte Array btnArray zur Verfügung. Das Codebeispiel befindet sich innerhalb eines Windows Forms-Moduls und kann daher den Me-Verweis nutzen, um dem Button ein Parent-Objekt zuzuordnen. Das Setzen von Eigenschaften wie Name, Tab-Reihenfolge, Position, Größe, Sichtbarkeit und Beschriftung sind trivial.

Im Beispiel wird an Ereignissen das Click-Ereignis ausgewertet. In der Zielprozedur btnArray_Click wird dafür das gegebene Array durchlaufen, um das passende Steuerelement zu identifizieren. Natürlich können Sie hier auch andere Prüfungen oder Fallunterscheidungen vornehmen.

Weitere Ereignisse auszuwerten bedeutet nicht mehr als analoge Tipparbeit, die Sie sich durch einen simplen Trick vereinfachen können: Positionieren Sie in der Entwicklungsumgebung vorübergehend ein entsprechendes Steuerelement auf der Form und lassen Sie Visual Studio .NET die entsprechenden Prozedurköpfe für Ereignisbehandlungen erzeugen.

' Code in einem Windows Forms-Codemodul (Form1)
'
Public Class Form1
    Inherits System.Windows.Forms.Form
  
  
  Private btnArray(9) As Button ' Dies wird unser Control-Array!
  
  
  Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
  
    ' 10 Buttons neu erzeugen
    For i As Integer = 0 To 9
  
      ' Neuen Button erzeugen
      btnArray(i) = New Button
  
      ' Den erzeugten Button verwenden:
      With btnArray(i)
  
        ' Parent festlegen und Controls-Collection erweitern
        .Parent = Me
        .Parent.Controls.Add(btnArray(i))
  
        ' Verwaltungsinformationen zuweisen
        .Name = "Button" & CStr(i)
        .TabIndex = i
  
        ' Darstellung: Beschriften und positionieren
        .Text = "Button(" & CStr(i) & ")"
        .Size = New Size(80, 30)
        .Location = New Point(10, 10 + i * 2 * .Height)
        .Visible = True
  
        ' Auf das Click-Ereignis reagieren können:
        AddHandler .Click, AddressOf btnArray_Click
  
      End With
  
    Next i
  
  End Sub
  
  
  Private Sub btnArray_Click(ByVal sender As Object, _
                             ByVal e As System.EventArgs)
  ' Click-Ereignis des Button-Arrays auswerten
    Dim itemClicked As Button = CType(sender, Button)
    Dim index As Integer = -1I
  
    ' Das betroffene Element im Array suchen (allgemein);
    ' Möglich wäre etwa auch das Vorgehen über die eigens
    ' zugewiesene Name-Eigenschaft des Buttons.
    For i As Integer = LBound(btnArray) To UBound(btnArray)
      If btnArray(i) Is itemClicked Then
        index = i
        Exit For
      End If
    Next
  
    If index > 0 Then ' Element im Array gefunden (sonst index = -1)
      ' Kurze Informations-MessageBox für das Codebeispiel
      MessageBox.Show("Sie haben den Button Nr. " & CStr(index) & " angeklickt", _
                      "Index des Buttons ermittelt", _
                      MessageBoxButtons.OK, _
                      MessageBoxIcon.Information)
    End If
  
  End Sub
  
End Class