<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>automatisiert Archive - Robert Skibbe</title>
	<atom:link href="https://robbelroot.de/blog/tag/automatisiert/feed/" rel="self" type="application/rss+xml" />
	<link></link>
	<description>alias RobbelRoot – Freelance Full Stack Developer .NET</description>
	<lastBuildDate>Thu, 09 Jun 2022 11:04:19 +0000</lastBuildDate>
	<language>de</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.9.4</generator>

<image>
	<url>https://robbelroot.de/wp-content/uploads/2020/12/cropped-favicon-32x32.png</url>
	<title>automatisiert Archive - Robert Skibbe</title>
	<link></link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>VB NET Formular automatisch ausfüllen (Winforms)</title>
		<link>https://robbelroot.de/blog/vbnet-formular-automatisch-ausfuellen-winforms/</link>
					<comments>https://robbelroot.de/blog/vbnet-formular-automatisch-ausfuellen-winforms/#comments</comments>
		
		<dc:creator><![CDATA[Robert Skibbe]]></dc:creator>
		<pubDate>Wed, 15 Dec 2021 17:40:57 +0000</pubDate>
				<category><![CDATA[Allgemein]]></category>
		<category><![CDATA[Tutorials]]></category>
		<category><![CDATA[Visual Basic .NET]]></category>
		<category><![CDATA[Visual Basic .NET Problemlösungen]]></category>
		<category><![CDATA[ausfüllen]]></category>
		<category><![CDATA[automation]]></category>
		<category><![CDATA[automatisch]]></category>
		<category><![CDATA[automatisiert]]></category>
		<category><![CDATA[automatisierung]]></category>
		<category><![CDATA[complete]]></category>
		<category><![CDATA[fill]]></category>
		<category><![CDATA[form]]></category>
		<category><![CDATA[formular]]></category>
		<category><![CDATA[kompletieren]]></category>
		<category><![CDATA[set]]></category>
		<category><![CDATA[setzen]]></category>
		<category><![CDATA[string]]></category>
		<category><![CDATA[text]]></category>
		<category><![CDATA[textbox]]></category>
		<category><![CDATA[texte]]></category>
		<category><![CDATA[vb.net]]></category>
		<category><![CDATA[vbnet]]></category>
		<category><![CDATA[vervollständigen]]></category>
		<category><![CDATA[windows]]></category>
		<guid isPermaLink="false">https://robbelroot.de/?p=6744</guid>

					<description><![CDATA[<p>VB.NET Formulare automatisch ausfüllen! Ein VB NET Formular automatisch ausfüllen zu lassen wäre vermutlich für jeden &#8222;Windows Forms&#8220; 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 &#8230;</p>
<p>Der Beitrag <a href="https://robbelroot.de/blog/vbnet-formular-automatisch-ausfuellen-winforms/">VB NET Formular automatisch ausfüllen (Winforms)</a> erschien zuerst auf <a href="https://robbelroot.de">Robert Skibbe</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<figure class="wp-block-image size-full"><a href="https://robbelroot.de/wp-content/uploads/2021/12/VB.NET-Formular-automatisch-ausfuellen.png"><img fetchpriority="high" decoding="async" width="1200" height="628" src="https://robbelroot.de/wp-content/uploads/2021/12/VB.NET-Formular-automatisch-ausfuellen.png" alt="VB.NET Form automatisch ausfüllen" class="wp-image-6747" title="VB.NET Form automatisch ausfüllen"/></a><figcaption>VB.NET Form automatisch ausfüllen</figcaption></figure>






<h2 class="wp-block-heading">VB.NET Formulare automatisch ausfüllen!</h2>



<p>Ein <strong>VB NET Formular automatisch ausfüllen zu lassen</strong> wäre vermutlich für jeden &#8222;Windows Forms&#8220; 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.</p>



<h3 class="wp-block-heading">Wie es meistens ist..</h3>



<p>Am besten wäre es natürlich, wenn man dem Formular direkt sagen könnte: &#8222;Hey, die Daten findest Du dort&#8220;. Mit modernen Mitteln wie in der WPF (Windows Presentation Foundation) ist dies durch Datenbindung eine gängige und vor allem einfache Praxis.</p>



<p>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.</p>



<h3 class="wp-block-heading">Monkey Work – ney, Automatisierung – yay!</h3>



<p>Dort sieht es dann entgegengesetzt jeglicher Automatisierung eher so aus:</p>



<pre class="EnlighterJSRAW" data-enlighter-language="visualbasic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">TextBox1.Text = "..."
TextBox2.Text = "..."
TextBox3.Text = "..."
TextBox4.Text = "..."
' ....</pre>



<p>Eventuell entwickelt man wenigstens einigermaßen sauber und wählt passende Namen für die Textboxen:</p>



<pre class="EnlighterJSRAW" data-enlighter-language="visualbasic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">tbFirstName.Text = "..."
tbLastName.Text = "..."
tbZip.Text = "..."
tbCity.Text = "..."
' ....</pre>



<p>Schon besser, aber 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 &#8222;duplicated Code&#8220; und schon glatt eine Qual, wenn es bei einem Objekt mit 30 Properties heißt: &#8222;Hey, zeige die Daten mal an&#8230;&#8220;.</p>



<figure class="wp-block-image size-full"><a href="https://robbelroot.de/wp-content/uploads/2021/12/VB.NET-Formulare-ausfuellen-Monkey-Work.png"><img decoding="async" width="1200" height="628" src="https://robbelroot.de/wp-content/uploads/2021/12/VB.NET-Formulare-ausfuellen-Monkey-Work.png" alt="VB.NET Formulare ausfüllen Monkey Work" class="wp-image-6750" title="VB.NET Formulare ausfüllen Monkey Work"/></a><figcaption>VB.NET Formulare ausfüllen Monkey Work</figcaption></figure>



<p>Nun ist man an einem Punkt, wo die bekannte Faulheit doch zum Vorteil sein und zu mehr Effizienz beitragen kann. Wie so häufig, haben wir als Entwickler die Möglichkeit uns gewisse (und vor allem wiederkehrende Aufgaben) zu vereinfachen. Not macht erfinderisch, richtig?</p>



<h3 class="wp-block-heading">An die Zukunft denken</h3>



<p>Je nachdem wie viel Planung und anschließenden Zeitaufwand man bereit ist zu investieren (nicht opfern!), wird die bevorstehende Arbeit beeinflussen. Man sollte meiner Meinung nach jedoch immer eins im Hinterkopf behalten: &#8222;Think twice, code once&#8220;! Leider arbeiten viele Entwickler auch gerne nach dem &#8222;Copy &amp; Paste&#8220;-Prinzip, zur Not auch projektübergreifend.</p>



<p>Statt hier zukunftsorientiert zu denken, werden Aufgaben häufig nur akut und schnell gelöst. 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.</p>



<h2 class="wp-block-heading">Herangehensweise – VB NET Formular automatisch ausfüllen</h2>



<p>Im nächsten Schritt machen wir uns einmal ein paar Gedanken bezüglich der Herangehensweise, die (Windows Forms)-Formulare automatisiert(er) auszufüllen. Auch wenn wir hier vermutlich noch keine volle Suite an Mini-Tools generieren werden, wird das meinerseits dargestellte Beispiel als Startschuss dienen können.</p>



<p>Jeder Entwickler im NET Bereich wird wohl immer wieder mal mit den guten alten <a href="https://docs.microsoft.com/de-de/dotnet/api/system.windows.forms.textbox?view=windowsdesktop-6.0" target="_blank" rel="noreferrer noopener"><strong>Textboxen</strong></a> zu tun haben. Ich denke, dass dieses Steuerelement daher auch die erste zu bearbeitende Anlaufstelle sein sollte. Wenn man hingegen an <a href="https://docs.microsoft.com/de-de/dotnet/api/system.windows.forms.checkbox?view=windowsdesktop-6.0" target="_blank" rel="noreferrer noopener"><strong>Checkboxen</strong></a>, <a href="https://docs.microsoft.com/de-de/dotnet/api/system.windows.forms.listbox?view=windowsdesktop-6.0" target="_blank" rel="noreferrer noopener"><strong>Listboxen</strong></a> und an die anderen Steuerelemente denkt, könnte es schon ein wenig komplexer werden.</p>



<p>Vielleicht werde ich dafür dann noch einmal einen getrennten Beitrag in Zukunft erstellen. Schauen wir einmal, wo mich die Beitrags-Reise, bzw. meine Schreib-Lust heute hinführt &#x1f609;.</p>



<h3 class="wp-block-heading">Konkreter Ablauf</h3>



<p>Wenn man sauber vorgeht, sollte man die Daten natürlich in irgendeiner sinnvollen Form vorliegen haben. Nach Möglichkeit gibt es hier also nicht z. B. 15 verschiedene Variablen, Welche dann im schlimmsten Fall noch &#8222;string1, string2, usw.&#8220; heißen. Wir wollen ja im besten Fall mit relativ fest definierten Mustern arbeiten, um unsere Arbeit so einfach wie möglich zu gestalten.</p>



<p>Ich stelle mir einerseits eine bereits definierte Klasse als Daten-Container vor, andererseits könnte es sich auch um analog zugreifbare Daten wie bei einer DataRow handeln. Den konkreten Ablauf würde man  kurz und knapp vielleicht so beschreiben: &#8222;Nimm dieses Ding hier und packe dessen Eigenschafts-Werte in die passenden Steuerelemente&#8220;.</p>



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



<pre class="wp-block-code"><code>Für jede Eigenschaft im Objekt, finde die passende Textbox, trage den passenden Wert ein..</code></pre>



<p>oder..</p>



<pre class="wp-block-code"><code>Für jede/s Textbox/Steuerelement auf dem Formular, finde im Ziel-Objekt die passende Eigenschaft und befülle Diese.</code></pre>



<p>Eventuell könnte man hier auch noch für die Performance mit irgendeiner Art Cache arbeiten, oder je nach Situation die &#8222;Strategie&#8220; (Anspielung Strategy-Pattern&#8230;) ändern. Ich werde es hier allerdings nicht weiter als nötig verkomplizieren, da dieses Beispiel nur als Inspiration dienen soll.</p>



<h2 class="wp-block-heading">Code – VB NET Formular automatisch ausfüllen</h2>



<figure class="wp-block-image size-full"><a href="https://robbelroot.de/wp-content/uploads/2021/12/VB.NET-Formular-automatisch-ausfuellen-mit-Kundendaten.png"><img decoding="async" width="1200" height="628" src="https://robbelroot.de/wp-content/uploads/2021/12/VB.NET-Formular-automatisch-ausfuellen-mit-Kundendaten.png" alt="VB.NET Formular automatisch ausfüllen mit Kundendaten" class="wp-image-6786" title="VB.NET Formular automatisch ausfüllen mit Kundendaten"/></a><figcaption>VB.NET Formular automatisch ausfüllen mit Kundendaten</figcaption></figure>



<p>Nachdem wir die Herangehensweise ein wenig durch Pseudocode dargestellt 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. Alternativ könnte man natürlich auch eine getrennte Klassenbibliothek, ein NuGet-Paket, o. Ä. erstellen.</p>



<p>Mit gewissen neuen aus C# bekannten Features könnte man auch vielleicht in Visual Basic eine &#8222;Trait&#8220; ähnelnde Verwendungsweise realisieren. Wie bekannt ist, ist Komposition ja zumeist besser, als Vererbung (Stichwort: &#8222;composition over inheritance&#8220;). &#8222;Traits&#8220; kennt man zum Beispiel allzu gut aus der Web-Programmiersprache namens PHP, aber dazu vielleicht in einem anderen Beitrag mehr.</p>



<h3 class="wp-block-heading">Das Modul</h3>



<p>Erstelle nun im ersten Schritt ein neues Modul namens (z. B.) &#8222;modExtensions&#8220; – auch hier verwende ich gerne eine kleine Konvention. Ich halte mich immer an ähnliche Bezeichnungen / Präfixe, wie z. B. &#8222;tb&#8220; für eine Textbox, &#8222;cbb&#8220; für eine Combobox, etc. Welchen Sinn das dann eventuell haben kann / wird, sehen wir unter anderem (und besonders) im heutigen Beitrag!</p>



<p>Da wir schon analog zum Modul geplant haben, eine <a href="https://docs.microsoft.com/de-de/dotnet/visual-basic/programming-guide/language-features/procedures/extension-methods" target="_blank" rel="noreferrer noopener"><strong>Erweiterungsmethode</strong></a> zu verwenden, importieren wir direkt den &#8222;System.Runtime.CompilerServices&#8220;-Namespace.</p>



<h3 class="wp-block-heading">Eine Fill-Methode – VB NET Formular automatisch ausfüllen</h3>



<p>Durch den Import des zuvor genannten Namespaces, können wir dann das &#8222;Extension&#8220;-Attribut verwenden und unsere Methode namens z. B. &#8222;Fill&#8220; damit bestücken.</p>



<p>Als nächstes definieren wir die beiden benötigten Parameter:</p>



<ul class="wp-block-list"><li>Die <strong>Form</strong>, bzw. dessen Steuerelemente, <strong>Welche befüllt werden sollen</strong></li><li>Das <strong>Objekt</strong>, also eine jeweilige Instanz eines x-beliebigen Typs, <strong>Welches </strong>die <strong>Daten beinhaltet</strong></li></ul>



<pre class="EnlighterJSRAW" data-enlighter-language="visualbasic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">Imports System.Runtime.CompilerServices

Module modExtensions

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

End Module</pre>



<p>Danach erfassen wir die Textboxen aus der &#8222;Controls&#8220;-Auflistung des Formulars, damit wir Diese anschließend verwenden können. Praktisch im gleichen Schritt, ziehen wir uns einfach auch direkt die Eigenschaften (Definitionen) des Daten-Objekts.</p>



<p>Das geht relativ einfach, also wie folgt:</p>



<pre class="EnlighterJSRAW" data-enlighter-language="visualbasic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">Dim textBoxes = frm.Controls.OfType(Of TextBox)
Dim properties = obj.GetType().GetProperties()</pre>



<p>Danach können wir die eben abgerufenen Textboxen einfach in einer &#8222;For Each&#8220;-Schleife durchlaufen und dann mit dem Befüllen der Eigenschaften beginnen. Im ersten Teil der Schleife prüfen wir, ob die jeweilige Textbox mit dem korrekten Prefix &#8222;tb&#8220; betitelt wurde. Wir halten uns also an eine kleine, von uns festgelegte Konvention. Vielleicht sollte man dies auch durch ein eigenes Attribut konfigurierbar machen, jedoch verzichten wir der Einfachheit halber aktuell darauf. Falls die Textbox nicht mit &#8222;tb&#8220; beginnt, ignorieren wir Sie aktuell einfach, sprich die Schleife springt in den nächsten Durchlauf.</p>



<pre class="EnlighterJSRAW" data-enlighter-language="visualbasic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">Dim wrongPrefix = Not tb.Name.StartsWith("tb")
If wrongPrefix Then
    Continue For
End If</pre>



<p>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 <a href="https://docs.microsoft.com/de-de/dotnet/api/system.string?view=net-6.0" target="_blank" rel="noreferrer noopener">String</a> handelt.</p>



<pre class="EnlighterJSRAW" data-enlighter-language="visualbasic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">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</pre>



<p>Der letzte und wichtigste Part – also nach dem Motto &#8222;das Beste kommt zum Schluss&#8220; – ist, die Text-Eigenschaft der Textbox zu setzen:</p>



<pre class="EnlighterJSRAW" data-enlighter-language="visualbasic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">tb.Text = matchingProperty.GetValue(obj).ToString()</pre>



<p>Dazu verwenden wir die <strong><a href="https://docs.microsoft.com/de-de/dotnet/api/system.reflection.propertyinfo.getvalue?view=net-6.0" target="_blank" rel="noreferrer noopener">&#8222;GetValue&#8220;-Funktion</a></strong> der &#8222;PropertyInfo&#8220;-Klasse, um an den hinterlegten Wert der Eigenschaft zu kommen.</p>



<h2 class="wp-block-heading">Kompletter Code</h2>



<p>Wie immer fasse ich hier am Ende des Beitrages den kompletten Code zusammen.</p>



<pre class="EnlighterJSRAW" data-enlighter-language="visualbasic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="VB.NET" data-enlighter-group="kompletter-code">Imports System.Runtime.CompilerServices

Module modExtensions

    &lt;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
</pre>



<pre class="EnlighterJSRAW" data-enlighter-language="csharp" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="C#" data-enlighter-group="kompletter-code">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);
        }
    }
}
</pre>



