{"id":55000076,"date":"2017-02-01T00:00:00","date_gmt":"2020-03-27T19:25:02","guid":{"rendered":"http:\/\/access-im-unternehmen.aix-dev.de\/aiu\/?p=76"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-30T00:00:00","slug":"Bestellverwaltung_planen","status":"publish","type":"post","link":"https:\/\/vbentwickler.de\/Bestellverwaltung_planen\/","title":{"rendered":"Bestellverwaltung planen"},"content":{"rendered":"<p><b>Unsere Bestellverwaltung w&auml;chst weiter. Wir haben bereits eine &Uuml;bersicht der Kunden und eine Detailansicht, mit der Sie Kunden anzeigen oder neue Kunden anlegen k&ouml;nnen. Nun sollen noch &Uuml;bersichten und Detailansichten f&uuml;r Produkte, Kategorien und weitere Elemente hinzukommen. Hier sind nun einige grunds&auml;tzliche Entscheidungen bez&uuml;glich des Aufbaus der Anwendung zu treffen &#8211; zum Beispiel, wie das Ribbon erweitert werden soll oder wie nach dem &Auml;ndern oder Anlegen neuer Datens&auml;tze verfahren werden soll. Au&szlig;erdem wollen wir bei der Verwaltung der Kunden noch ein paar Anpassungen durchf&uuml;hren, bevor wir die &uuml;brigen Ansichten nach einem &auml;hnlichen Schema aufbauen.<\/b><\/p>\n<h2>Beispieldaten<\/h2>\n<p>Als Beispielprojekt verwenden wir weiterhin das Projekt <b>Bestellverwaltung_SQLite<\/b>, das Sie im Download etwa des Beitrags <b>EDM: 1:n-Beziehungen mit DataGrid <\/b>finden.<\/p>\n<h2>Aktueller Stand<\/h2>\n<p>Der Stand vor dieser Ausgabe enth&auml;lt ein kleines Ribbon mit drei Schaltfl&auml;chen, welche die Befehle zum &Ouml;ffnen der Kunden&uuml;bersicht, zum &Ouml;ffnen eines Detailformulars zum Anlegen eines neuen Kunden und zum L&ouml;schen des aktuell in der Kunden&uuml;bersicht markierten Datensatzes anzeigt. An der Schaltfl&auml;che <b>Kunde l&ouml;schen <\/b>haben wir gezeigt, wie Sie in Abh&auml;ngigkeit des im <b>Frame<\/b>-Objekt angezeigten <b>Page<\/b>-Element Steuerelemente im Ribbon aktivieren und deaktivieren k&ouml;nnen.<\/p>\n<p>Die Schaltfl&auml;che sollte aktiviert werden, wenn die Kunden&uuml;bersicht im <b>Frame<\/b>-Element angezeigt wurde, und deaktiviert werden, wenn ein anderes <b>Page<\/b>-Element im <b>Frame<\/b>-Element zu sehen war &#8211; oder gar keins.<\/p>\n<p>Einen bestehenden Kunden konnten Sie anzeigen, indem Sie erst die Kunden&uuml;bersicht ge&ouml;ffnet und dann doppelt auf einen der Eintr&auml;ge geklickt haben. Das nun erscheinende Detailformular enthielt auch zwei Schaltfl&auml;chen namens <b>Speichern <\/b>und <b>Abbrechen <\/b>(siehe Bild 1). Die <b>Speichern<\/b>-Schaltfl&auml;che hat die Daten gespeichert und die <b>Page <\/b>geschlossen, die <b>Abbrechen<\/b>-Schaltfl&auml;che hat die <b>Page <\/b>geschlossen, ohne zu speichern. In beiden F&auml;llen wurde danach wieder die Seite mit der Kunden&uuml;bersicht aufgerufen, wobei der soeben bearbeitete Kunde markiert wurde.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2017_01\/pic_76_003.png\" alt=\"&Uuml;bersicht der Kategorien\" width=\"649,559\" height=\"365,7711\"\/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 1: &Uuml;bersicht der Kategorien<\/span><\/b><\/p>\n<h2>Neue Elemente<\/h2>\n<p>In dieser Ausgabe wollen wir der Anwendung weitere &Uuml;bersichten und Detailansichten hinzuf&uuml;gen. Zun&auml;chst einmal w&auml;re da die Produkt&uuml;bersicht mit dem jeweiligen Detailformular zur Anzeige eines Produkts. Diese beiden <b>Page<\/b>-Elemente unterscheiden sich nicht von denen zur Anzeige der Kunden-&Uuml;bersicht und der Kundendetails.<\/p>\n<p>Wir haben diese aber hinzugef&uuml;gt, weil wir die Produkte noch in einer anderen Ansicht anzeigen m&ouml;chten, und zwar in einer Kategorie-Detailansicht (mit der nat&uuml;rlich eine passende Kategorien-&Uuml;bersicht kommt). Die Kategorie-Detailansicht soll nicht nur die Kategorie und die beiden Eigenschaften <b>ID <\/b>und <b>Bezeichnung <\/b>anzeigen, sondern auch die Produkte, die zu der jeweiligen Kategorie geh&ouml;ren (siehe Bild 2).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2017_01\/pic_76_001.png\" alt=\"Kategorie-Details mit zugeh&ouml;rigen Produkten\" width=\"499,6607\" height=\"329,3996\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 2: Kategorie-Details mit zugeh&ouml;rigen Produkten<\/span><\/b><\/p>\n<h2>Von der &Uuml;bersicht zum Detail und wieder zur&uuml;ck<\/h2>\n<p>Wir wollen nun sowohl in der &Uuml;bersicht der Produkte als auch in der Liste der Produkte in der Kategorie-Detailansicht die M&ouml;glichkeit bieten, ein Produkt per Doppelklick in der Detailansicht anzuzeigen. Das ist kein Problem, wir k&ouml;nnen dabei wie schon bei der Kunden&uuml;bersicht vorgehen. Was aber geschieht, wenn wir in der Produkt-Detailansicht auf die Schaltfl&auml;che <b>Speichern <\/b>oder <b>Abbrechen <\/b>klicken Bei der Kunden-Detailansicht haben wir einfach die Kunden&uuml;bersicht angezeigt und den zuletzt ge&ouml;ffneten Kunden markiert.<\/p>\n<p>Nun haben wir aber zwei Produkt&uuml;bersichten (die eigentliche &Uuml;bersicht und die &Uuml;bersicht in den Kategorie-Details), von denen aus die Produkt-Detailansicht ge&ouml;ffnet worden sein k&ouml;nnte. Wir haben nun zum Beispiel die folgenden M&ouml;glichkeiten:<\/p>\n<ul>\n<li>Wir f&uuml;gen in den Konstruktor des <b>Page<\/b>-Elements <b>Produktdetails.xaml <\/b>einen Parameter ein, dem wir den Namen des aufrufenden <b>Page<\/b>-Elements mitgeben, und zeigen dieses nach dem Schlie&szlig;en der Produktdetails wieder an.<\/li>\n<li>Wir &auml;ndern die Funktion der beiden Schaltfl&auml;chen <b>Speichern <\/b>und <b>Abbrechen<\/b>, sodass diese nicht mehr das <b>Page<\/b>-Element <b>Produktdetails.xaml <\/b>ausblenden. Die <b>Speichern<\/b>-Schaltfl&auml;che sollte dann nur noch das aktuell angezeigte Produkt speichern, die <b>Abbrechen<\/b>-Schaltfl&auml;che k&ouml;nnte dann entfallen. Oder man ersetzt die <b>Abbrechen<\/b>-Schaltfl&auml;che durch eine <b>Verwerfen<\/b>-Schaltfl&auml;che, welche den Zustand vor den &Auml;nderungen wieder herstellt. Hier w&auml;re es dann sinnvoll, wenn die <b>Speichern<\/b>-Schaltfl&auml;che nur aktiviert wird, wenn es tats&auml;chlich &Auml;nderungen gegeben hat.<\/li>\n<li>Wir nutzen die Eigenschaften des <b>Frame<\/b>-Elements, das ja das Navigieren zum n&auml;chsten oder vorherigen Element erlaubt.<\/li>\n<\/ul>\n<p>Grunds&auml;tzlich sollten wir hier auch noch eine Funktion einf&uuml;gen, die den Benutzer beim Wechsel zu einer anderen Ansicht ohne vorheriges Speichern darauf hinweist, dass eventuell vorgenommene &Auml;nderungen noch nicht gespeichert wurden.<\/p>\n<p>Wir entscheiden uns f&uuml;r die folgende Vorgehensweise: Wir nutzen die Navigationsm&ouml;glichkeiten des <b>Frame<\/b>-Elements kombiniert mit je zwei Schaltfl&auml;chen auf jeder Detailansicht, welche die Beschriftungen <b>Speichern <\/b>und <b>Verwerfen <\/b>enthalten.<\/p>\n<p>Dr&uuml;ckt der Benutzer eine dieser Schaltfl&auml;chen, wird das zuvor angezeigte <b>Page<\/b>-Element angezeigt, was das aufrufende Element sein d&uuml;rfte &#8211; im Falle der Produkt-Detailseite also etwa die Produkt-&Uuml;bersicht oder die Kategorie-Detailseite mit der Liste der verkn&uuml;pften Produkte.<\/p>\n<p>Sollte der Benutzer die Navigationsschaltfl&auml;chen zum Zur&uuml;ckspringen nutzen, ohne auf eine der Schaltfl&auml;chen <b>Speichern <\/b>oder <b>Verwerfen <\/b>zu klicken, soll eine Meldung erscheinen, die den Benutzer fragt, ob die &Auml;nderungen gespeichert oder verworfen werden sollen. Die Schaltfl&auml;chen sollen nur aktiviert werden, wenn &Auml;nderungen stattgefunden haben, dementsprechend soll die Meldung auch nur in diesem Fall erscheinen.<\/p>\n<h2>Markieren des zuletzt bearbeiteten Eintrags<\/h2>\n<p>Im bisherigen Stand des Projekts haben wir im Falle des &Auml;nderns oder Neuanlegens eines Kunden im <b>Page<\/b>-Element <b>Kundendetails.xaml <\/b>beim Schlie&szlig;en ein Ereignis ausgel&ouml;st, welches das Objekt mit dem aktuellen Kunden bereitstellt. Dieses haben wir im &uuml;bergeordneten <b>MainWindow <\/b>implementiert. So konnten wir, wenn ein Kunde ge&auml;ndert oder hinzugef&uuml;gt wurde, gleich die Kunden&uuml;bersicht anzeigen und dort den ge&auml;nderten oder hinzugef&uuml;gten Kunden markieren. Dieses Verhalten wollen wir auch beibehalten.<\/p>\n<h2>L&ouml;schen-Schaltfl&auml;chen<\/h2>\n<p>Auch &uuml;ber die <b>L&ouml;schen<\/b>-Schaltfl&auml;chen sollten wir uns Gedanken machen. Wenn wir f&uuml;r jede Entit&auml;t nun jeweils eine Schaltfl&auml;che zum Anzeigen der &Uuml;bersicht, zum Anlegen eines neuen Datensatzes und zum L&ouml;schen des jeweils markierten Datensatzes hinzuf&uuml;gen, nimmt das erstens Platz im Ribbon weg. Zweitens m&uuml;ssen wir zum Aktivieren und Deaktivieren der <b>L&ouml;schen<\/b>-Schaltfl&auml;chen mehr und mehr Code zum Code behind-Modul des Fensters <b>MainWindow.xaml <\/b>hinzuf&uuml;gen. Wir entscheiden an dieser Stelle, die Schaltfl&auml;chen direkt in die jeweiligen <b>Page<\/b>-Elemente zu verlagern, sodass sie direkt an Ort und Stelle aktiviert und deaktiviert werden k&ouml;nnen.<\/p>\n<h2>Hinzuf&uuml;gen-Schaltfl&auml;chen<\/h2>\n<p>Und letztlich nehmen wir auch etwas Komplexit&auml;t aus dem Code, wenn wir auch eine Schaltfl&auml;che zum Hinzuf&uuml;gen eines neuen Elements direkt auf der Page mit der &Uuml;bersicht anlegen. Auf diese Weise k&ouml;nnen die Detailansichten der jeweiligen Entit&auml;ten zum Hinzuf&uuml;gen auch nur von der entsprechenden &Uuml;bersicht aus ge&ouml;ffnet werden, was dazu f&uuml;hrt, dass wir nach dem Speichern oder Verwerfen der &Auml;nderungen am neuen Datensatz auf jeden Fall wieder zu der aufrufenden &Uuml;bersicht zur&uuml;ckkehren. Gleicherma&szlig;en wollen wir aber auch die M&ouml;glichkeit bieten, ohne Umweg &uuml;ber die &Uuml;bersicht einen neuen Datensatz der jeweiligen Entit&auml;t anzulegen und behalten die entsprechenden Eintr&auml;ge im Ribbon bei.<\/p>\n<h2>Zusammenh&auml;nge zwischen XAML, C# und den verschiedenen Ansichten und Ereignissen<\/h2>\n<p>Auch wenn wir erst wenige Bereiche wie die Kunden&uuml;bersicht und die Kundendetailansicht zu unserer L&ouml;sung hinzugef&uuml;gt haben, m&ouml;chten wir einen kleinen Zwischenstopp machen und uns den aktuellen Stand inklusive der oben erw&auml;hnten &Auml;nderungen ansehen. Dazu haben wir ein paar &Uuml;bersichten erstellt, welche die einzelnen Abl&auml;ufe in der Anwendung vorstellen. Diese zeigen wir in den n&auml;chsten Abschnitten. Auf Basis der hier beschriebenen Abl&auml;ufe wollen wir auch die Seiten f&uuml;r weitere Elemente wie die Kategorien und die Produkte aufbauen.<\/p>\n<h2>Anzeigen der &Uuml;bersicht<\/h2>\n<p>Der erste Schritt beim Arbeiten mit den Kunden d&uuml;rfte die Anzeige der Kunden&uuml;bersicht sein (siehe Bild 3). Die Anwendung startet mit der Anzeige des nackten Ribbons, das <b>Frame<\/b>-Element im unteren Bereich zeigt noch keine Elemente an. Wenn der Benutzer nun auf die Schaltfl&auml;che <b>cmdKundenuebersicht <\/b>klickt, l&ouml;st er das Ereignis <b>cmdKundenuebersicht_Click <\/b>aus <b>(1)<\/b>.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2017_01\/ansicht001.pdf\" alt=\"Vorgang beim &Ouml;ffnen der &Uuml;bersicht\" width=\"700\" height=\"507,3872\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 3: Vorgang beim &Ouml;ffnen der &Uuml;bersicht<\/span><\/b><\/p>\n<p>Dieses haben wir in der Code behind-Klasse mit der Ereignismethode <b>btnKundenuebersicht_Click <\/b>implementiert <b>(2)<\/b>. Die Methode ruft eine weitere Methode namens <b>ShowKundenuebersicht <\/b>auf <b>(3)<\/b>. Dies hat den Hintergrund, dass wir diese Methode noch von anderen Stellen aus aufrufen wollen.<\/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\/55000076\/\">\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\/55000076?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\/55000076\/\"\/>\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>Unsere Bestellverwaltung w&auml;chst weiter. Wir haben bereits eine &Uuml;bersicht der Kunden und eine Detailansicht, mit der Sie Kunden anzeigen oder neue Kunden anlegen k&ouml;nnen. Nun sollen noch &Uuml;bersichten und Detailansichten f&uuml;r Produkte, Kategorien und weitere Elemente hinzukommen. Hier sind nun einige grunds&auml;tzliche Entscheidungen bez&uuml;glich des Aufbaus der Anwendung zu treffen &#8211; zum Beispiel, wie das Ribbon erweitert werden soll oder wie nach dem &Auml;ndern oder Anlegen neuer Datens&auml;tze verfahren werden soll. Au&szlig;erdem wollen wir bei der Verwaltung der Kunden noch ein paar Anpassungen durchf&uuml;hren, bevor wir die &uuml;brigen Ansichten nach einem &auml;hnlichen Schema aufbauen.<\/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":[66012017,662017,44000002,44000027,44000004],"tags":[],"yst_prominent_words":[],"class_list":["post-55000076","post","type-post","status-publish","format-standard","hentry","category-66012017","category-662017","category-Benutzeroberflaeche_mit_WPF","category-Excel_programmieren","category-Loesungen"],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/posts\/55000076","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=55000076"}],"version-history":[{"count":0,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/posts\/55000076\/revisions"}],"wp:attachment":[{"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/media?parent=55000076"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/categories?post=55000076"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/tags?post=55000076"},{"taxonomy":"yst_prominent_words","embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/yst_prominent_words?post=55000076"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}