{"id":55000058,"date":"2016-10-01T00:00:00","date_gmt":"2020-03-27T19:22:44","guid":{"rendered":"http:\/\/access-im-unternehmen.aix-dev.de\/aiu\/?p=58"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-30T00:00:00","slug":"EDM_Kombinationsfelder_erweitern","status":"publish","type":"post","link":"https:\/\/vbentwickler.de\/EDM_Kombinationsfelder_erweitern\/","title":{"rendered":"EDM: Kombinationsfelder erweitern"},"content":{"rendered":"<p><b>Im Artikel &#8220;Lookup-Kombinationsfelder&#8221; zeigen wir, wie Sie eine per Drag and Drop aus dem Datenquellen-Bereich hinzugef&uuml;gte Entit&auml;t mit einem Kombinationsfeld versehen, mit dem Sie die Daten einer Lookup-Tabelle ausw&auml;hlen k&ouml;nnen. Dies wollen wir nun noch erweitern, und zwar um die M&ouml;glichkeit der Eingabe neuer Werte f&uuml;r die Lookup-Tabelle direkt &uuml;ber das Kombinationsfeld. Dazu nutzen wir ein neues Fenster, das die Daten der Tabelle Artikel anzeigt &#8211; und deren Kategorie per Kombinationsfeld ausw&auml;hlt.<\/b><\/p>\n<h2>Neuen Eintrag hinzuf&uuml;gen<\/h2>\n<p>Unter Access war es relativ einfach, ein Kombinationsfeld mit einer Funktion auszustatten, die daf&uuml;r sorgte, dass neu eingegebene Eintr&auml;ge, die noch nicht in der Datensatzherkunft vorhanden waren, zur zugrunde liegenden Tabelle hinzugef&uuml;gt werden und dann direkt im Kombinationsfeld angezeigt werden konnten. Wir wollen uns anschauen, wie dies unter WPF unter Verwendung unseres Entity Data Models auf Basis der Tabellen der Beispieldatenbank <b>Bestellverwaltung <\/b>funktioniert. Ein passendes Beispiel sind die Tabellen <b>Artikel <\/b>und <b>Kategorien<\/b>. Die Tabelle <b>Artikel <\/b>enth&auml;lt ein Fremdschl&uuml;sselfeld, und zwar zur Auswahl der Kategorie des Artikels. Die Kategorien stammen wiederum aus der Tabelle <b>Kategorien<\/b>.<\/p>\n<p>F&uuml;r das neue Beispiel f&uuml;gen wir der Datenquelle des Projekts die Entit&auml;t <b>Artikel <\/b>hinzu. Ein neues Fenster soll die Daten der gleichnamigen Tabelle anzeigen. Dazu &auml;ndern wir den Typ der Entit&auml;t <b>Artikel <\/b>per Kombinationsfeld auf <b>Details <\/b>und den Typ des Steuerelements <b>KategorieID <\/b>auf <b>ComboBox<\/b>. Dann ziehen Sie die Entit&auml;t <b>Artikel <\/b>in das neue Fenster <b>ArtikelMitKombinationsfeld <\/b>und sortieren die enthaltenen Steuerelemente so wie in Bild 1 um. Damit die Daten auch im Fenster angezeigt werden, sind in aller K&uuml;rze die folgenden Schritte n&ouml;tig:<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2016_05\/pic_58_005.png\" alt=\"Erstellen des Beispielfensters\" width=\"599,593\" height=\"312,5356\"\/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 1: Erstellen des Beispielfensters<\/span><\/b><\/p>\n<ul>\n<li>Als Erstes &auml;ndern Sie den Entwurf im XAML-Code wie in Listing 1 dargestellt. Hier kommen vor allem die neue <b>CollectionViewSource <\/b>f&uuml;r die Kategorien und die &Auml;nderungen am <b>ComboBox<\/b>-Element zum Tragen.<\/li>\n<pre>&lt;Window x:Class=\"BlaetternInDetails.ArtikelMitKombinationsfeld\" ...\r\n         Title=\"ArtikelMitKombinationsfeld\" Height=\"250\" Width=\"300\" Loaded=\"Window_Loaded\"&gt;\r\n     &lt;Window.Resources&gt;\r\n         &lt;CollectionViewSource x:Key=\"artikelViewSource\" \r\n             d:DesignSource=\"{d:DesignInstance {x:Type local:Artikel}, CreateList=True}\"\/&gt;\r\n         &lt;CollectionViewSource x:Key=\"kategorienViewSource\" \r\n             d:DesignSource=\"{d:DesignInstance {x:Type local:Kategorie}, CreateList=True}\"\/&gt;\r\n     &lt;\/Window.Resources&gt;\r\n     &lt;Grid DataContext=\"{StaticResource artikelViewSource}\"&gt;\r\n         &lt;Grid x:Name=\"grid1\" HorizontalAlignment=\"Left\" Margin=\"22,11,0,0\" VerticalAlignment=\"Top\"&gt;\r\n             ...\r\n             &lt;ComboBox x:Name=\"kategorieIDComboBox\" ItemsSource=\"{Binding Source={StaticResource kategorienViewSource}}\" \r\n                 DisplayMemberPath=\"Bezeichnung\" SelectedValuePath=\"ID\" SelectedValue=\"{Binding Path=KategorieID}\"&gt;\r\n             &lt;\/ComboBox&gt;\r\n             ...\r\n         &lt;\/Grid&gt;\r\n     &lt;\/Grid&gt;\r\n&lt;\/Window&gt;<\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 1: Notwendige &Auml;nderungen am Fenster zur Anzeige von Artikeln mit Kategorien im Kombinationsfeld<\/span><\/b><\/p>\n<li>Dann erweitern Sie den Code des Code behind-Moduls wie in Listing 2. Hier ist die Deklaration der beiden <b>CollectionViewSource<\/b>-Elemente und des Datenbankkontexts sowie deren F&uuml;llung im Ereignis <b>Window_Loaded<\/b>, das &uuml;brigens auch im XAML-Code noch hinzugef&uuml;gt werden muss. Details hierzu erfahren Sie im Artikel <b>EDM: Einfaches Detailfenster<\/b>.<\/li>\n<pre>public partial class ArtikelMitKombinationsfeld : Window {\r\n     public ArtikelMitKombinationsfeld() {\r\n         InitializeComponent();\r\n     }\r\n     CollectionViewSource artikelViewSource;\r\n     CollectionViewSource kategorienViewSource;\r\n     BestellverwaltungEntities DBContext = new BestellverwaltungEntities();\r\n     private void Window_Loaded(object sender, RoutedEventArgs e) {\r\n         artikelViewSource = ((CollectionViewSource)(this.FindResource(\"artikelViewSource\")));\r\n         DBContext.Artikel.Load();\r\n         artikelViewSource.Source = DBContext.Artikel.Local;\r\n         kategorienViewSource = ((CollectionViewSource)(this.FindResource(\"kategorienViewSource\")));\r\n         DBContext.Kategorien.Load();\r\n         kategorienViewSource.Source = DBContext.Kategorien.Local;\r\n     }\r\n}<\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 2: Anpassung der Code behind-Klasse des Fensters<\/span><\/b><\/p>\n<\/ul>\n<p>Auf die Beschreibung der Navigationsschaltfl&auml;chen verzichten wir an dieser Stelle &#8211; wie dies funktioniert, haben wir ebenfalls im Artikel <b>EDM: Einfaches Detailfenster <\/b>erl&auml;utert.<\/p>\n<h2>ComboBox zum Hinzuf&uuml;gen von Artikeln<\/h2>\n<p>Nun schauen wir uns an, wie wir dem Kombinationsfeld einen neuen Eintrag unterjubeln k&ouml;nnen, der dann optimalerweise direkt in der zugrunde liegenden Tabelle <b>Kategorien <\/b>gespeichert wird. Wenn wir die Anwendung starten und in unserem Beispielfenster versuchen, wie etwa unter Access eine neue Kategorie einzugeben, stellen wir allerdings fest, dass ein <b>ComboBox<\/b>-Steuerelement wohl nicht zum Hinzuf&uuml;gen von Daten gemacht ist (siehe Bild 2). Was nun Ein anderes Steuerelement w&auml;hlen Oder gibt es Einstellungen f&uuml;r das <b>ComboBox<\/b>-Steuerelement, die das Hinzuf&uuml;gen von eigenen Texten erm&ouml;glichen Schauen wir uns doch zun&auml;chst eine einfache und auch f&uuml;r den Benutzer intuitive Variante an, bei der wir neben dem Kombinationsfeld eine Schaltfl&auml;che zum Hinzuf&uuml;gen eines Eintrags platzieren. Anschlie&szlig;end betrachten wir die direkte Eingabe neuer Elemente direkt in das Kombinationsfeld.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2016_05\/pic_58_001.png\" alt=\"Das ComboBox-Steuerelement erlaubt nur die Auswahl, aber kein Anf&uuml;gen von Eintr&auml;gen.\" width=\"299,7964\" height=\"265,1092\"\/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 2: Das ComboBox-Steuerelement erlaubt nur die Auswahl, aber kein Anf&uuml;gen von Eintr&auml;gen.<\/span><\/b><\/p>\n<h2>Eintr&auml;ge hinzuf&uuml;gen per Schaltfl&auml;che<\/h2>\n<p>Das Anbieten einer Schaltfl&auml;che mit einem Plus-Symbol scheint die offensichtlichere und intuitivere Variante zu sein, um Elemente zu einem Lookup-Kombinationsfeld hinzuzuf&uuml;gen. Nach einem Klick auf diese Schaltfl&auml;che soll eine Inputbox erscheinen, die den neuen Eintrag ermittelt (siehe Bild 3). Nach der Eingabe soll die Datenherkunft des Kombinationsfeldes direkt aktualisiert und der neue Eintrag &uuml;bernommen werden, sodass das Kombinationsfeld diesen direkt anzeigt.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2016_05\/pic_58_006.png\" alt=\"Kombinationsfeld mit Schaltfl&auml;che zum Hinzuf&uuml;gen neuer Eintr&auml;ge\" width=\"549,6265\" height=\"298,0153\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 3: Kombinationsfeld mit Schaltfl&auml;che zum Hinzuf&uuml;gen neuer Eintr&auml;ge<\/span><\/b><\/p>\n<p>Im Entwurf des Fensters <b>ArtikelMitKombinationsfeld_Button<\/b> sieht dies wie in Bild 4 aus. Hier haben wir neben dem Kombinationsfeld eine neue Schaltfl&auml;che hinzugef&uuml;gt, die wir mit einigen neuen Attributwerten ausgestattet haben.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2016_05\/pic_58_004.png\" alt=\"Schaltfl&auml;che zum Hinzuf&uuml;gen neuer Eintr&auml;ge\" width=\"424,7115\" height=\"304,0548\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 4: Schaltfl&auml;che zum Hinzuf&uuml;gen neuer Eintr&auml;ge<\/span><\/b><\/p>\n<p>Die Definition sehen Sie in Listing 3. Wie Sie hier erkennen, haben wir nicht nur einfach eine Schaltlf&auml;che hinzugef&uuml;gt, sondern diese noch zusammen mit dem <b>ComboBox<\/b>-Element in einem <b>StackPanel <\/b>zusammengefasst. Dieses weist f&uuml;r die Eigenschaft <b>Orientation <\/b>den Wert <b>Horizontal <\/b>auf und soll in der gleichen Grid-Zeile landen wie zuvor das Kombinationsfeld. Zu den Ressourcen des Grids haben wir au&szlig;erdem noch einen Verweis auf die Datei <b>add.png <\/b>hinzugef&uuml;gt, welche wir nat&uuml;rlich auch im Projekt gespeichert haben, und mit dem <b>Key<\/b>-Wert <b>add <\/b>versehen.<\/p>\n<pre>&lt;Window x:Class=\"BlaetternInDetails.ArtikelMitKombinationsfeld_Button\"\r\n         Title=\"ArtikelMitKombinationsfeld_Button\" Height=\"250\" Width=\"350\" Loaded=\"Window_Loaded\" Closing=\"Window_Closing\"&gt;\r\n     ...\r\n     &lt;Grid DataContext=\"{StaticResource artikelViewSource}\"&gt;\r\n         &lt;Grid.Resources&gt;\r\n             &lt;Image x:Key=\"add\" Source=\"add.png\"&gt;&lt;\/Image&gt;\r\n         &lt;\/Grid.Resources&gt;\r\n         &lt;Grid x:Name=\"grid1\" HorizontalAlignment=\"Left\" Margin=\"22,11,0,0\" VerticalAlignment=\"Top\" Width=\"282\"&gt;\r\n             ...\r\n             &lt;StackPanel Grid.Column=\"1\" Grid.Row=\"2\" Orientation=\"Horizontal\"&gt;\r\n                 &lt;ComboBox x:Name=\"cboKategorien\" \r\n                     HorizontalAlignment=\"Left\" Height=\"Auto\" \r\n                     ItemsSource=\"{Binding Source={StaticResource kategorienViewSource}}\" \r\n                     DisplayMemberPath=\"Bezeichnung\" SelectedValuePath=\"ID\" \r\n                     SelectedValue=\"{Binding Path=KategorieID}\" \r\n                     Margin=\"3\" VerticalAlignment=\"Center\" Width=\"120\"&gt;\r\n                 &lt;\/ComboBox&gt;\r\n                 &lt;Button x:Name=\"btnAdd\" Content=\"{StaticResource add}\" Grid.Row=\"2\" Grid.Column=\"1\" \r\n                     Width=\"16\" Height=\"16\" HorizontalAlignment=\"Right\" Background=\"Transparent\" \r\n                     BorderThickness=\"0\" Click=\"btnAdd_Click\"&gt;&lt;\/Button&gt;\r\n             &lt;\/StackPanel&gt;\r\n     ...\r\n     &lt;\/Grid&gt;\r\n&lt;\/Window&gt;<\/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\/55000058\/\">\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\/55000058?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\/55000058\/\"\/>\n\t\t\t\t<input type=\"hidden\" name=\"rcp_login_nonce\" value=\"9f18b59416\"\/>\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>Im Artikel &#8220;Lookup-Kombinationsfelder&#8221; zeigen wir, wie Sie eine per Drag and Drop aus dem Datenquellen-Bereich hinzugef&uuml;gte Entit&auml;t mit einem Kombinationsfeld versehen, mit dem Sie die Daten einer Lookup-Tabelle ausw&auml;hlen k&ouml;nnen. Dies wollen wir nun noch erweitern, und zwar um die M&ouml;glichkeit der Eingabe neuer Werte f&uuml;r die Lookup-Tabelle direkt &uuml;ber das Kombinationsfeld. Dazu nutzen wir ein neues Fenster, das die Daten der Tabelle Artikel anzeigt &#8211; und deren Kategorie per Kombinationsfeld ausw&auml;hlt.<\/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,66052016,44000002,44000021,44000025,44000015],"tags":[],"yst_prominent_words":[],"class_list":["post-55000058","post","type-post","status-publish","format-standard","hentry","category-662016","category-66052016","category-Benutzeroberflaeche_mit_WPF","category-Entity_Framework","category-VBAProgrammierung","category-WPFSteuerelemente"],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/posts\/55000058","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=55000058"}],"version-history":[{"count":0,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/posts\/55000058\/revisions"}],"wp:attachment":[{"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/media?parent=55000058"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/categories?post=55000058"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/tags?post=55000058"},{"taxonomy":"yst_prominent_words","embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/yst_prominent_words?post=55000058"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}