VB NET Formular automatisch ausfüllen (Winforms)

VB.NET Form automatisch ausfüllen
VB.NET Form automatisch ausfüllen

VB.NET Formulare automatisch ausfüllen – yay!

Ein VB NET Formular automatisch ausfüllen zu lassen wäre vermutlich für jeden „Windows Forms“ geprägten Entwickler eine Erleichterung.

Man designt die Form seiner Wahl und möchte natürlich bei Aufruf die notwendigen Daten anzeigen.

Besonders beim Flow aus diversen Suchmasken heraus ist es normal, dass man eine Detail-Ansicht mit entsprechenden Daten aufruft.

Wie es meistens ist..

Am besten wäre natürlich, wenn man dem Formular direkt sagen könnte: „Hey, die Daten findest Du dort.“.

Mit modernen Mitteln wie in der WPF (Windows Presentation Foundation) ist dies durch Datenbindung eine gängige und vor allem einfache Praxis.

Dort findet man durch die saubere Trennung zwischen GUI und Daten eine simple und direkt in XAML implementierte Möglichkeit.

In den guten alten Winforms findet man jedoch seltenst (jedenfalls aus meiner Erfahrung gesprochen) datengebundene Steuerelemente.

Monkey Work – ney, Automatisierung – yay!

Dort sieht es dann entgegengesetzt jeglicher Automatisierung dann eher so aus:

TextBox1.Text = "..."
TextBox2.Text = "..."
TextBox3.Text = "..."
TextBox4.Text = "..."
' ....

Natürlich kann man sich schon vorstellen, dass dies nicht unbedingt „das Gelbe vom Ei“ ist.

Man wird auf diverse Probleme, bzw. Monkey-Work stoßen, Welche für Wartung und Co. nicht gerade vorteilhaft sind.

Tonnenweise duplicated Code“ und schon glatt eine Qual, wenn es bei einem Objekt mit 30 Properties heißt: „Hey, zeige die Daten mal an..“.

VB.NET Formulare ausfüllen Monkey Work
VB.NET Formulare ausfüllen Monkey Work

Wie so häufig, haben wir als Entwickler die Möglichkeit uns gewisse (und vor allem wiederkehrende Aufgaben) zu vereinfachen.

An die Zukunft denken

Je nachdem wie viel Planung und anschließenden Zeitaufwand man bereit ist zu investieren (nicht opfern!), kann die bevorstehende Arbeit variieren.

Man sollte meiner meiner Meinung nach jedoch immer eins im Hinterkopf behalten: „Think twice, code once„!

Auch wenn die Erledigung einiger Aufgaben ggf. am Anfang nervig und zeitaufwendig sind, können Sie einem später unfassbar viel Zeit ersparen.

Dies gilt natürlich nicht nur für das aktuelle Projekt, sondern vermutlich auch noch für später anstehende Projekte und Problemstellungen.

Herangehensweise – VB NET Formular automatisch ausfüllen

Im nächsten Schritt machen wir uns mal ein paar Gedanken bezüglich der Herangehensweise, Fomulare automatisch (er) auszufüllen.

Auch wenn wir mit Sicherheit hier noch keine volle Suite an Mini-Tools generieren werden, reicht denke ich schon ein simples Beispiel aus.

Jeder Entwickler im NET Bereich wird wohl immer wieder mit den guten alten Textboxen zu tun haben.

Daher ist dieses Steuerelement auch die erste zu bearbeitende Anlaufstelle, Welche wir angehen werden.

Wenn man hingegen an Checkboxen und vielleicht sogar Listboxen denkt, könnte es schon ein wenig komplexer werden.

Vielleicht werde ich dafür dann noch einmal einen getrennten Beitrag in Zukunft erstellen.

Konkreter Ablauf

Einen konkreten Ablauf könnte man ja einfacherweise so beschreiben: „Nimm dieses Objekt und packe dessen Eigenschafts-Werte in die passenden Textboxen“.

Dabei könnte man entweder ausgehend vom Objekt, oder von der jeweiligen Form arbeiten, also Pseudocode mäßig so:

Für jede Eigenschaft im Objekt, finde die passende Textbox, trage ein..

oder..

Für jede/s Textbox/Steuerelement auf dem Formular, finde im Ziel-Objekt die passende Eigenschaft, fülle aus.

Eventuell könnte man hier auch noch Performance mäßig mit irgendeine Art Cache arbeiten, oder je nach Situation die „Strategie“ ändern.

Ich werde es hier allerdings nicht weiter als nötig verkomplizieren, da dieses Beispiel nur als Inspiration dienen soll.

Code – VB NET Formular automatisch ausfüllen

VB.NET Formular automatisch ausfüllen mit Kundendaten
VB.NET Formular automatisch ausfüllen mit Kundendaten

Nachdem wir die Herangehensweise hier drüber ein wenig beleuchtet haben, starten wir auch direkt in den Code.

