VB.NET Button zur Laufzeit erstellen
Inhaltsverzeichnis
VB.NET Button zur Laufzeit erstellen
In VB.NET einen Button zur Laufzeit erstellen kann als Anfänger schwierig sein, muss es mit meinem Beispiel jedoch nicht!
Ich werde Dir unter Anderem zeigen, wie wir die AddHandler-Anweisung dazu verwenden.
Zusätzlich benötigen wir den AddressOf-Operator, um an die jeweilige Adresse der Ziel-Methode zu kommen.
VB.NET Button Beispiel – Allgemein
Falls Du Dich bisher noch nicht allzu tiefgehend mit dem Button beschäftigt hast, empfehle ich Dir mein allgemeines Button Beispiel.
In diesem Beitrag erkläre ich alle Dir alles Wissenwerte über das Button-Control, wie z. B. Eigenschaften, Methoden und dessen Funktionsweise.
Der heutige Beitrag handelt hingegen von einem Thema, auf das man eher später – aber definitiv – stößt.
Normalerweise designt man seine Oberfläche ja für gewöhnlich in der dafür vorgesehenen Designer-Oberfläche, aber manchmal reicht dies nicht aus.
Der Button – Eine kleine Wiederholung
Unendliche Einsatzmöglichkeiten
Wie Du in meinem anderen Beitrag schon erfahren konntest, ist der Button so ziemlich eines der absoluten Basic-Controls.
Die Nutzungsmöglichkeiten sind schier unendlich:
- Zum Drucken von Rechnungen
- Öffnen eines Detail-Fensters
- Das ausführen einer Suche
- Bearbeitete Daten zu speichern
- und viel viel mehr!
Das Click-Ereignis
Wenn Du Dich noch erinnern kannst, bzw. es vielleicht noch weißt, brauchen wir für die Verwendung des Buttons im Wesentlichen das wichtigste Ereignis: Das Click-Ereignis.
Verschiedene Button-Zustände
Auch mehr als bekannt, sind die verschiedenen Zustände, die der Button für gewöhnlich einnehmen kann.
Darunter sind wohl die gängigsten States, der „Hover„, „Disabled“ und „Loading“ State.
Etwas abwegiger, jedoch ein moderner Augenschmaus sind vor allem aus „Material-Design“ orientierten Steuerelementen bekannt, ist z. B. der „Ripple„-Effekt.
Wie der Name schon sagt eher ein Effekt und kein State, aber dennoch sehr gängig.
VB.NET Button zur Laufzeit erstellen
Im Laufe Deiner Visual Basic .NET Karriere, kann es durchaus vorkommen, dass Du einen Button auch mal zur Laufzeit erstellen möchtest, bzw. musst.
Ein konkreter mir einfallender Anwendungsfall wäre z. B. die dynamische Erstellung einer virtuellen Tastatur.
Stell Dir vor, Du schaltest in der virtuellen Tastatur auf einen anderen Modus – man kennt es z. B. von Handytastaturen.
Dann könntest Du die vorhandenen Buttons durch andere Buttons dynamisch ersetzen.
Auf Form-Ebene
Den Button auf Form-Ebene zu erstellen ist praktisch analog zum Weg über den Designer, jedoch eben nur pur Code-Datei basiert.
Der Code der Form
Konstruktor
Im Form-Konstruktor initialisieren wir den Button mit einer neuen Instanz.
Wir könnten dies auch alternativ auch im Load-Ereignis machen, allerdings macht es im Konstruktor für mich persönlich mehr Sinn.
Im Konstruktor wird – wer hätte das gedacht – konstruiert, primär die Form, aber auch all das was dazu gehört.
Darunter fallen natürlich auch die Kind-Elemente, zumindest wenn keine Dependency Injection o. Ä. verwendet wird..
Die letzte Zeile erkläre ich hier, im Teil der „WithoutHandlesClause„-Methode
WithHandlesClause – Click-Eventhandler
Diese Sub ist wie üblich via Handles-Klausel verknüpft, das geht deshalb, weil wir den Button auf Form-Ebene und mit WithEvents deklariert haben.
WithoutHandlesClause – Click-Eventhandler
Diese Methode wird dynamisch durch die AddHandler-Anweisung im Konstruktor mit dem Click-Event des Timers verknüpft.
Diese Vorgehensweise ist praktisch das Kernelement des ersten Beispiels.
Imports System.Diagnostics Public Class Form1 Private WithEvents Button As Button Sub New() InitializeComponent() Button = New Button() AddHandler Button.Click, AddressOf WithoutHandlesClause End Sub Private Sub WithHandlesClause(sender As Object, e As EventArgs) Handles Button.Click Debug.WriteLine("WithHandlesClause") End Sub Private Sub WithoutHandlesClause(sender As Object, e As EventArgs) Debug.WriteLine("WithoutHandlesClause") End Sub End Class
Durch Button-Click
Hier zeige ich, wie man einen Button durch das Klicken eines weiteren Buttons erstellen kann.
Ebenso wie im vorherigen Beispiel, greife ich hier auf eine bereits existierende Methode in der Form zurück.
Wir instanziieren zuerst einen neuen Button, weisen Ihm anschließend einige Eigenschaften zu und fügen Ihn dann zur Darstellung der Form hinzu.
Private Sub btnCreateButton_Click(sender As Object, e As EventArgs) Dim button = new Button() button.Location = new Point(50, 80) button.Height = 23 button.Width = 75 button.Text = "Dynamic woohoo" AddHandler button.Click, AddressOf MyClick Controls.Add(button) End Sub Private Sub MyClick(sender As Object, e As EventArgs) System.Diagnostics.Debug.WriteLine("MyClick") End Sub
VB.NET Button zur Laufzeit erstellen – Mit anonymen Handler
Im letzten Beispiel zeige ich Dir eine Vorgehensweise mit einer anonymen Handler-Methode.
Natürlich musst Du auch hier auf die korrekte Signatur der Methode, also der korrekten Anzahl und der richtigen Positionierung der Parameter achten.
Mit anonymer Sub
In diesem Fall brauchst Du den AddressOf-Operator nicht, da Du die Methode ja namentlich nennen und somit an Ihre „Adresse“ kommen kannst.
Private Sub btnCreateButton_Click(sender As Object, e As EventArgs) Dim button = new Button() button.Location = new Point(50, 80) button.Height = 23 button.Width = 75 button.Text = "Dynamic woohoo" AddHandler button.Click, Sub(sender, e) Debug.WriteLine("anonymous") End Sub Controls.Add(button) End Sub
Mit anonymer Sub und Variable
Du hast sogar die Möglichkeit, diesen Handler in eine Variable zu stecken, bzw. zu speichern und dann via AddHandler zuzuweisen:
Private Sub btnCreateButton_Click(sender As Object, e As EventArgs) Dim button = new Button() button.Location = new Point(50, 80) button.Height = 23 button.Width = 75 button.Text = "Dynamic woohoo" Dim dynamicCreatedHandler = Sub(sender, e) Debug.WriteLine("anonymous") End Sub AddHandler button.Click, dynamicCreatedHandler Controls.Add(button) End Sub