<h2 class="wp-block-heading">Weiterführende Links</h2>



<ul class="wp-block-list"><li><strong><a href="https://robbelroot.de/blog/mvvm-csharp/" target="_blank" rel="noreferrer noopener">MVVM – Model View ViewModel</a></strong> (Wissen auch für VB geeignet)</li><li><a href="https://robbelroot.de/blog/mahapps-metro-projekt-aufsetzen/" target="_blank" rel="noreferrer noopener"><strong>Mahapps Metro Projekt aufsetzen</strong></a></li><li><strong><a href="https://robbelroot.de/blog/vbnet-await/" target="_blank" rel="noreferrer noopener">Asynchrone Programmierung</a></strong></li></ul>



<h2 class="wp-block-heading">Downloads</h2>



<div class="wp-block-buttons is-layout-flex wp-block-buttons-is-layout-flex">
<div class="wp-block-button"><a class="wp-block-button__link" href="/downloads/vbnet/AutoFillForm.zip" target="_blank" rel="noreferrer noopener">AutoFillFormVB.zip</a></div>



<div class="wp-block-button"><a class="wp-block-button__link" href="/downloads/vbnet/AutoFillFormCS.zip" target="_blank" rel="noreferrer noopener">AutoFillFormCS.zip</a></div>
</div>
<p>Der Beitrag <a href="https://robbelroot.de/blog/vbnet-formular-automatisch-ausfuellen-winforms/">VB NET Formular automatisch ausfüllen (Winforms)</a> erschien zuerst auf <a href="https://robbelroot.de">Robert Skibbe</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://robbelroot.de/blog/vbnet-formular-automatisch-ausfuellen-winforms/feed/</wfw:commentRss>
			<slash:comments>3</slash:comments>
		
		
			</item>
	</channel>
</rss>
