{"id":55000051,"date":"2016-08-01T00:00:00","date_gmt":"2020-03-27T19:21:49","guid":{"rendered":"http:\/\/access-im-unternehmen.aix-dev.de\/aiu\/?p=51"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-30T00:00:00","slug":"WPFEDM_Kundendetails","status":"publish","type":"post","link":"https:\/\/vbentwickler.de\/WPFEDM_Kundendetails\/","title":{"rendered":"WPF\/EDM: Kundendetails"},"content":{"rendered":"<p><b>Wenn Sie aus einer Kunden&uuml;bersicht die Details eines Kunden anzeigen oder einen neuen Kunden anlegen m&ouml;chten, ben&ouml;tigen Sie ein geeignetes weiteres Fenster. Dieses soll die Daten des zu bearbeitenden Kundendatensatzes oder auch einen neuen, leeren Datensatz anzeigen &#8211; je nach Anforderung. Wie Sie dies auf Basis von Daten aus einem Entity Data Model erledigen, zeigt dieser Artikel.<\/b><\/p>\n<h2>Voraussetzungen<\/h2>\n<p>F&uuml;r das Nachvollziehen dieses Beispiels erstellen Sie ein Entity Data Model wie im Artikel <b>WPF\/EDM: Kunden&uuml;bersicht <\/b>beschrieben. Das dort beschriebene Fenster mit einer &Uuml;bersicht der gespeicherten Kunden verwenden wir, um das im vorliegenden Artikel beschriebene Detailfenster zu &ouml;ffnen.<\/p>\n<h2>Fenster zum Hinzuf&uuml;gen und Bearbeiten von Kunden<\/h2>\n<p>Bevor wir Kunden bearbeiten oder hinzuf&uuml;gen k&ouml;nnen, ben&ouml;tigen wir ein entsprechendes Fenster. Dieses definieren wir mit der <b>.xaml<\/b>-Datei aus Listing 1 (gek&uuml;rzte Fassung). <\/p>\n<pre>&lt;Window x:Class=\"Bestellverwaltung_EDM.Kundendetails\" ...Title=\"Kundendetails\" Height=\"300\" Width=\"300\" Icon=\"users3.ico\"&gt;\r\n     &lt;Grid&gt;\r\n         \/\/... Definition von vier Spalten und sieben Zeilen\r\n         &lt;TextBlock Grid.Column=\"0\" Grid.Row=\"0\" Margin=\"3\" Text=\"ID:\" \/&gt;\r\n         &lt;TextBlock Grid.Column=\"0\" Grid.Row=\"1\" Margin=\"3\" Text=\"Firma:\" \/&gt;\r\n         &lt;TextBlock Grid.Column=\"0\" Grid.Row=\"2\" Margin=\"3\" Text=\"Anrede:\" \/&gt;\r\n         &lt;TextBlock Grid.Column=\"0\" Grid.Row=\"3\" Margin=\"3\" Text=\"Vorname:\" \/&gt;\r\n         &lt;TextBlock Grid.Column=\"0\" Grid.Row=\"4\" Margin=\"3\" Text=\"Nachname:\" \/&gt;\r\n         &lt;TextBox ... Text=\"{Binding KundeTemp.ID}\" IsEnabled=\"False\"\/&gt;\r\n         &lt;TextBox ... Text=\"{Binding KundeTemp.Firma}\" \/&gt;\r\n         &lt;ComboBox ... ItemsSource=\"{Binding Anreden}\" SelectedItem=\"{Binding KundeTemp.Anreden}\" \r\n                                                               DisplayMemberPath=\"Bezeichnung\" SelectedValuePath=\"Id\" \/&gt;\r\n         &lt;TextBox ... Text=\"{Binding KundeTemp.Vorname}\" \/&gt;\r\n         &lt;TextBox ... Text=\"{Binding KundeTemp.Nachname}\" \/&gt;\r\n         &lt;Button x:Name=\"btnAbbrechen\" ... Content=\"Abbrechen\" Click=\"btnAbbrechen_Click\" \/&gt;\r\n         &lt;Button x:Name=\"btnSpeichern\" ... Content=\"Speichern\" Click=\"btnSpeichern_Click\" \/&gt;\r\n     &lt;\/Grid&gt;\r\n&lt;\/Window&gt;<\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 1: Benutzerdefinierte Festlegung der Spalten <\/span><\/b><\/p>\n<p>Hier haben wir ein Raster von vier Spalten und sieben Zeilen, wobei die oberen Zeilen f&uuml;r die Beschriftungen und die Felder des Datensatzes und die unteren f&uuml;r Schaltfl&auml;chen zum Speichern und zum Abbrechen der aktuellen &Auml;nderungen vorgesehen sind. Der Entwurf sieht wie in Bild 1 aus. Die Bindung der Felder verl&auml;uft wie schon beim &Uuml;bersichtsfenster, nur dass hier kein DataGrid mit einzelnen Spalten, sondern jeweils unabh&auml;ngige Textfelder und ein Kombinationsfeld zum Einsatz kommen. Die Bindung erfolgt &uuml;ber die entsprechenden Eigenschaften des <b>Kunde<\/b>-Objekts.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2016_04\/pic_51_005.png\" alt=\"Entwurf des Detailfensters\" width=\"349,7426\" height=\"347,5291\"\/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 1: Entwurf des Detailfensters<\/span><\/b><\/p>\n<p>Aus Gr&uuml;nden, die wir sp&auml;ter erl&auml;utern, nutzen wir hier jedoch eine ungebundene Kopie des zu bearbeitenden <b>Kunde<\/b>-Objekts beziehungsweise ein neues <b>Kunde<\/b>-Objekt, wenn ein neuer Kunde angelegt werden soll. Dieses Objekt nennen wir <b>KundeTemp<\/b>. Da wir in der Definition kein &uuml;bergeordnetes Element haben, dem wir das <b>KundeTemp<\/b>-Objekt zuweisen k&ouml;nnen (etwa der <b>ItemsSource<\/b> eines <b>DataGrid<\/b>-Elements), tragen wir die Werte f&uuml;r die Eigenschaft <b>Text <\/b>der <b>Textbox<\/b>-Steuerelemente in der Form <b>{Binding Kunde-Temp.<Eigenschaftsname>} <\/b>ein.<\/p>\n<h2>Kombinationsfeld f&uuml;r die Anreden<\/h2>\n<p>Das Kombinationsfeld zur Anzeige der Anreden f&uuml;llen wir mit mehr als einer Eigenschaft. Das Attribut <b>ItemsSource <\/b>erh&auml;lt den Wert <b>{Binding Anreden}<\/b>, wodurch die Eigenschaft <b>Anreden <\/b>der Code behind-Klasse als Datenherkunft dieses Steuerelements dient.<\/p>\n<p>Damit es den f&uuml;r diesen Kunden festgelegten Eintrag anzeigt, legen wir f&uuml;r das Attribut <b>SelectedItem <\/b>den Wert <b>{Binding KundeTemp.Anreden} <\/b>fest. Dies liefert genau das ben&ouml;tigte <b>Anrede<\/b>-Objekt.<\/p>\n<p>Das Attribut <b>DisplayMemberPath <\/b>gibt an, welche Eigenschaft des enthaltenen Objekts angezeigt werden soll, hier also die Eigenschaft <b>Bezeichnung<\/b>. <b>SelectedValuePath <\/b>erh&auml;lt die Eigenschaft <b>ID<\/b> des gew&auml;hlten <b>Anrede<\/b>-Objekts.<\/p>\n<p>Falls Sie von Access kommen: <b>ItemsSource <\/b>entspricht der <b>Datensatzherkunft<\/b>, <b>SelectedItem <\/b>ist mit der Access-Eigenschaft <b>ItemSelected <\/b>vergleichbar, <b>DisplayMemberPath <\/b>bilden Sie unter Access mit <b>Spaltenanzahl <\/b>und <b>Spaltenbreiten <\/b>ab und <b>SelectedValuePath <\/b>entspricht der Eigenschaft <b>Gebundene Spalte <\/b>bezogen auf die Felder der Datensatzherkunft.<\/p>\n<h2>Beim &Ouml;ffnen des Fensters<\/h2>\n<p>Wenn Sie das Fenster &ouml;ffnen, m&uuml;ssen Sie entscheiden, ob Sie ein neues <b>Kunde<\/b>-Objekt anlegen oder ein vorhandenes bearbeiten m&ouml;chten. Wenn Sie mit Access\/VBA arbeiten, wissen Sie, dass Sie solche Eigenschaften mit dem Befehl zum &Ouml;ffnen des jeweiligen Formulars &uuml;bergeben konnten, beispielsweise mit<\/p>\n<pre>DoCmd.OpenForm \"frmKunde\", DataMode:=acFormAdd<\/pre>\n<p>f&uuml;r einen neuen Datensatz oder <\/p>\n<pre>DoCmd.OpenForm \"frmKunde\", DataMode:=acFormEdit, WhereCondition:=\"ID = \" & KundeID <\/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\/55000051\/\">\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\/55000051?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\/55000051\/\"\/>\n\t\t\t\t<input type=\"hidden\" name=\"rcp_login_nonce\" value=\"41a4e68012\"\/>\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>Wenn Sie aus einer Kunden&uuml;bersicht die Details eines Kunden anzeigen oder einen neuen Kunden anlegen m&ouml;chten, ben&ouml;tigen Sie ein geeignetes weiteres Fenster. Dieses soll die Daten des zu bearbeitenden Kundendatensatzes oder auch einen neuen, leeren Datensatz anzeigen &#8211; je nach Anforderung. Wie Sie dies auf Basis von Daten aus einem Entity Data Model erledigen, zeigt dieser Artikel.<\/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":[662016,66042016,44000002,44000023,44000007],"tags":[],"yst_prominent_words":[],"class_list":["post-55000051","post","type-post","status-publish","format-standard","hentry","category-662016","category-66042016","category-Benutzeroberflaeche_mit_WPF","category-PowerApps","category-Von_Access_zu_WPF"],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/posts\/55000051","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=55000051"}],"version-history":[{"count":0,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/posts\/55000051\/revisions"}],"wp:attachment":[{"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/media?parent=55000051"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/categories?post=55000051"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/tags?post=55000051"},{"taxonomy":"yst_prominent_words","embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/yst_prominent_words?post=55000051"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}