{"id":55000095,"date":"2017-08-01T00:00:00","date_gmt":"2020-03-27T19:27:34","guid":{"rendered":"http:\/\/access-im-unternehmen.aix-dev.de\/aiu\/?p=95"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-30T00:00:00","slug":"Neuer_Eintrag_in_ComboBox","status":"publish","type":"post","link":"https:\/\/vbentwickler.de\/Neuer_Eintrag_in_ComboBox\/","title":{"rendered":"Neuer Eintrag in ComboBox"},"content":{"rendered":"<p><b>Manchmal zeigen Kombinationsfelder einfach nur die verkn&uuml;pften Werte einer Lookup-Tabelle an &#8211; wie beispielsweise bei der Kategorie eines Produktes. Die Tabelle mit den Produkten ist dann &uuml;ber ein Fremdschl&uuml;sselfeld mit der Lookup-Tabelle mit den Kategorien verkn&uuml;pft, wor&uuml;ber dann die gew&uuml;nschte Kategorie ausgew&auml;hlt wird. Was aber, wenn man mal eben einen neuen Wert in die Lookup-Tabelle schreiben will L&auml;sst sich das &uuml;berhaupt erledigen, ohne dass der Benutzer einen Dialog zur Eingabe der Daten der neuen Kategorie &ouml;ffnet Dieser Artikel bringt die Antwort auf diese Frage.<\/b><\/p>\n<p>Unter Access ist dies ein sehr h&auml;ufig genutztes Feature: Wenn ein Kombinationsfeld die Daten eines Lookup-Feldes zur Auswahl angeboten hat und der Benutzer einen neuen Eintrag zu der zugrunde liegenden Tabelle hinzuf&uuml;gen wollte, hat er einfach den gew&uuml;nschten Wert in das Kombinationsfeld eingetragen und schon war der neue Datensatz mit den angegebenen Wert in der Tabelle gespeichert. Dazu gab es ein praktisches Ereignis namens <b>Bei nicht in Liste<\/b>, welches dann etwa mit Code gef&uuml;llt werden konnte, der den Benutzer fragte, ob der neue Eintrag tats&auml;chlich in der Datenbank gespeichert und als neuer Wert genutzt werden sollte. Auch unter WPF und C# sollte es doch eine M&ouml;glichkeit geben, dies zu realisieren.<\/p>\n<p>In unserer Beispielanwendung <b>Bestellverwaltung<\/b> haben wir dies bisher etwas komplizierter f&uuml;r den Benutzer gemacht. Die Daten der Tabelle <b>Kategorien <\/b>konnte der Benutzer f&uuml;r ein Produkt zwar komfortabel per Kombinationsfeld ausw&auml;hlen, aber wenn er einen neuen Eintrag zur Tabelle <b>Kategorien <\/b>hinzuf&uuml;gen wollte, m&uuml;sste er schon noch einen eigenen Dialog &uuml;ber die entsprechende Ribbon-Schaltfl&auml;che aufrufen (siehe Bild 1).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2017_04\/pic_95_001.png\" alt=\"Neue Eintr&auml;ge f&uuml;gt man &uuml;ber einen separaten Dialog hinzu.\" width=\"499,6607\" height=\"379,4268\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 1: Neue Eintr&auml;ge f&uuml;gt man &uuml;ber einen separaten Dialog hinzu.<\/span><\/b><\/p>\n<p>Wir wollen nun sehen, ob wir das Kombinationsfeld so anpassen k&ouml;nnen, dass wir auch durch direkte Eingabe der Bezeichnung der Kategorie in das Kombinationsfeld einen neuen Eintrag zur Tabelle <b>Kategorien <\/b>hinzuf&uuml;gen k&ouml;nnen.<\/p>\n<p>Dazu f&uuml;gen wir dem Ribbon eine Schaltfl&auml;che hinzu, mit der wir ein neues Fenster zum Anlegen eines neuen Produkts &ouml;ffnen wollen. Wir k&ouml;nnten das auch mit dem bereits bestehenden <b>Page<\/b>-Objekt <b>Produktdetails.xaml <\/b>erledigen, aber ein eigenes Fenster ohne die Ereignisse und weiteren Code wird das Beispiel schlicht &uuml;bersichtlicher. Das Fenster wollen wir zum Anzeigen der Details eines bestehenden Produkts und zum Anlegen eines neuen Produkts &ouml;ffnen. Die Schaltfl&auml;chen, welche das Fenster &ouml;ffnen, bringen wir unten in der Seite <b>Produktuebersicht.xaml <\/b>unter. Die erste Schaltfl&auml;che hei&szlig;t <b>btnNeuesProdukt_Window<\/b>, die zweite <b>btnProduktbearbeiten_Window<\/b>.<\/p>\n<p>Also legen wir ein neues Fenster namens <b>Produktdetails_Kombi.xaml <\/b>an. Zur Definition dieses Fensters verwenden wir zun&auml;chst den gleichen <b>.xaml<\/b>-Code wie f&uuml;r das <b>Page<\/b>-Element <b>Produktdetails.xaml<\/b>:<\/p>\n<pre>&lt;Window x:Class=\"Bestellverwaltung.Produktdetails_Kombi\" ... Title=\"Produktdetails_Kombi\" Height=\"300\" Width=\"300\"&gt;\r\n     &lt;Window.Resources&gt;...&lt;\/Window.Resources&gt;\r\n     &lt;Grid x:Name=\"grid1\" HorizontalAlignment=\"Stretch\" Margin=\"8,8,0,0\" VerticalAlignment=\"Top\"&gt;\r\n         \/\/... Grid-Definition der Zeilen und Spalten ...\r\n         &lt;Label Content=\"ID:\" Grid.Column=\"0\" \/&gt;\r\n         &lt;TextBox x:Name=\"txtID\" Text=\"{Binding produkt.ID, Mode=TwoWay, ValidatesOnExceptions=true}\" ... \/&gt;\r\n         &lt;Label Content=\"Bezeichnung:\" ... \/&gt;\r\n         &lt;TextBox x:Name=\"txtBezeichnung\" Text=\"{Binding produkt.Bezeichnung, Mode=TwoWay, ValidatesOnDataErrors=true}\" ... \/&gt;\r\n         &lt;Label Content=\"Kategorie:\" ... \/&gt;\r\n         &lt;ComboBox x:Name=\"cboKategorien\" Grid.Column=\"1\" HorizontalAlignment=\"Stretch\" TabIndex=\"0\"\r\n                     Height=\"24\" Grid.Row=\"2\" \r\n                     ItemsSource=\"{Binding Kategorien}\" \r\n                     SelectedItem=\"{Binding produkt.Kategorien, ValidatesOnDataErrors=True}\" \r\n                     DisplayMemberPath=\"Bezeichnung\" \r\n                     SelectedValuePath=\"ID\"\r\n                     VerticalAlignment=\"Center\" Margin=\"1,4,29,4\"&gt;&lt;\/ComboBox&gt;\r\n         &lt;Label Content=\"Einzelpreis:\" ... \/&gt;\r\n         &lt;TextBox x:Name=\"txtEinzelpreis\" Text=\"{Binding produkt.Einzelpreis, Mode=TwoWay, ValidatesOnDataErrors=True}\" ... \/&gt;\r\n         &lt;Label Content=\"Mehrwertsteuersatz:\" ... \/&gt;\r\n         &lt;TextBox x:Name=\"txtMehrwertsteuersatz\" \r\n             Text=\"{Binding produkt.Mehrwertsteuersatz, Mode=TwoWay, ValidatesOnDataErrors=True}\" ... \/&gt;\r\n         &lt;Label Content=\"Gewicht:\" ... \/&gt;\r\n         &lt;TextBox x:Name=\"txtGewicht\" Text=\"{Binding produkt.Gewicht, Mode=TwoWay, ValidatesOnDataErrors=True}\" ... \/&gt;\r\n         &lt;Label Content=\"Lieferbar:\" ... \/&gt;\r\n         &lt;CheckBox x:Name=\"chkLieferbar\" IsChecked=\"{Binding produkt.Lieferbar, Mode=TwoWay, ValidatesOnDataErrors=True}\" ... \/&gt;\r\n         &lt;StackPanel Orientation=\"Horizontal\" ... &gt;\r\n             &lt;Button x:Name=\"btnSpeichern\" Click=\"btnSpeichern_Click\" Content=\"Speichern\" ... \/&gt;\r\n             &lt;Button x:Name=\"btnVerwerfen\" Click=\"btnVerwerfen_Click\" Content=\"Verwerfen\" ... \/&gt;\r\n         &lt;\/StackPanel&gt;\r\n     &lt;\/Grid&gt;\r\n&lt;\/Window&gt;<\/pre>\n<p>Das Fenster sieht somit wie in Bild 2 aus. Um das Fenster zu &ouml;ffnen, implementieren wir die beiden <b>Click<\/b>-Ereignisse f&uuml;r die auf der Seite <b>Produktuebersicht.xaml <\/b>neu angelegten Schaltfl&auml;chen. Die Methode zum &Ouml;ffnen des Formulars zum Anlegen eines neuen Produkts sieht wie folgt aus:<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2017_04\/pic_95_002.png\" alt=\"Entwurf des Fensters Produktdetails_Kombi.xaml\" width=\"349,7625\" height=\"347,6035\"\/><\/p>\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\/55000095\/\">\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\/55000095?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\/55000095\/\"\/>\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>Manchmal zeigen Kombinationsfelder einfach nur die verkn&uuml;pften Werte einer Lookup-Tabelle an &#8211; wie beispielsweise bei der Kategorie eines Produktes. Die Tabelle mit den Produkten ist dann &uuml;ber ein Fremdschl&uuml;sselfeld mit der Lookup-Tabelle mit den Kategorien verkn&uuml;pft, wor&uuml;ber dann die gew&uuml;nschte Kategorie ausgew&auml;hlt wird. Was aber, wenn man mal eben einen neuen Wert in die Lookup-Tabelle schreiben will L&auml;sst sich das &uuml;berhaupt erledigen, ohne dass der Benutzer einen Dialog zur Eingabe der Daten der neuen Kategorie &ouml;ffnet Dieser Artikel bringt die Antwort auf diese Frage.<\/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":[662017,66042017,44000002,44000034,44000036,44000015],"tags":[],"yst_prominent_words":[],"class_list":["post-55000095","post","type-post","status-publish","format-standard","hentry","category-662017","category-66042017","category-Benutzeroberflaeche_mit_WPF","category-COMAddIns_programmieren","category-Ribbon_programmieren","category-WPFSteuerelemente"],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/posts\/55000095","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=55000095"}],"version-history":[{"count":0,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/posts\/55000095\/revisions"}],"wp:attachment":[{"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/media?parent=55000095"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/categories?post=55000095"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/tags?post=55000095"},{"taxonomy":"yst_prominent_words","embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/yst_prominent_words?post=55000095"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}