{"id":55000122,"date":"2018-02-01T00:00:00","date_gmt":"2020-03-27T19:30:47","guid":{"rendered":"http:\/\/access-im-unternehmen.aix-dev.de\/aiu\/?p=122"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-30T00:00:00","slug":"Adressen_verwalten","status":"publish","type":"post","link":"https:\/\/vbentwickler.de\/Adressen_verwalten\/","title":{"rendered":"Adressen verwalten"},"content":{"rendered":"<p><b>F&uuml;r unsere L&ouml;sung zum Erstellen und Verwalten von Word-Dokumenten aus dem Artikel &#8220;Briefe mit Word erstellen&#8221; ben&ouml;tigen wir eine M&ouml;glichkeit zum Anlegen und Verwalten von Adressen. Dazu wollen wir ein eigenes Fenster erstellen, dass eine &Uuml;bersicht der Adressen in einer Liste, eine kleine Suchfunktion sowie die Details der aktuell in der Liste ausgew&auml;hlten Adresse oder einer neuen Adresse anzeigt. Die L&ouml;sung soll nat&uuml;rlich &uuml;ber ein Entity Data Model an eine entsprechende Tabelle gebunden werden.<\/b><\/p>\n<p>Zur Anzeige der Adressen f&uuml;gen wir der L&ouml;sung ein neues Fenster namens <b>Adressen.xaml <\/b>hinzu. F&uuml;r die Anordnung der ben&ouml;tigten Steuer-elemente wollen wir dem Grid ein Raster von vier Spalten und acht Zeilen hinzuf&uuml;gen. Die erste und die dritte Spalte weisen als Spaltenbreite den Wert <b>Auto <\/b>auf, damit sich die Breite an den breitesten enthaltenen Steuerelementen orientiert, in diesem Fall an den Inhalten der <b>Label<\/b>-Elemente mit den Feldbeschriftungen. Die zweite und die vierte Spalte sollen sich den Rest der Breite aufteilen, damit der Benutzer das Fenster verbreitern und somit Inhalte der Textfelder, die gegebenenfalls nicht vollst&auml;ndig angezeigt werden, sichtbar machen kann.<\/p>\n<p>Die Zeilen werden mit einer Ausnahme alle mit der Zeilenh&ouml;he <b>Auto<\/b> ausgestattet, damit sich diese an der f&uuml;r die enthaltenen Elemente notwendigen H&ouml;he orientieren k&ouml;nnen. Die Ausnahme ist die zweite Zeile, welche das Listenfeld zur Anzeige der Adressen in der &Uuml;bersicht anzeigen soll. Diese Zeile erh&auml;lt f&uuml;r die Eigenschaft <b>Height <\/b>den Wert <b>*<\/b>, was dazu f&uuml;hrt, dass sie den verbleibenden Platz einnimmt und beim Vergr&ouml;&szlig;ern der H&ouml;he des Fensters ebenfalls vergr&ouml;&szlig;ert wird. Die Definition des Grundger&uuml;sts des Fensters mit XAML-Code sieht wie folgt aus und erscheint im Entwurf wie in Bild 1:<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2018_01\/pic_122_001.png\" alt=\"Fenster zum Verwalten von Adressen\" width=\"499,6607\" height=\"434,037\"\/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 1: Fenster zum Verwalten von Adressen<\/span><\/b><\/p>\n<pre>&lt;Window x:Class=\"Adressen\" ... Title=\"Adressen\" Height=\"350\" Width=\"400\"&gt;\r\n     &lt;Window.Resources&gt;\r\n         &lt;Style TargetType=\"TextBox\"&gt;\r\n             &lt;Setter Property=\"Margin\" Value=\"3\"&gt;&lt;\/Setter&gt;\r\n             &lt;Setter Property=\"Padding\" Value=\"3\"&gt;&lt;\/Setter&gt;\r\n         &lt;\/Style&gt;\r\n         ...\r\n     &lt;\/Window.Resources&gt;\r\n     &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;RowDefinition Height=\"Auto\"&gt;&lt;\/RowDefinition&gt;\r\n             ...\r\n         &lt;\/Grid.RowDefinitions&gt;\r\n         &lt;Grid.ColumnDefinitions&gt;\r\n             &lt;ColumnDefinition Width=\"Auto\"&gt;&lt;\/ColumnDefinition&gt;\r\n             &lt;ColumnDefinition Width=\"*\"&gt;&lt;\/ColumnDefinition&gt;\r\n             &lt;ColumnDefinition Width=\"Auto\"&gt;&lt;\/ColumnDefinition&gt;\r\n             &lt;ColumnDefinition Width=\"*\"&gt;&lt;\/ColumnDefinition&gt;\r\n         &lt;\/Grid.ColumnDefinitions&gt;\r\n         &lt;Label&gt;Suche:&lt;\/Label&gt;\r\n         &lt;Label Grid.Row=\"2\"&gt;Firma:&lt;\/Label&gt;\r\n         &lt;Label Grid.Row=\"3\"&gt;Anrede:&lt;\/Label&gt;\r\n         ... weitere Label\r\n         &lt;Label Grid.Row=\"2\" Grid.Column=\"2\"&gt;PLZ:&lt;\/Label&gt;\r\n         &lt;Label Grid.Row=\"3\" Grid.Column=\"2\"&gt;Ort:&lt;\/Label&gt;\r\n         ... weitere Label\r\n         &lt;TextBox x:Name=\"txtSuchbegriff\" Grid.Column=\"1\" Grid.ColumnSpan=\"3\"&gt;&lt;\/TextBox&gt;\r\n         &lt;ListBox x:Name=\"lstAdressen\" Grid.Row=\"1\" Grid.ColumnSpan=\"4\" Margin=\"3\" Padding=\"3\"&gt;&lt;\/ListBox&gt;\r\n         &lt;TextBox x:Name=\"txtFirma\" Grid.Row=\"2\" Grid.Column=\"1\"&gt;&lt;\/TextBox&gt;\r\n         &lt;ComboBox x:Name=\"cboAnreden\" Grid.Row=\"3\" Grid.Column=\"1\"&gt;&lt;\/ComboBox&gt;\r\n         &lt;TextBox x:Name=\"txtVorname\" Grid.Row=\"4\" Grid.Column=\"1\"&gt;&lt;\/TextBox&gt;\r\n         ... weitere TextBox-Elemente\r\n         &lt;StackPanel Orientation=\"Horizontal\" Grid.Row=\"7\" Grid.ColumnSpan=\"4\"&gt;\r\n             &lt;Button x:Name=\"btnOK\"&gt;OK&lt;\/Button&gt;\r\n             &lt;Button x:Name=\"btnSpeichern\"&gt;Speichern&lt;\/Button&gt;\r\n             &lt;Button x:Name=\"btnNeu\"&gt;Neue Adresse&lt;\/Button&gt;\r\n             &lt;Button x:Name=\"btnLoeschen\"&gt;Adresse l&ouml;schen&lt;\/Button&gt;\r\n         &lt;\/StackPanel&gt;\r\n     &lt;\/Grid&gt;\r\n&lt;\/Window&gt;<\/pre>\n<p>Im unteren Bereich findet sich noch ein <b>StackPanel<\/b>, welches ebenfalls &uuml;ber die gesamten vier Spalten geht und in horizontaler Ausrichtung vier <b>Button<\/b>-Elemente anzeigt. F&uuml;r die Steuerelementtypen <b>Label, TextBox<\/b>, <b>ListBox<\/b>, <b>ComboBox <\/b>und <b>Button <\/b>haben wir im oberen Bereich unter <b>Window.Resources <\/b>einige allgemeine Eigenschaften wie <b>Margin <\/b>und <b>Padding <\/b>festgelegt. Diese greifen bei den Steuerelementen, die per <b>ColumnSpan <\/b>&uuml;ber mehrere Spalten angelegt werden, nicht &#8211; daher m&uuml;ssen wir zum Beispiel die Eigenschaft <b>Margin <\/b>f&uuml;r das Textfeld zur Eingabe des Suchbegriffs und das Listenfeld direkt mit dem Steuer-element definieren.<\/p>\n<h2>Entity Data Model<\/h2>\n<p>Das Entity Data Model f&uuml;r die L&ouml;sung haben wir bereits im Beitrag <b>EDM: Die Code First-Methode <\/b>und <b>EDM: Code First &#8211; Datenbank erweitern <\/b>besprochen. Der Teil, der f&uuml;r die hier zu verwaltenden Adressen verantwortlich ist, sind die beiden Klassen <b>Adresse <\/b>und <b>Anrede<\/b>. Wir ben&ouml;tigen f&uuml;r das Listenfeld eine Auflistung der Adressen mit den wichtigsten Feldern, f&uuml;r das Kombinationsfeld <b>cboAnreden <\/b>eine Auflistung der Anreden und f&uuml;r die Details der aktuell bearbeiteten Adresse ein Objekt auf Basis der Klasse <b>Adresse<\/b>. Um die Steuer-elemente des Fensters an die Daten der beiden Klassen zu binden, f&uuml;gen wir zun&auml;chst eine &ouml;ffentliche Eigenschaft f&uuml;r ein Objekt auf Basis der Klasse Adresse zur Code behind-Klasse hinzu:<\/p>\n<pre><span style=\"color:blue;\">Public Property <\/span>AktuelleAdresse<span style=\"color:blue;\"> As <\/span>Adresse<\/pre>\n<p>Au&szlig;erdem ben&ouml;tigen wir eine Variable zum Speichern der Objektvariablen f&uuml;r das <b>DbContext<\/b>-Element:<\/p>\n<pre><span style=\"color:blue;\">Private <\/span>WordbriefContext<span style=\"color:blue;\"> As <\/span>WordbriefEntities<\/pre>\n<p>F&uuml;r die Liste der Adressen im <b>ListView<\/b>-Steuerelement sehen wir die folgende Variable vor:<\/p>\n<pre><span style=\"color:blue;\">Public Property <\/span>Adressenliste<span style=\"color:blue;\"> As <\/span>ObservableCollection(Of Adresse)<\/pre>\n<p>Fehlt noch eine Collection f&uuml;r die Anreden, die wir so deklarieren:<\/p>\n<pre><span style=\"color:blue;\">Public Property <\/span>Anredenliste<span style=\"color:blue;\"> As <\/span>ObservableCollection(Of Anrede)<\/pre>\n<p>Dann erstellen wir das Grundger&uuml;st f&uuml;r die Konstruktor-Methode, also die Methode, die beim &Ouml;ffnen des Fensters ausgel&ouml;st wird. Nun k&ouml;nnen wir das Fenster auf zwei Arten &ouml;ffnen: Erstens mit der Schaltfl&auml;che zum Bearbeiten des aktuell im Hauptfenster <b>MainWindow.xaml <\/b>angezeigten Datensatzes und zweitens mit der Schaltfl&auml;che zum Erstellen eines neuen Adress-Objekts. Das hei&szlig;t also, dass wir entweder eine ID aus dem aufrufenden Fenster &uuml;bergeben m&uuml;ssen oder, wenn ein neues Element angelegt werden soll, eben nicht. Das ist eine gute Gelegenheit, einmal das &Uuml;berladen der Konstruktor-Methode zu demonstrieren. Das bedeutet, dass wir zwei verschiedene Konstruktor-Methoden erstellen, von denen die eine keinen Parameter enth&auml;lt &#8211; das ist die zum Anlegen eines neuen Elements. Die andere soll einen bestehenden Adress-Datensatz anzeigen, also &uuml;bergeben wir dieser Konstruktor-Methode die ID des anzuzeigenden Datensatzes.<\/p>\n<p>Dazu legen wir einen entsprechenden Parameter an. Grunds&auml;tzlich sehen die beiden Methoden also wie folgt aus:<\/p>\n<pre><span style=\"color:blue;\">Public Sub <\/span>New()\r\n     InitializeComponent()\r\n     ...\r\n<span style=\"color:blue;\">End Sub<\/span>\r\n<span style=\"color:blue;\">Public Sub <\/span>New(AdresseID<span style=\"color:blue;\"> As Integer<\/span>)\r\n     InitializeComponent()\r\n     ...\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Sie brauchen &uuml;brigens immer nur den Kopf mit <b>Public Sub New(&#8230;) <\/b>einzugeben, Visual Studio erzeugt dann immer den Rest mit der Anweisung <b>InitializeComponent <\/b>und den &uuml;blichen Kommentarzeilen &#8211; das gilt auch, wenn Sie &Uuml;berladungen der <b>New<\/b>-Methode angeben.<\/p>\n<h2>Konstruktor-Methoden f&uuml;llen<\/h2>\n<p>Damit begeben wir uns an die Konstruktor-Methoden. Die Methode <b>New <\/b>ohne Parameter soll daf&uuml;r sorgen, dass das Fenster <b>AdressenVerwalten.xaml <\/b>einen neuen, leeren Datensatz anzeigt, den der Benutzer dann mit Daten f&uuml;llen und speichern kann. Dazu ben&ouml;tigen wir die folgende Konstruktor-Methode:<\/p>\n<pre><span style=\"color:blue;\">Public Sub <\/span>New()\r\n     InitializeComponent()\r\n     WordbriefContext = <span style=\"color:blue;\">New<\/span> WordbriefEntities\r\n     Adressenliste = <span style=\"color:blue;\">New<\/span> ObservableCollection(Of Adresse)(WordbriefContext.Adressen)\r\n     AktuelleAdresse = <span style=\"color:blue;\">New<\/span> Adresse\r\n     Anredenliste = <span style=\"color:blue;\">New<\/span> ObservableCollection(Of Anrede)(WordbriefContext.Anreden)\r\n     DataContext = Me\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Die Methode f&uuml;llt <b>WordbriefContext <\/b>mit dem Entity Data Model. Au&szlig;erdem liest sie die Adressen und Anreden in die Collections <b>Adressen <\/b>und <b>Anreden <\/b>ein. Die Variable <b>Adresse <\/b>wird einem neuen Element des Typs <b>Adresse <\/b>gef&uuml;llt. Die zweite Konstruktor-Methode erwartet den Parameter <b>SelektierteAdresse <\/b>des Typs <b>Adresse<\/b>, der vom aufrufenden Fenster &uuml;bergeben wird und in den Steuerelementen des Fensters <b>AdressenVerwalten <\/b>als aktive Adresse angezeigt werden soll:<\/p>\n<pre><span style=\"color:blue;\">Public Sub <\/span>New(selektierteAdresse<span style=\"color:blue;\"> As <\/span>Adresse)\r\n     InitializeComponent()\r\n     WordbriefContext = <span style=\"color:blue;\">New<\/span> WordbriefEntities\r\n     Adressenliste = <span style=\"color:blue;\">New<\/span> ObservableCollection(Of Adresse)(WordbriefContext.Adressen)\r\n     Anredenliste = <span style=\"color:blue;\">New<\/span> ObservableCollection(Of Anrede)(WordbriefContext.Anreden)\r\n     <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Not<\/span> selektierteAdresse Is Nothing<span style=\"color:blue;\"> Then<\/span>\r\n         AktuelleAdresse = selektierteAdresse\r\n         lvwAdressen.SelectedValue = AktuelleAdresse.ID\r\n     <span style=\"color:blue;\">End If<\/span>\r\n     DataContext = Me\r\n<span style=\"color:blue;\">End Sub<\/span><\/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\/55000122\/\">\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\/55000122?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\/55000122\/\"\/>\n\t\t\t\t<input type=\"hidden\" name=\"rcp_login_nonce\" value=\"123b777de9\"\/>\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>F&uuml;r unsere L&ouml;sung zum Erstellen und Verwalten von Word-Dokumenten aus dem Artikel &#8220;Briefe mit Word erstellen&#8221; ben&ouml;tigen wir eine M&ouml;glichkeit zum Anlegen und Verwalten von Adressen. Dazu wollen wir ein eigenes Fenster erstellen, dass eine &Uuml;bersicht der Adressen in einer Liste, eine kleine Suchfunktion sowie die Details der aktuell in der Liste ausgew&auml;hlten Adresse oder einer neuen Adresse anzeigt. Die L&ouml;sung soll nat&uuml;rlich &uuml;ber ein Entity Data Model an eine entsprechende Tabelle gebunden werden.<\/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":[66012018,662018,44000021,44000027,44000004],"tags":[],"yst_prominent_words":[],"class_list":["post-55000122","post","type-post","status-publish","format-standard","hentry","category-66012018","category-662018","category-Entity_Framework","category-Excel_programmieren","category-Loesungen"],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/posts\/55000122","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=55000122"}],"version-history":[{"count":0,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/posts\/55000122\/revisions"}],"wp:attachment":[{"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/media?parent=55000122"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/categories?post=55000122"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/tags?post=55000122"},{"taxonomy":"yst_prominent_words","embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/yst_prominent_words?post=55000122"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}