| Wie durch diese Ausführungen erkannt werden konnte, läuft das Erstellen von Steuerelementen in .NET wesentlich anders und vor allem deutlich flexibler als in früheren Versionen von Visual Basic ab. Wie in allen anderen Punkten, so müssen auch hier die bisherigen Programmierkonzepte gründlich überdacht werden, da die zwei Sprachen auf unterschiedlichen Prinzipien basieren. Eine Eins-zu-eins-Umsetzung von Steuerelementfeldern in Visual Basic 2005 ist deshalb nicht möglich. Der größte Unterschied für den Programmierer besteht darin, dass es keinerlei Unterstützung des Designers für Steuerelementfelder mehr gibt. Auch die Positionierung von Steuerelementen muss deshalb von Hand erfolgen. Die Frage, wie eine Anzahl gleichartiger Steuerelemente erstellt und verwaltet werden, muss außerdem für jeden Fall neu beantwortet werden. Im Folgenden sollen nun einige typische Fälle besprochen werden. Mehrere gleichartige Steuerelemente, die weder Benutzerinteraktion noch späteren Zugriff benötigen, beispielsweise Bezeichnungsfelder, sollen erstellt werden: Hier genügt die einfache Erstellung und Hinzufügung von Steuerelementobjekten wie im ersten Beispiel, meist sogar ohne Zuweisung der Name-Eigenschaft, da kein späterer Zugriff mehr nötig ist. Steuerelemente, auf die nach der Erstellung noch zugegriffen werden muss: Dafür sind die im Framework vorhandenen Containerklassen in den Namensräumen System.Collections.Generic und System.Collections gut geeignet. Sie erlauben sehr flexible Verwaltung, z.B. Hinzufügen und Entfernen von Steuerelementen zu beliebigen Zeitpunkten. Steuerelemente, die auf Benutzerinteraktionen reagieren müssen: Da die Handles-Klausel nur bei einzelnen Objekten, nicht aber bei Containerklassen funktioniert, muss hier auf die oben beschriebene AddHandler-Anweisung zurückgegriffen werden. Das beigelegte Projekt enthält ein komplettes, funktionierendes Beispiel. Der Benutzer kann Steuerelementgruppen, die jeweils aus einem Textfeld und einer Schaltfläche zum Entfernen der Gruppe bestehen, nach Belieben erzeugen und entfernen. Wenn er in die Textfelder Zahlen eingibt, wird die Summe aller dieser Zahlen bestimmt. Eine Containervariable wird nur für die Textfelder angelegt. Damit aus dem Ereignisbehandlungscode der zum Entfernen dienenden Schaltflächen auf das jeweils zugehörige Textfeld zugegriffen werden kann, wird ein Verweis auf dieses in der Tag- Eigenschaft der Schaltflächen gespeichert. Hier der komplette Code: Imports System
Imports System.Collections.Generic
Imports System.Windows.Forms
Public Class Beispiel
Private ReadOnly mEingabefelder As New LinkedList(Of TextBox)
Private Sub Hinzufügen(ByVal sender As Object, ByVal e As EventArgs) Handles btnHinzufügen.Click
Static Position As Integer = 40
Position += 40
Dim Eingabefeld As New TextBox
Eingabefeld.SetBounds(20, Position, 100, 30)
Eingabefeld.Text = "0"
Eingabefeld.TextAlign = HorizontalAlignment.Right
AddHandler Eingabefeld.TextChanged, AddressOf Summieren
mEingabefelder.AddLast(Eingabefeld)
Controls.Add(Eingabefeld)
Dim Schaltfläche As New Button
Schaltfläche.SetBounds(140, Position, 100, 30)
Schaltfläche.Text = "Entfernen"
Schaltfläche.Tag = Eingabefeld
AddHandler Schaltfläche.Click, AddressOf Entfernen
Controls.Add(Schaltfläche)
End Sub
Private Sub Entfernen(ByVal sender As Object, ByVal e As EventArgs)
Dim Schaltfläche As Button = DirectCast(sender, Button)
Dim Eingabefeld As TextBox = DirectCast(Schaltfläche.Tag, TextBox)
Controls.Remove(Eingabefeld)
Controls.Remove(Schaltfläche)
mEingabefelder.Remove(Eingabefeld)
Summieren(sender, e)
End Sub
Private Sub Summieren(ByVal sender As Object, ByVal e As EventArgs)
Dim Summe As Double = 0
For Each Eingabefeld As TextBox In mEingabefelder
Dim Zahl As Double = 0
If Double.TryParse(Eingabefeld.Text, Zahl) Then Summe += Zahl
Next
txtSumme.Text = Summe.ToString()
End Sub
End ClassListing 4: Komplettes Beispiel In diesem sehr einfachen Beispiel werden neu erzeugte Steuerelementgruppen einfach immer weiter unten angehängt; beim Entfernen bleiben die sich darunter befindlichen Gruppen an ihrem Platz, wodurch Lücken entstehen. Bei ernsthaften Anwendungen würde dies selbstverständlich anders geregelt werden, was aber der Funktionalität des Beispiels keinen Abbruch tut. Statt der verketteten Liste können natürlich, je nach Anwendung, andere Containerklassen eingesetzt werden. |