Ich werde auf jeden Fall ein Modul verwenden, damit man den Code auch einfach für andere Projekte wiederverwenden kann.

Mit gewissen neuen aus C# bekannten Features könnte man auch vielleicht in Visual Basic eine „Traitähnelnde Verwendungsweise realisieren.

Traitskennt man zum Beispiel allzu gut aus der Web-Programmiersprache namens PHP, aber dazu vielleicht in einem anderen Beitrag mehr.

Das Modul

Erstelle also im ersten Schritt ein neues Modul namens (z. B.) „modExtensions“ – auch hier verwende ich gerne eine kleine Konvention.

Ich halte mich also immer an ähnliche Bezeichnungen/Prefixes wie z. B. „tb“ für eine Textbox, „cbb“ für eine Combobox, etc.

Welchen Sinn das dann eventuell haben wird/kann, sehen wir besonders (und unter Anderem) im heutigen Beitrag!

Da wir schon geplant haben eine Erweiterungsmethode zu verwenden, importieren wir direkt den „System.Runtime.CompilerServices“-Namespace.

Die Fill-Methode – VB NET Formular automatisch ausfüllen

Damit können wir dann das „Extension„-Attribut verwenden und unsere Methode namens z. B. Fill damit „dekorieren„.

Als nächstes definieren wir die beiden definitiv benötigten Parameter:

  • Die Form, bzw. dessen Steuerelemente, Welche befüllt werden sollen
  • Das Objekt, also eine jeweilige Instanz eines x-beliebigen Typs, Welches die Daten beinhaltet
Imports System.Runtime.CompilerServices

Module modExtensions

    <Extension()>
    Public Sub Fill(frm As Form, obj As Object)
        ' ...
    End Sub

End Module

Danach ziehen wir uns die Textboxen aus der „Controls“-Auflistung des Formulars.

Praktisch „im gleichen Schritt“ ziehen wir uns einfach auch direkt die Eigenschaften (Definitionen) des DatenObjekts.

Das geht relativ einfach, also wie folgt:

Dim textBoxes = frm.Controls.OfType(Of TextBox)
Dim properties = obj.GetType().GetProperties()

Danach können wir die gerade abgerufenen Textboxen einfach in einer „For Each“-Schleife durchlaufen und dann mit dem Füllen beginnen.

Im ersten Part der Schleife prüfen wir, ob die jeweilige Textbox mit dem korrekten Prefix „tb“ benannt wurde.

Falls dies nicht der Fall ist, ignorieren wir die Textbox aktuell einfach, sprich die Schleife springt in den nächsten Durchlauf.

Dim wrongPrefix = Not tb.Name.StartsWith("tb")
If wrongPrefix Then
    Continue For
End If

Der darauf folgende Teil prüft, ob wir eine Eigenschaft mit passendem Namen zur Textbox finden können.

Ebenso checken wir, ob der Typ zur Textbox passt, es sich dabei also um einen String handelt.

Dim nameWithoutPrefix = tb.Name.Substring(2)
Dim matchingProperty = properties.SingleOrDefault(Function(x) x.Name = nameWithoutPrefix)
If matchingProperty Is Nothing OrElse matchingProperty.PropertyType IsNot GetType(String) Then
    Continue For
End If

Der letzte und wichtigste Part – also nach dem Motto „das Beste kommt zum Schluss“ – wird der Text der Textbox gesetzt:

tb.Text = matchingProperty.GetValue(obj).ToString()

Dazu verwenden wir die „GetValue“-Funktion der „PropertyInfo“-Klasse, um an den hinterlegten Wert der Eigenschaft zu kommen.

Kompletter Code

Wie immer fasse ich hier am Ende des Beitrages den kompletten Code zusammen.

Imports System.Runtime.CompilerServices

Module modExtensions

    <Extension()>
    Public Sub Fill(frm As Form, obj As Object)
        Dim textBoxes = frm.Controls.OfType(Of TextBox)
        Dim properties = obj.GetType().GetProperties()

        For Each tb In textBoxes

            Dim wrongPrefix = Not tb.Name.StartsWith("tb")
            If wrongPrefix Then
                Continue For
            End If

            Dim nameWithoutPrefix = tb.Name.Substring(2)
            Dim matchingProperty = properties.SingleOrDefault(Function(x) x.Name = nameWithoutPrefix)
            If matchingProperty Is Nothing OrElse matchingProperty.PropertyType IsNot GetType(String) Then
                Continue For
            End If

            tb.Text = matchingProperty.GetValue(obj).ToString()
        Next
    End Sub

End Module
using System;
using System.Windows.Forms;

namespace AutoFillFormCS
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void btnAutoFill_Click(object sender, EventArgs e)
        {
            var customer = new Customer()
            {
                Company = "Nice ltd.",
                FirstName = "Max",
                LastName = "Random",
                Street = "The street",
                HouseNo = "11a"
            };
            this.Fill(customer);
        }
    }
}

Weiterführende Links

Downloads

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.