{"id":55000222,"date":"2020-06-01T00:00:00","date_gmt":"2020-09-17T16:35:44","guid":{"rendered":"http:\/\/access-im-unternehmen.aix-dev.de\/aiu\/?p=222"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-30T00:00:00","slug":"Rechnungsverwaltung_Teil_1_Grundlagen","status":"publish","type":"post","link":"https:\/\/vbentwickler.de\/Rechnungsverwaltung_Teil_1_Grundlagen\/","title":{"rendered":"Rechnungsverwaltung, Teil 1: Grundlagen"},"content":{"rendered":"<p><b>Als selbst&auml;ndiger oder freiberuflicher Softwareentwickler braucht man am Ende vor allem eines: eine Anwendung zum Erstellen von Rechnungen. Diese wollen wir im vorliegenden Artikel programmieren &#8211; vom Entwurf des Datenmodells &uuml;ber die Erstellung des Entity Data Models und die Benutzeroberfl&auml;che bis zum Ausdrucken der Rechnung als PDF oder mit dem Drucker.<\/b><\/p>\n<p><b>Funktionen der Rechnungsverwaltung<\/b><\/p>\n<p>Welche Aufgaben wollen wir mit der Rechnungsverwaltung erledigen &#8211; welche Eingangsdaten haben wir, was soll am Ende herauskommen Und welche Funktionen bilden wir dabei mit der Benutzeroberfl&auml;che ab<\/p>\n<p>Wir wollen eine kleine Anwendung bauen, die verschiedene Funktionen &uuml;ber das Ribbon anbietet. Dazu geh&ouml;ren die Verwaltung von Rechnungsempf&auml;ngern und der Rechnungen selbst. F&uuml;r die Rechnungsempf&auml;nger wollen wir eine &Uuml;bersicht der vorhandenen Kunden in Listenform anbieten und ein Fenster zum Anlegen eines neuen Kunden. Die Seite zum Anlegen eines Kunden wollen wir auch f&uuml;r die Detailansicht dieses Kunden nutzen. Praktisch ist dann, wenn wir direkt die Rechnungen, die bisher f&uuml;r diesen Kunden erstellt wurden, in einer Liste in dieser Ansicht anzeigen. Au&szlig;erdem soll das Fenster jeweils eine Schaltfl&auml;che zum Anlegen einer neuen Rechnung enthalten und eine zum Ausdrucken einer markierten Rechnung.<\/p>\n<p>F&uuml;r die Rechnungen wollen wir ebenfalls ein eigenes Fenster vorsehen. Dieses enth&auml;lt Steuer-elemente zur Eingabe der allgemeinen Daten einer Rechnung, also Rechnungsdatum, Rechnungsbetreff, Rechnungstext und Rechnungsuntertext. Au&szlig;erdem soll ein Listensteuerelement alle Rechnungspositionen mit Bezeichnung, Nettobetrag, Menge und Mehrwertsteuersatz anzeigen.<\/p>\n<p>Schlie&szlig;lich fehlt noch die Ausgabe der Rechnung &#8211; diese wollen wir &uuml;ber ein FlowDocument realisieren, das in einem entsprechenden Steuer-element in einem eigenen Fenster angezeigt wird und ausgedruckt oder als PDF gespeichert werden kann.<\/p>\n<p><b>Datenmodell der Anwendung<\/b><\/p>\n<p>Das Datenmodell haben wir, wenn wir schon im Artikel <b>Access zu EDM: Dateien erstellen <\/b>(<b>www.datenbankentwickler.net\/219<\/b>) eine kleine Funktion zum Erstellen eines Entity Data Models programmiert haben, schnell mit Access definiert (siehe Bild 1). Wir verwenden eine Tabelle namens <b>tblKunden<\/b>, welche die &uuml;blichen Kundendaten enth&auml;lt. Die Anreden speichern wir in einer eigenen Tabelle namens <b>tblAnreden<\/b>, die von der Tabelle <b>tblKunden <\/b>aus &uuml;ber das Feld <b>AnredeID <\/b>referenziert wird. Die grundlegenden Rechnungsdaten speichern wir in der Tabelle <b>tblRechnungen<\/b>. Hier finden Sie das Rechnungsdatum und die &uuml;brigen Informationen, die in der Rechnung rund um die Auflistung der Rechnungspositionen abgebildet werden. Au&szlig;erdem enth&auml;lt die Rechnungstabelle ein Fremdschl&uuml;sselfeld namens <b>KundeID<\/b>, mit dem der Kunde zur jeweiligen Rechnung festgelegt wird. Schlie&szlig;lich folgen noch die Rechnungspositionen in der Tabelle <b>tblRechnungspositionen<\/b>. Die einzelnen Positionen sind &uuml;ber das Feld <b>RechnungID <\/b>mit der Tabelle <b>tblRechnungen <\/b>verkn&uuml;pft.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2020_03\/pic_222_001.png\" alt=\"Datenmodell der Rechnungsverwaltung\" width=\"649,559\" height=\"270,5165\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 1: Datenmodell der Rechnungsverwaltung<\/span><\/b><\/p>\n<p>Achtung: Damit das nachfolgende Erstellen des Entity Data Models funktioniert, m&uuml;ssen die Prim&auml;rschl&uuml;sselfelder die Entit&auml;t im Namen enthalten, bei <b>Kunde <\/b>also beispielsweise <b>KundeID<\/b>.<\/p>\n<p><b>Entity Data Model erstellen<\/b><\/p>\n<p>Mit dem folgenden Aufruf der Funktion <b>EDMDateienErstellen <\/b>legen wir im Unterverzeichnis <b>RechnungsverwaltungContext <\/b>der Access-Datenbank einige Verzeichnisse und Dateien an, die wir gleich im Anschluss weiterverarbeiten:<\/p>\n<pre>EDMDateienErstellen False, \"RechnungsverwaltungContext\", \"DataModel\", True, <span style=\"color:blue;\">True<\/span><\/pre>\n<p>Zuvor erstellen wir noch ein neues Visual Studio-Projekt mit der Vorlage <b>Visual Basic|Windows Desktop|WPF-App<\/b> namens <b>Rechnungsverwaltung<\/b>.<\/p>\n<p>Nun &ouml;ffnen wir mit dem Kontextmen&uuml;-Eintrag <b>Hinzuf&uuml;gen|Neues Element&#8230; <\/b>des Projekt-Elements im Projektmappen-Explorer den Dialog <b>Neues Element hinzuf&uuml;gen<\/b>, w&auml;hlen dort das Element <b>ADO.NET Entity Data Model <\/b>aus und geben daf&uuml;r den Namen <b>RechnungsverwaltungContext <\/b>ein.<\/p>\n<p>Im folgenden Schritt w&auml;hlen wir den Eintrag <b>Leeres Code First-Modell <\/b>aus (siehe Bild 2).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2020_03\/pic_222_002.png\" alt=\"Typ des Modells ausw&auml;hlen\" width=\"599,593\" height=\"363,4485\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 2: Typ des Modells ausw&auml;hlen<\/span><\/b><\/p>\n<p>Danach ziehen Sie den Inhalt aus dem soeben von Access aus erstellten Ordner <b>RechnungsverwaltungContext <\/b>(alle enthaltenen Elemente, nicht den Ordner selbst) auf das Projekt-Element <b>Rechnungsverwaltung<\/b>. Dies ersetzt die Datei <b>RechnungsverwaltungContext.vb<\/b>, was sich Visual Studio mit der Meldung aus Bild 3 best&auml;tigen l&auml;sst.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2020_03\/pic_222_003.png\" alt=\"&Uuml;berschreiben der Datei best&auml;tigen\" width=\"424,7115\" height=\"148,3825\"\/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 3: &Uuml;berschreiben der Datei best&auml;tigen<\/span><\/b><\/p>\n<p>Mit einer weiteren Meldung best&auml;tigen Sie au&szlig;erdem, dass die extern ge&auml;nderten Elemente in Visual Studio neu geladen werden sollen.<\/p>\n<p><b>Datenbank erstellen<\/b><\/p>\n<p>Wenn Sie jetzt noch in der Paket-Manager-Konsole &uuml;ber den Men&uuml;eintrag <b>Extras|Nuget-Paket-Manager|Paket-Manager-Konsole <\/b>die folgenden beiden Befehle aufrufen, wird auch noch eine SQL Server-Datenbank auf Basis des Entity Data Models erstellt, die wir im weiteren Verlauf ben&ouml;tigen:<\/p>\n<pre>add-migration init\r\nupdate-database<\/pre>\n<p>Danach finden Sie die Datenbank im SQL Server-Objekt-Explorer vor und k&ouml;nnen gleichzeitig &uuml;ber das Entity Data Model auf die enthaltenen Daten zugreifen beziehungsweise neue Daten schreiben.<\/p>\n<p><b>Ribbon der Anwendung<\/b><\/p>\n<p>Damit wir die einzelnen Bereiche der Anwendung &ouml;ffnen k&ouml;nnen, f&uuml;gen wir dem Fenster <b>Main.xaml <\/b>ein Ribbon hinzu. Dazu m&uuml;ssen wir zun&auml;chst einen Verweis hinzuf&uuml;gen (Men&uuml;eintrag <b>Projekt|Verweis hinzuf&uuml;gen&#8230;<\/b>), und zwar auf die Bibliothek <b>System.Windows.Controls.Ribbon <\/b>(siehe Bild 4). Danach f&uuml;gen wir dem Code des Fensters <b>Main.xaml <\/b>die folgende Ribbon-Definition hinzu:<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2020_03\/pic_222_005.png\" alt=\"Hinzuf&uuml;gen eines Verweises auf die Bibliothek System.Windows.Controls.Ribbon\" width=\"649,559\" height=\"279,8978\"\/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 4: Hinzuf&uuml;gen eines Verweises auf die Bibliothek System.Windows.Controls.Ribbon<\/span><\/b><\/p>\n<pre>&lt;Grid&gt;\r\n     &lt;Grid.RowDefinitions&gt;\r\n         &lt;RowDefinition Height=\"Auto\"&gt;&lt;\/RowDefinition&gt;\r\n         &lt;RowDefinition Height=\"*\"&gt;&lt;\/RowDefinition&gt;\r\n     &lt;\/Grid.RowDefinitions&gt;\r\n     &lt;Ribbon&gt;\r\n         &lt;RibbonTab Header=\"Rechnungsverwaltung\"&gt;\r\n             &lt;RibbonGroup Header=\"Kunden\"&gt;\r\n                 &lt;RibbonButton x:Name=\"btnKundenuebersicht\" Label=\"&Uuml;bersicht\" LargeImageSource=\"Images\/users.png\" \r\n                     Click=\"BtnKundenuebersicht_Click\"&gt;&lt;\/RibbonButton&gt;\r\n                 &lt;RibbonButton x:Name=\"btnKundeHinzufuegen\" Label=\"Neuer Kunde\" LargeImageSource=\"Images\/user_add.png\" \r\n                     Click=\"BtnKundeHinzufuegen_Click\"&gt;&lt;\/RibbonButton&gt;\r\n             &lt;\/RibbonGroup&gt;\r\n             &lt;RibbonGroup Header=\"Rechnungen\"&gt;\r\n                 &lt;RibbonButton x:Name=\"btnRechnungsuebersicht\" Label=\"&Uuml;bersicht\" LargeImageSource=\"Images\/invoice.png\" \r\n                     Click=\"BtnRechnungsuebersicht_Click\"&gt;&lt;\/RibbonButton&gt;\r\n                 &lt;RibbonButton x:Name=\"btnRechnungHinzufuegen\" Label=\"Neue Rechnung\" \r\n                     LargeImageSource=\"Images\/invoice_add.png\" Click=\"BtnRechnungHinzufuegen_Click\"&gt;&lt;\/RibbonButton&gt;\r\n             &lt;\/RibbonGroup&gt;\r\n         &lt;\/RibbonTab&gt;\r\n     &lt;\/Ribbon&gt;\r\n&lt;\/Grid&gt;<\/pre>\n<p>Damit erstellen wir ein Ribbon, das wie in Bild 5 aussieht. Die Ereignismethoden f&uuml;r die Schaltfl&auml;chen werden automatisch angelegt, wenn Sie im XAML-Code <b>Click <\/b>gefolgt vom Gleichheitszeichen eingeben und dann die Tabulator-Taste bet&auml;tigen.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2020_03\/pic_222_006.png\" alt=\"Ribbon der Anwendung\" width=\"499,6607\" height=\"225,7917\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 5: Ribbon der Anwendung<\/span><\/b><\/p>\n<p><b>Kunden anlegen<\/b><\/p>\n<p>Wir beginnen mit der Seite zum Anlegen eines neuen Kunden, da wir ja noch keine Kundendaten in der Datenbank haben &#8211; und diese sollten ja vorhanden sein, damit wir Material f&uuml;r die &Uuml;bersichtsseite der Kunden haben. Wir erstellen also explizit kein neues Fenster, sondern eine Seite (<b>Page<\/b>). Diese f&uuml;gen wir hinzu, indem wir den Kontextmen&uuml;-Befehl des Projekt-Elements im Projektmappen-Explorer bet&auml;tigen und im Dialog <b>Neues Element hinzuf&uuml;gen <\/b>den Eintrag <b>Seite (WPF) <\/b>ausw&auml;hlen. Die neue Seite soll <b>Kundendetails <\/b>hei&szlig;en und nicht nur zum Anlegen neuer Kunden, sondern auch zur Anzeige der Details bereits angelegter Kunden dienen. Der XAML-Code sieht in gek&uuml;rzter Form wie folgt aus:<\/p>\n<pre>&lt;Page x:Class=\"Kundendetails\" ...&gt;\r\n     &lt;Page.Resources&gt;...&lt;\/Page.Resources&gt;\r\n     &lt;Grid&gt;\r\n         ...<\/pre>\n<p>Bei den <b>TextBox<\/b>-Elementen wird der Inhalt des jeweiligen <b>Kunde<\/b>-Elements durch eine Bindung an das Feld <b>Kunde.ID <\/b>erreicht:<\/p>\n<pre>         &lt;Label Content=\"ID:\" Grid.Column=\"0\" \/&gt;\r\n         &lt;TextBox x:Name=\"txtID\" Grid.Column=\"1\" HorizontalAlignment=\"Left\"             Text=\"{Binding Kunde.ID, Mode=TwoWay}\" Width=\"50\" IsEnabled=\"False\" BorderBrush=\"Transparent\" \/&gt;<\/pre>\n<p>Die Ausnahme ist hier die das <b>ComboBox<\/b>-Element <b>cboAnrede<\/b>. Es verwendet eine ganze Reihe von Attributen, damit es die Daten der Tabelle <b>Anreden <\/b>anzeigt. <b>ItemsSource <\/b>gibt den Namen der Eigenschaft der Code behind-Datei an, welche die Daten f&uuml;r das <b>ComboBox<\/b>-Element liefert. <b>SelectedItem <\/b>legt fest, wie der ausgew&auml;hlte Eintrag selektiert wird. <b>SelectedValuePath <\/b>gibt den Namen des Feldes an, &uuml;ber den das selektierte Element ermittelt wird.<\/p>\n<p>Schlie&szlig;lich gibt das <b>Binding<\/b>-Element im <b>DataTemplate<\/b>-Element noch an, welches Feld der <b>Anrede<\/b>-Objekte im Kombinationsfeld angezeigt wird:<\/p>\n<pre>         &lt;Label Content=\"ID:\" Grid.Column=\"0\" \/&gt;\r\n         &lt;TextBox x:Name=\"txtID\" Grid.Column=\"1\" HorizontalAlignment=\"Left\" Text=\"{Binding Kunde.ID, Mode=TwoWay}\"             Width=\"50\" IsEnabled=\"False\" BorderBrush=\"Transparent\" \/&gt;\r\n         &lt;Label Content=\"Anrede:\" Grid.Column=\"0\" Grid.Row=\"1\" \/&gt;\r\n         &lt;ComboBox x:Name=\"cboAnredeID\" Grid.Row=\"1\" Grid.Column=\"1\" Width=\"100\"\r\n                    ItemsSource=\"{Binding Anreden}\"\r\n                    SelectedItem=\"{Binding Kunde.Anrede, ValidatesOnDataErrors=True}\"\r\n                    SelectedValuePath=\"ID\" SelectionChanged=\"Anrede_SelectionChanged\"&gt;\r\n             &lt;ComboBox.ItemTemplate&gt;\r\n                 &lt;DataTemplate&gt;\r\n                     &lt;TextBlock&gt;\r\n                         &lt;TextBlock.Text&gt;\r\n                             &lt;MultiBinding StringFormat=\"{}{0}\"&gt;\r\n                                 &lt;Binding Path=\"Bezeichnung\" \/&gt;\r\n                             &lt;\/MultiBinding&gt;\r\n                         &lt;\/TextBlock.Text&gt;\r\n                     &lt;\/TextBlock&gt;\r\n                 &lt;\/DataTemplate&gt;\r\n             &lt;\/ComboBox.ItemTemplate&gt;\r\n         &lt;\/ComboBox&gt;\r\n         &lt;Label Content=\"Vorname:\" Grid.Column=\"0\" Grid.Row=\"2\" \/&gt;\r\n         &lt;TextBox x:Name=\"txtVorname\" Grid.Column=\"1\" Grid.Row=\"2\" Width=\"200\"             Text=\"{Binding Kunde.Vorname, Mode=TwoWay, ValidatesOnDataErrors=True}\" \/&gt;\r\n         &lt;Label Content=\"Nachname:\" Grid.Row=\"3\" \/&gt;\r\n         &lt;TextBox x:Name=\"txtNachname\" Grid.Column=\"1\" Grid.Row=\"3\" Width=\"200\"             Text=\"{Binding Kunde.Nachname, Mode=TwoWay, ValidatesOnDataErrors=True}\" \/&gt;\r\n         &lt;Label Content=\"Firma:\" Grid.Row=\"4\" \/&gt;\r\n         &lt;TextBox x:Name=\"txtFirma\" Grid.Column=\"1\" Grid.Row=\"4\" Width=\"200\" \r\n             Text=\"{Binding Kunde.Firma, Mode=TwoWay, ValidatesOnDataErrors=True}\" \/&gt;\r\n         &lt;Label Content=\"Stra&szlig;e:\" Grid.Row=\"5\" \/&gt;\r\n         &lt;TextBox x:Name=\"txtStrasse\" Grid.Column=\"1\" Grid.Row=\"5\" Width=\"200\" \r\n             Text=\"{Binding Kunde.Strasse, Mode=TwoWay, ValidatesOnDataErrors=True}\" \/&gt;\r\n         &lt;Label Content=\"PLZ:\" Grid.Row=\"6\" \/&gt;\r\n         &lt;TextBox x:Name=\"txtPLZ\" Grid.Column=\"1\" Grid.Row=\"6\" Width=\"50\" \r\n             Text=\"{Binding Kunde.PLZ, Mode=TwoWay, ValidatesOnDataErrors=True}\" \/&gt;\r\n         &lt;Label Content=\"Ort:\" Grid.Row=\"7\" \/&gt;\r\n         &lt;TextBox x:Name=\"txtOrt\" Grid.Column=\"1\" Grid.Row=\"7\" Width=\"200\"             Text=\"{Binding Kunde.Ort, Mode=TwoWay, ValidatesOnDataErrors=True}\" \/&gt;\r\n         &lt;Label Content=\"Land:\" Grid.Row=\"8\" \/&gt;\r\n         &lt;TextBox x:Name=\"txtLand\" Grid.Column=\"1\" Grid.Row=\"8\" Width=\"200\"             Text=\"{Binding Kunde.Land, Mode=TwoWay, ValidatesOnDataErrors=True}\" \/&gt;\r\n         &lt;Label Content=\"E-Mail:\" Grid.Row=\"9\" \/&gt;\r\n         &lt;TextBox x:Name=\"txtEMail\" Grid.Column=\"1\" Grid.Row=\"9\" Width=\"200\"             Text=\"{Binding Kunde.EMail, Mode=TwoWay, ValidatesOnDataErrors=True}\" \/&gt;\r\n         &lt;StackPanel Orientation=\"Horizontal\" Grid.Row=\"10\" Grid.ColumnSpan=\"4\" &gt;\r\n             &lt;Button x:Name=\"btnSpeichern\" Click=\"btnSpeichern_Click\" Content=\"Speichern\"&gt;\r\n                 &lt;Button.Style&gt;\r\n                     &lt;Style TargetType=\"{x:Type Button}\" BasedOn=\"{StaticResource {x:Type Button}}\"&gt;\r\n                         &lt;Style.Triggers&gt;\r\n                             &lt;DataTrigger Binding=\"{Binding ElementName=cboAnrede,                                     Path=(Validation.HasError)}\" Value=\"True\"&gt;\r\n                                 &lt;Setter Property=\"IsEnabled\" Value=\"False\"&gt;&lt;\/Setter&gt;\r\n                             &lt;\/DataTrigger&gt;\r\n                             ...\r\n                         &lt;\/Style.Triggers&gt;\r\n                     &lt;\/Style&gt;\r\n                 &lt;\/Button.Style&gt;\r\n             &lt;\/Button&gt;\r\n             &lt;Button x:Name=\"btnVerwerfen\"                 Click=\"btnVerwerfen_Click\"                 Content=\"Verwerfen\"&gt;&lt;\/Button&gt;\r\n         &lt;\/StackPanel&gt;\r\n     &lt;\/Grid&gt;\r\n&lt;\/Page&gt;<\/pre>\n<p>Wir betten hier direkt auch die Funktion zum Validieren der Textfelder ein &#8211; daher finden Sie im <b>Binding<\/b>-Element auch jeweils die Eigenschaft <b>ValidationOnDataErrors <\/b>mit dem Wert <b>True<\/b>.<\/p>\n<p>Die so erstellte Seite betten wir beim Anklicken des Ribbon-Eintrags <b>btnKundeAnlegen <\/b>&uuml;ber die folgende Methode ein:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>BtnKundeHinzufuegen_Click(sender<span style=\"color:blue;\"> As Object<\/span>, e<span style=\"color:blue;\"> As <\/span>RoutedEventArgs)\r\n     <span style=\"color:blue;\">Dim <\/span>pge<span style=\"color:blue;\"> As <\/span>Kundendetails\r\n     pge = <span style=\"color:blue;\">New<\/span> Kundendetails(Me.WorkZone)\r\n     WorkZone.Content = pge\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Wir erstellen also ein neues Objekt auf Basis des <b>Page<\/b>-Elements <b>Kundendetails <\/b>und &uuml;bergeben diesem einen Verweis auf das <b>Frame<\/b>-Element <b>WorkZone<\/b>, in dem wir es anzeigen wollen.<\/p>\n<p>Diesen ben&ouml;tigen wir sp&auml;ter, um die Seite wieder aus dem <b>Frame<\/b>-Element zu entfernen. Dann weisen wir es dem mit <b>WorkZone <\/b>benannten <b>Frame<\/b>-Element zu, das wir wie folgt im Fenster <b>Main.xaml <\/b>eingef&uuml;gt haben:<\/p>\n<pre>&lt;Frame x:Name=\"WorkZone\" Grid.Row=\"1\" NavigationUI-Visibility=\"Hidden\" Navigated=\"WorkZone_Navigated\"&gt;&lt;\/Frame&gt;<\/pre>\n<p>Nach dem Starten des Projekts und einem Klick auf die Ribbon-Schaltfl&auml;che <b>Neuer Kunde <\/b>sieht das Fenster wie in Bild 6 aus. Hier wird gerade die Anrede f&uuml;r einen neuen Kunden ausgew&auml;hlt.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2020_03\/pic_222_008.png\" alt=\"Die Seite Kundendetails.xaml im Fenster Main.xaml\" width=\"499,6607\" height=\"576,2045\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 6: Die Seite Kundendetails.xaml im Fenster Main.xaml<\/span><\/b><\/p>\n<p>Damit die Daten so wie im Screenshot auf der Seite landen, sind noch einige Zeilen in der Code behind-Datei n&ouml;tig. Diese sehen wie folgt aus. Die Klasse deklariert zun&auml;chst drei Variablen. Die erste namens <b>_kunde <\/b>nimmt den aktuell angezeigten Kunden auf, die zweite namens <b>_anreden <\/b>ist eine Auflistung von Objekten des Typs <b>Anrede <\/b>und die dritte namens <b>dbContext <\/b>referenziert das Context-Objekt:<\/p>\n<pre><span style=\"color:blue;\">Class<\/span> Kundendetails\r\n     <span style=\"color:blue;\">Private <\/span>_kunde<span style=\"color:blue;\"> As <\/span>Kunde\r\n     <span style=\"color:blue;\">Private <\/span>_anreden<span style=\"color:blue;\"> As <\/span>List(Of Anrede)\r\n     <span style=\"color:blue;\">Private <\/span>dbContext<span style=\"color:blue;\"> As <\/span>RechnungsverwaltungContext<\/pre>\n<p>Au&szlig;erdem ben&ouml;tigen wir noch eine Variable, mit der wir das <b>Frame<\/b>-Objekt referenzieren, in dem das <b>Page<\/b>-Element angezeigt wird:<\/p>\n<pre>     <span style=\"color:blue;\">Private <\/span>_frame<span style=\"color:blue;\"> As <\/span>Frame<\/pre>\n<p>Die private Variable <b>_kunde <\/b>machen wir &uuml;ber die &ouml;ffentliche Eigenschaft <b>Kunde <\/b>schreib- und lesbar:<\/p>\n<pre>     <span style=\"color:blue;\">Public <\/span>Property Kunde<span style=\"color:blue;\"> As <\/span>Kunde\r\n         Get\r\n             Return _kunde\r\n         End Get\r\n         Set(value<span style=\"color:blue;\"> As <\/span>Kunde)\r\n             _kunde = value\r\n         End <span style=\"color:blue;\">Set<\/span>\r\n     End Property<\/pre>\n<div class=\"rcp_restricted\"><p><span style=\"color: #ff0000;\">M&ouml;chten Sie weiterlesen? Dann l&ouml;sen Sie Ihr Ticket!<\/span><br \/>\n<span style=\"color: #ff0000;\">Hier geht es zur Bestellung des Jahresabonnements des Magazins <strong>Visual Basic Entwickler<\/strong>:<\/span><br \/>\n<span style=\"color: #ff0000;\"><a style=\"color: #ff0000;\" href=\"https:\/\/shop.minhorst.com\/magazine\/363\/visual-basic-entwickler-jahresabonnement?c=77\">Zur Bestellung ...<\/a><\/span><br \/>\n<span style=\"color: #ff0000;\">Danach greifen Sie sofort auf <strong>alle rund 200 Artikel<\/strong> unseres Angebots zu - auch auf diesen hier!<\/span><br \/>\n<span style=\"color: #000000;\">Oder haben Sie bereits Zugangsdaten? Dann loggen Sie sich gleich hier ein:<\/span><\/p>\n<\/div>\n\n\t\n\t<form id=\"rcp_login_form\"  class=\"rcp_form\" method=\"POST\" action=\"https:\/\/vbentwickler.de\/data\/wp\/v2\/posts\/55000222\/\">\n\n\t\t\n\t\t<fieldset class=\"rcp_login_data\">\n\t\t\t<p>\n\t\t\t\t<label for=\"rcp_user_login\">Username or Email<\/label>\n\t\t\t\t<input name=\"rcp_user_login\" id=\"rcp_user_login\" class=\"required\" type=\"text\"\/>\n\t\t\t<\/p>\n\t\t\t<p>\n\t\t\t\t<label for=\"rcp_user_pass\">Password<\/label>\n\t\t\t\t<input name=\"rcp_user_pass\" id=\"rcp_user_pass\" class=\"required\" type=\"password\"\/>\n\t\t\t<\/p>\n\t\t\t\t\t\t<p>\n\t\t\t\t<input type=\"checkbox\" name=\"rcp_user_remember\" id=\"rcp_user_remember\" value=\"1\"\/>\n\t\t\t\t<label for=\"rcp_user_remember\">Remember me<\/label>\n\t\t\t<\/p>\n\t\t\t<p class=\"rcp_lost_password\"><a href=\"\/data\/wp\/v2\/posts\/55000222?rcp_action=lostpassword\"><\/a><\/p>\n\t\t\t<p>\n\t\t\t\t<input type=\"hidden\" name=\"rcp_action\" value=\"login\"\/>\n\t\t\t\t<input type=\"hidden\" name=\"rcp_redirect\" value=\"https:\/\/vbentwickler.de\/data\/wp\/v2\/posts\/55000222\/\"\/>\n\t\t\t\t<input type=\"hidden\" name=\"rcp_login_nonce\" value=\"cfdc340e0d\"\/>\n\t\t\t\t<input id=\"rcp_login_submit\" class=\"rcp-button\" type=\"submit\" value=\"Login\"\/>\n\t\t\t<\/p>\n\t\t\t\t\t<\/fieldset>\n\n\t\t\n\t<\/form>\n<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Als selbst&auml;ndiger oder freiberuflicher Softwareentwickler braucht man am Ende vor allem eines: eine Anwendung zum Erstellen von Rechnungen. Diese wollen wir im vorliegenden Artikel programmieren &#8211; vom Entwurf des Datenmodells &uuml;ber die Erstellung des Entity Data Models und die Benutzeroberfl&auml;che bis zum Ausdrucken der Rechnung als PDF oder mit dem Drucker.<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"om_disable_all_campaigns":false,"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"_uf_show_specific_survey":0,"_uf_disable_surveys":false,"footnotes":""},"categories":[662020,66032020,44000004,44000031,44000025],"tags":[],"yst_prominent_words":[],"class_list":["post-55000222","post","type-post","status-publish","format-standard","hentry","category-662020","category-66032020","category-Loesungen","category-twinBASICProgrammierung","category-VBAProgrammierung"],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/posts\/55000222","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/comments?post=55000222"}],"version-history":[{"count":0,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/posts\/55000222\/revisions"}],"wp:attachment":[{"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/media?parent=55000222"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/categories?post=55000222"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/tags?post=55000222"},{"taxonomy":"yst_prominent_words","embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/yst_prominent_words?post=55000222"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}