{"id":55000050,"date":"2016-08-01T00:00:00","date_gmt":"2020-03-27T19:21:41","guid":{"rendered":"http:\/\/access-im-unternehmen.aix-dev.de\/aiu\/?p=50"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-30T00:00:00","slug":"WPFEDM_Kundenuebersicht","status":"publish","type":"post","link":"https:\/\/vbentwickler.de\/WPFEDM_Kundenuebersicht\/","title":{"rendered":"WPF\/EDM: Kunden&uuml;bersicht"},"content":{"rendered":"<p><b>WPF-Fenster k&ouml;nnen zwar auch Daten ADO.NET-Datenquellen anzeigen, aber optimal sind sie f&uuml;r den Zugriff auf Daten aus einem Entity Data Model vorbereitet. Dieser Artikel zeigt, wie Sie die per Entity Data Model abgebildeten Daten aus einer Haupt- und einer Lookup-Tabelle in einem WPF-Fenster anzeigen. Dabei soll das Fenster die Navigation durch die Datens&auml;tze und auch das Anlegen neuer Datens&auml;tze erm&ouml;glichen. Im Vergleich zu einem fr&uuml;heren Artikel zeigen wir nun, wie Sie die Aufgabe manuell erledigen, also ohne die Unterst&uuml;tzung von Assistenten.<\/b><\/p>\n<p>Um eine datenbankbasierte WPF-Anwendung zu erstellen, legen Sie zun&auml;chst ein neues Projekt auf Basis der Vorlage Visual C#|WPF-Anwendung an.<\/p>\n<p>Dann f&uuml;gen Sie ein Entity Data Model auf Basis unserer Beispieldatenbank Bestellverwaltung hinzu, wie es im Artikel Entity Data Model f&uuml;r eine Datenbank erstellen im Detail beschrieben wird. Hier die Kurzform ohne Screenshots und Umwege:<\/p>\n<ul>\n<li>Bet&auml;tigen Sie die Tastenkombination Strg + Umschalt + A und w&auml;hlen Sie im Dialog Neues Element hinzuf&uuml;gen den Eintrag ADO.NET Entity Data Model aus. Geben Sie als Name BestellverwaltungModel an und klicken Sie auf Hinzuf&uuml;gen.<\/li>\n<li>Behalten Sie im Dialog Assistent f&uuml;r Entity Data Model den Wert EF Designer aus Datenbank bei und klicken Sie auf Weiter.<\/li>\n<li>Klicken Sie unter W&auml;hlen Sie Ihre Datenbankverbindung aus auf Neue Verbindung &#8230; und w&auml;hlen Sie dort Microsoft SQL Server aus.<\/li>\n<li>Geben Sie im Dialog Verbindungseigenschaften den Servernamen ein (zum Beispiel (localdb)\\v11.0 oder (localdb)\\mssqllocaldb, wenn Sie LocalDB verwenden).<\/li>\n<li>W&auml;hlen Sie die Datenbank aus oder geben Sie die anzuh&auml;ngende Datenbankdatei an. Testen Sie die Verbindung und klicken Sie auf OK.<\/li>\n<li>Zur&uuml;ck im Assistent f&uuml;r Entity Data Model best&auml;tigen Sie den Namen f&uuml;r die Verbindungseinstellungen (hier BestellverwaltungEntities).<\/li>\n<li>Wenn Sie m&ouml;chten, best&auml;tigen Sie die Frage, ob Sie die Datenbankdatei zum Projekt hinzuf&uuml;gen m&ouml;chten.<\/li>\n<li>Behalten Sie Entity Framework 6.x als Version bei.<\/li>\n<li>W&auml;hlen Sie alle gew&uuml;nschten Tabellen aus und geben Sie den Namen f&uuml;r den Modellnamespace an (hier BestellverwaltungModel).<\/li>\n<li>Klicken Sie auf Fertigstellen. Das Entity Data Model wird nun erstellt.<\/li>\n<\/ul>\n<p>Nun nehmen Sie noch eventuell n&ouml;tige &Auml;nderungen an den Namen der Entit&auml;ten oder den Namen der Entit&auml;tsmengen vor. Die Beispieldatenbank verwendet Tabellen mit Namen im Singular. Sie sollten daher die Eigenschaft Name der Entit&auml;tenmenge f&uuml;r alle Entit&auml;ten &uuml;ber das Modelldiagramm (hier Bestellverwaltungmodel.edmx) auf die Pluralform einstellen (also Kategorien statt Kategorie und so weiter). Anschlie&szlig;endes Speichern aktualisiert den Code. F&uuml;r dieses Beispiel arbeiten wir mit den Tabellen Kunden und Anreden, wobei wir als Namen f&uuml;r die Entit&auml;tenmengen die Namen Kunden und Anreden &uuml;bernehmen und die Entit&auml;tsklassen selbst mit Kunde und Anrede benennen.<\/p>\n<p>Um die Namen der Entit&auml;tsklassen anzupassen, &ouml;ffnen Sie die Datei BestellverwaltungModel.edmx, markieren nacheinander die Entit&auml;ten und &auml;ndern die Bezeichnungen der Entit&auml;ten von Singular auf Plural (siehe Bild 1). Speichern nicht vergessen, um die &Auml;nderungen auf den Code zu &uuml;bertragen &#8211; dies kann ein paar Sekunden dauern.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2016_04\/pic_50_001.png\" alt=\"&Auml;ndern der Entit&auml;tsnamen\" width=\"349,7625\" height=\"214,9143\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 1: &Auml;ndern der Entit&auml;tsnamen<\/span><\/b><\/p>\n<h2>Kunden im DataGrid<\/h2>\n<p>Als Erstes wollen wir die Kunden der Tabelle Kunden im DataGrid anbieten. Dieses Datagrid legen wir in einem neuen Fenster namens KundenuebersichtEinfach an, das Sie per Strg + Umschalt + A und Auswahl des Eintrags Fenster sowie Angabe der Bezeichnung KundenuebersichtEinfach anlegen.<\/p>\n<p>Um dieses Fenster vom Fenster MainWindow.xaml aus zu &ouml;ffnen, f&uuml;gen wir diesem eine neue Schaltfl&auml;che namens btnKundenuebersichtEinfach hinzu:<\/p>\n<pre>&lt;Button x:Name=\"btnKundenuebersichtEinfach\" Content=\"Kunden&uuml;bersicht einfach\" HorizontalAlignment=\"Left\" Margin=\"31,20,0,0\" VerticalAlignment=\"Top\" Width=\"143\" Click=\"btnKundenuebersichtEinfach_Click\"\/&gt;<\/pre>\n<p>F&uuml;r die Eigenschaft Click hinterlegen wir eine Methode, die wie folgt aussieht:<\/p>\n<pre>private void btnKundenuebersichtEinfach_Click(\r\n                        object sender, RoutedEventArgs e) {\r\n     KundenuebersichtEinfach wnd = \r\n                             new KundenuebersichtEinfach();\r\n     wnd.Show();\r\n}<\/pre>\n<h2>Kunden anzeigen &#8211; einfache Variante<\/h2>\n<p>Dem Fenster <b>KundenuebersichtEinfach <\/b>f&uuml;gen Sie nun das <b>Data-grid<\/b>-Steuerelement hinzu, welches die Felder der Tabelle <b>Kunden <\/b>anzeigen soll. Der XAML-Code sieht dann etwa wie folgt aus:<\/p>\n<pre>&lt;Window x:Class=\"Bestellverwaltung_EDM.Kundenuebersicht\" ...\r\n         Title=\"Kundenuebersicht\" Height=\"300\" Width=\"600\"&gt;\r\n     &lt;Grid&gt;\r\n         &lt;DataGrid x:Name=\"dgKunden\" \r\n            HorizontalAlignment=\"Left\" Margin=\"10,10,10,10\" \r\n            VerticalAlignment=\"Top\" \/&gt;\r\n     &lt;\/Grid&gt;\r\n&lt;\/Window&gt;<\/pre>\n<p>Sie sehen hier keinerlei Datenbindungseigenschaften. Dies erledigen wir direkt vom Code aus. Der komplette Code der Klasse sieht so aus:<\/p>\n<pre>using System.Linq;\r\nusing System.Windows;\r\nnamespace Bestellverwaltung_EDM {\r\n     public partial class KundenuebersichtEinfach : Window {\r\n         public KundenuebersichtEinfach() {\r\n             InitializeComponent();\r\n             using (BestellverwaltungEntities DBContext = \r\n                         new BestellverwaltungEntities()) {\r\n                 var kunden = DBContext.Kunden.ToList();\r\n                 dgKunden.ItemsSource = kunden;\r\n             };\r\n         }\r\n     }\r\n}<\/pre>\n<p>Hier verwenden wir die im Artikel <b>LINQ to Entities: Daten abfragen <\/b>ausf&uuml;hrlich erl&auml;uterten Techniken, um die Daten aus einer Tabelle &uuml;ber das Entity Data Model in eine Variable zu f&uuml;llen. Dazu erstellen wir einen Datenbank-Kontext des Typs <b>BestellverwaltungEntities<\/b>. Dieses bietet die Entit&auml;tsauflistung <b>Kunden<\/b>, die wir mit der <b>ToList<\/b>-Methode in eine Liste f&uuml;llen und an die Variable <b>kunden <\/b>&uuml;bergeben. Diese landet schlie&szlig;lich &uuml;ber die Eigenschaft <b>ItemsSource <\/b>im DataGrid:<\/p>\n<pre>using (BestellverwaltungEntities DBContext = \r\n              new BestellverwaltungEntities()) {\r\n     var kunden = DBContext.Kunden.ToList();\r\n     dgKunden.ItemsSource = kunden;\r\n};<\/pre>\n<p>Das Ergebnis sehen Sie in Bild 2. Weil das Attribut <b>AutoGenerateColumns <\/b>in der XAML-Definition des <b>DataGrid<\/b>-Steuerelements nicht explizit gesetzt wurde, hat dieses den Standardwert <b>True<\/b>, was dazu f&uuml;hrt, dass alle Felder der Datenquelle im <b>DataGrid<\/b>-Steuerelement abgebildet werden. Da wir die Daten mit der Methode <b>ToList() <\/b>in die Variable <b>kunden <\/b>geschrieben haben, werden die verkn&uuml;pften Objekte <b>Anreden <\/b>und <b>Bestellungen <\/b>nicht gef&uuml;llt. Damit k&ouml;nnen Sie nun bereits die &uuml;blichen Aktionen wie etwa das Sortieren durchf&uuml;hren, aber es werden noch nicht einmal die Anreden angezeigt, sondern nur die Werte des Feldes <b>AnredeID <\/b>&#8211; und die beiden verkn&uuml;pften Eigenschaften <b>Anreden <\/b>und <b>Bestellungen <\/b>wollen wir auch loswerden.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2016_04\/pic_50_002.png\" alt=\"Erster Entwurf des DataGrid-Steuerelements mit Kundendaten\" width=\"499,3704\" height=\"284,1078\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 2: Erster Entwurf des DataGrid-Steuerelements mit Kundendaten<\/span><\/b><\/p>\n<h2>Manuelle Definition der anzuzeigenden Felder<\/h2>\n<p>Wie wir oben beschrieben haben, werden die Felder aktuell angezeigt, weil die Option <b>AutoGenerateColumns <\/b>f&uuml;r das <b>DataGrid<\/b>-Steuerelement aktiviert ist. Wir wollen aber individuelle Einstellungen f&uuml;r die angezeigten Daten vornehmen. Daher deaktivieren wir zun&auml;chst mit dem Attribut <b>AutoGenerateColumns=&#8221;False&#8221; <\/b>die automatische Generierung. Au&szlig;erdem definieren wir selbst die anzuzeigenden Spalten und deren Spalten&uuml;berschriften und Inhalte. Dies sieht dann wie in der Definition aus Listing 1 aus, wo wir f&uuml;r Spalten jeweils ein Element des Typs <b>DataGridTextColumn <\/b>verwenden. Als Datenbindung geben wir f&uuml;r die Eigenschaft <b>Binding <\/b>jeweils Werte wie <b>{Binding ID} <\/b>an.<\/p>\n<pre>&lt;Window x:Class=\"Bestellverwaltung_EDM.Kundenuebersicht_Columns\" ... \r\n                                                               Title=\"Kundenuebersicht_Columns\" Height=\"300\" Width=\"600\"&gt;\r\n     &lt;Grid&gt;\r\n         &lt;DataGrid x:Name=\"dgKunden\" HorizontalAlignment=\"Left\" Margin=\"10,10,10,10\" VerticalAlignment=\"Top\" \r\n                                                                                             AutoGenerateColumns=\"False\"&gt;\r\n             &lt;DataGrid.Columns&gt;\r\n                 &lt;DataGridTextColumn Header=\"ID\" Binding=\"{Binding ID}\" Width=\"30\"&gt;&lt;\/DataGridTextColumn&gt;\r\n                 &lt;DataGridTextColumn Header=\"Firma\" Binding=\"{Binding Firma}\" Width=\"*\"&gt;&lt;\/DataGridTextColumn&gt;\r\n                 &lt;DataGridTextColumn Header=\"Anrede\" Binding=\"{Binding Anrede}\" Width=\"50\"&gt;&lt;\/DataGridTextColumn&gt;\r\n                 &lt;DataGridTextColumn Header=\"Vorname\" Binding=\"{Binding Vorname}\" Width=\"*\"&gt;&lt;\/DataGridTextColumn&gt;\r\n                 &lt;DataGridTextColumn Header=\"Nachname\" Binding=\"{Binding Nachname}\" Width=\"*\"&gt;&lt;\/DataGridTextColumn&gt;\r\n                 &lt;DataGridTextColumn Header=\"Stra&szlig;e\" Binding=\"{Binding Strasse}\" Width=\"*\"&gt;&lt;\/DataGridTextColumn&gt;\r\n                 &lt;DataGridTextColumn Header=\"PLZ\" Binding=\"{Binding PLZ}\" Width=\"*\"&gt;&lt;\/DataGridTextColumn&gt;\r\n                 &lt;DataGridTextColumn Header=\"Ort\" Binding=\"{Binding Ort}\" Width=\"*\"&gt;&lt;\/DataGridTextColumn&gt;\r\n             &lt;\/DataGrid.Columns&gt;\r\n         &lt;\/DataGrid&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>Den Code dieses Beispiels finden Sie im Fenster <b>Kundenuebersicht_Columns.xaml<\/b>. Die Ansicht entspricht weitgehend der aus dem ersten Beispiel.<\/p>\n<h2>Kunden per Eigenschaft f&uuml;llen<\/h2>\n<p>Nun gehen wir einen Schritt weiter: Bisher haben wir die Datenquelle im C#-Code im Code behind-Modul f&uuml;r die Eigenschaft ItemsSource angegeben. Nun wollen wir die Zuweisung in den XAML-Code verschieben. All dies erledigen wir in dem Beispielfenster <b>KundenuebersichtBinding.xaml<\/b>. Warum wollen wir die folgende Zeile gern aus dem Code behind-Modul heraushaben<\/p>\n<pre>dgKunden.ItemsSource = kunden;<\/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\/55000050\/\">\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\/55000050?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\/55000050\/\"\/>\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>WPF-Fenster k&ouml;nnen zwar auch Daten ADO.NET-Datenquellen anzeigen, aber optimal sind sie f&uuml;r den Zugriff auf Daten aus einem Entity Data Model vorbereitet. Dieser Artikel zeigt, wie Sie die per Entity Data Model abgebildeten Daten aus einer Haupt- und einer Lookup-Tabelle in einem WPF-Fenster anzeigen. Dabei soll das Fenster die Navigation durch die Datens&auml;tze und auch das Anlegen neuer Datens&auml;tze erm&ouml;glichen. Im Vergleich zu einem fr&uuml;heren Artikel zeigen wir nun, wie Sie die Aufgabe manuell erledigen, also ohne die Unterst&uuml;tzung von Assistenten.<\/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,44000007],"tags":[],"yst_prominent_words":[],"class_list":["post-55000050","post","type-post","status-publish","format-standard","hentry","category-662016","category-66042016","category-Benutzeroberflaeche_mit_WPF","category-Von_Access_zu_WPF"],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/posts\/55000050","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=55000050"}],"version-history":[{"count":0,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/posts\/55000050\/revisions"}],"wp:attachment":[{"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/media?parent=55000050"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/categories?post=55000050"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/tags?post=55000050"},{"taxonomy":"yst_prominent_words","embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/yst_prominent_words?post=55000050"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}