{"id":55000096,"date":"2017-08-01T00:00:00","date_gmt":"2020-03-27T19:27:43","guid":{"rendered":"http:\/\/access-im-unternehmen.aix-dev.de\/aiu\/?p=96"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-30T00:00:00","slug":"mnBeziehung_mit_Listenfeld","status":"publish","type":"post","link":"https:\/\/vbentwickler.de\/mnBeziehung_mit_Listenfeld\/","title":{"rendered":"m:n-Beziehung mit Listenfeld"},"content":{"rendered":"<p><b>Wir haben in der Beispieldatenbank Bestellverwaltung bereits eine m:n-Beziehung &uuml;ber ein Fenster realisiert, das an eine Tabelle gebunden ist und ein DataGrid enth&auml;lt, das die verkn&uuml;pfte Elemente anzeigt. Dabei handelt es sich um die Abbildung von Bestellungen, Bestelldetails und Produkte, wo zus&auml;tzlich zur Verkn&uuml;pfung noch weitere Daten wie der Einzelpreis f&uuml;r die Bestellposition gespeichert werden. Im vorliegenden Artikel werden wir uns ansehen, wie wir eine m:n-Beziehung ohne weitere Daten in der Verkn&uuml;pfungstabelle verwalten k&ouml;nnen. Dazu wollen wir Kunden &uuml;ber eine Verkn&uuml;pfungstabelle einer Tabelle mit Versendungen etwa zu Werbe- oder Informationszwecken verkn&uuml;pfen.<\/b><\/p>\n<h2>Notwendige Tabellen\/Erweiterungen<\/h2>\n<p>Die Datenbank <b>Bestellverwaltung.db <\/b>auf Basis von SQLite, die wir in den bisherigen Beispielen verwendet haben, m&uuml;ssen wir f&uuml;r diesen Artikel um zwei Tabellen erweitern.<\/p>\n<p>Das erledigen wir schnell &uuml;ber das Verwaltungsprogramm SQLite Studio, mit dem wir die Datei <b>Bestellverwaltung.db <\/b>&ouml;ffnen und als Erstes die Tabelle <b>Versendungen <\/b>anlegen &#8211; und zwar mit den Feldern wie in Bild 1. Speichern Sie die Tabelle nach dem Anlegen der Felder und des Tabellennamens mit einem Klick auf die Schaltfl&auml;che <b>Commit structure changes<\/b>.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2017_04\/pic_96_001.png\" alt=\"Anlegen der neuen Tabelle Versendungen\" width=\"649,559\" height=\"300,2298\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 1: Anlegen der neuen Tabelle Versendungen<\/span><\/b><\/p>\n<p>Danach folgt die zweite Tabelle <b>KundenVersendungen<\/b> als Verkn&uuml;pfungstabelle. Diese Tabelle enth&auml;lt neben dem Prim&auml;rschl&uuml;sselfeld <b>ID <\/b>noch die beiden Fremdschl&uuml;sselfelder <b>KundeID <\/b>und <b>VersendungID<\/b>, welche die beiden Tabellen <b>Kunden <\/b>und <b>Versendungen <\/b>referenzieren.<\/p>\n<p>Wenn Sie die Fremdschl&uuml;sselfelder anlegen, aktivieren Sie im Dialog <b>Spalte <\/b>die Option <b>Fremdschl&uuml;ssel <\/b>und klicken dann auf die Schaltfl&auml;che <b>Konfigurieren<\/b>. Dies zeigt den Dialog <b>Bedingung editieren <\/b>an, wo Sie als <b>Fremde Tabelle <\/b>die Tabelle <b>Kunden <\/b>und als <b>Fremde Spalte <\/b>die Spalte <b>ID <\/b>ausw&auml;hlen (siehe Bild 2). Hier aktivieren Sie au&szlig;erdem die Option <b>ON DELETE <\/b>und w&auml;hlen daf&uuml;r die Aktion <b>CASCADE <\/b>aus.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2017_04\/pic_96_002.png\" alt=\"Anlegen der neuen Tabelle KundenVersendungen\" width=\"424,7115\" height=\"567,6675\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 2: Anlegen der neuen Tabelle KundenVersendungen<\/span><\/b><\/p>\n<p>Dies bewirkt, dass wenn Sie einen Datensatz der Tabelle <b>Kunden l&ouml;schen<\/b>, f&uuml;r den in der Tabelle <b>KundenVersendungen <\/b>verkn&uuml;pfte Datens&auml;tze vorliegen, diese auch gel&ouml;scht werden. Das Gleiche f&uuml;hren wir auch f&uuml;r das Fremdschl&uuml;sselfeld zum Verkn&uuml;pfen mit der Tabelle <b>Versendungen <\/b>durch. Speichern Sie die Tabelle mit der Schaltfl&auml;che <b>Commit structure changes<\/b>.<\/p>\n<p>Danach legen wir noch einen zusammengesetzten, eindeutigen Schl&uuml;ssel f&uuml;r die beiden Fremdschl&uuml;sselfelder <b>KundeID <\/b>und <b>VersendungID <\/b>an, damit jede Versendung jedem Kunden nur einmal zugeordnet werden kann. Dazu klicken Sie oben &uuml;ber dem Tabellenentwurf auf den Reiter <b>Indizes<\/b>.<\/p>\n<p>Klicken Sie dann auf die Schaltfl&auml;che <b>Create index (ins)<\/b>. Dann tragen Sie im nun erscheinenden Dialog <b>Index <\/b>den Wert <b>KundenVersendungenUniqueIndex <\/b>als Name ein. W&auml;hlen Sie die beiden Felder <b>KundeID <\/b>und <b>VersendungID <\/b>aus und aktivieren Sie die Option <b>Einzigartiger Index <\/b>(okay, die &Uuml;bersetzung ist zumindest gut gemeint von den Entwicklern des Tools). Dies soll dann wie in Bild 3 aussehen, bevor Sie auf <b>OK <\/b>klicken und anschlie&szlig;end das Anlegen des Indizes best&auml;tigen.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2017_04\/pic_96_003.png\" alt=\"Anlegen eines zusammengesetzten, eindeutigen Schl&uuml;ssels &uuml;ber die beiden Felder KundeID und VersendungID\" width=\"649,559\" height=\"551,6095\"\/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 3: Anlegen eines zusammengesetzten, eindeutigen Schl&uuml;ssels &uuml;ber die beiden Felder KundeID und VersendungID<\/span><\/b><\/p>\n<h2>&Auml;nderungen im Entity Data Model<\/h2>\n<p>Nachdem Sie die beiden neuen Tabellen angelegt haben, ben&ouml;tigen wir in der Anwendung die entsprechenden Entit&auml;ten f&uuml;r die beiden Tabellen. Dazu &ouml;ffnen Sie die Anwendung <b>Bestellverwaltung <\/b>und klicken im Projekt-Explorer doppelt auf das Objekt <b>Bestellverwaltung.edmx<\/b>.<\/p>\n<p>Klicken Sie mit der rechten Maustaste in das Diagramm und w&auml;hlen Sie aus dem Kontextmen&uuml; den Eintrag <b>Modell aus der Datenbank aktualisieren&#8230; <\/b>aus. Gegebenenfalls m&uuml;ssen Sie nun die Verbindung f&uuml;r das Entity Data Model festlegen. Danach erscheint dann der Dialog, der auch beim Erstellen eines Entity Data Models angezeigt wird. Hier w&auml;hlen Sie die beiden einzigen angezeigten Tabellen <b>KundenVersendungen <\/b>und <b>Versendungen <\/b>aus und klicken auf <b>Fertig stellen<\/b>.<\/p>\n<p>Danach sollten die neuen Tabellen wie in Bild 4 im Entity Data Model angezeigt werden, sodass wir nun darauf zugreifen k&ouml;nnen. Genau wie bei den &uuml;brigen Entit&auml;ten haben wir auch bei diesen beiden Entit&auml;ten die Benennung in den Singular ge&auml;ndert, also von <b>KundenVersendungen <\/b>auf <b>KundeVersendung <\/b>und von <b>Versendungen <\/b>auf <b>Versendung<\/b>.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2017_04\/pic_96_004.png\" alt=\"Die beiden neuen Entit&auml;ten im Entity Data Model, hier bereits in der Singular-Benennung\" width=\"549,6265\" height=\"432,7418\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 4: Die beiden neuen Entit&auml;ten im Entity Data Model, hier bereits in der Singular-Benennung<\/span><\/b><\/p>\n<p>Wenn Sie nun noch den neuen Zustand etwa mit der Tastenkombination <b>Strg + S <\/b>speichern, werden auch die dahinter liegenden Objekte umbenannt.<\/p>\n<h2>Fenster zum Zuordnen von Kunden und Versendungen<\/h2>\n<p>Das Fenster, in dem wir einer Versendung die entsprechenden Kunden zuordnen wollen, soll im oberen Bereich ein Kombinationsfeld enthalten, welches die Versendungen abbildet. Im unteren Bereich wollen wir zwei Listenfelder darstellen. Das linke enth&auml;lt alle Kunden, die der Versendung bereits zugeordnet wurden und das rechte als &uuml;brigen Kunden. Dazwischen platzieren wir vier Schaltfl&auml;chen f&uuml;r die folgenden Funktionen:<\/p>\n<ul>\n<li><b><<\/b>: Den aktuell markierten Kunden aus dem rechten Listenfeld zur Liste der Empf&auml;nger hinzuf&uuml;gen.<\/li>\n<li><b>><\/b>: Den aktuell markierten Kunden aus dem linken Listenfeld aus der Liste der Empf&auml;nger entfernen.<\/li>\n<li><b><<<\/b>: Alle Kunden aus dem rechten Listenfeld zur Liste der Empf&auml;nger hinzuf&uuml;gen.<\/li>\n<li><b>>><\/b>: Alle Kunden aus dem linken Listenfeld aus der Liste der Empf&auml;nger entfernen.<\/li>\n<\/ul>\n<h2>Fenster anlegen<\/h2>\n<p>Das neue Fenster wollen wie diesmal einmal nicht in die bestehende Struktur einbinden, sondern &uuml;ber den Ribbon-Eintrag <b>Versendungen <\/b>als eigenes Fenster &ouml;ffnen. Das Fenster legen Sie im Projekt unter dem Namen <b>Versendungen.xaml <\/b>an. Dem Fenster <b>MainWindow.xaml <\/b>f&uuml;gen wir eine neue Ribbon-Schaltfl&auml;che wie in Bild 5 hinzu. Der Code daf&uuml;r sieht wie folgt aus:<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2017_04\/pic_96_005.png\" alt=\"Neue Ribbon-Schaltfl&auml;che zum Anzeigen des Fensters mit den Zuweisungen der Versendungen\" width=\"649,559\" height=\"161,6128\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 5: Neue Ribbon-Schaltfl&auml;che zum Anzeigen des Fensters mit den Zuweisungen der Versendungen<\/span><\/b><\/p>\n<pre>&lt;RibbonGroup Header=\"Versendungen\"&gt;\r\n     &lt;RibbonButton Name=\"btnVersendungen\" Label=\"Versendungen\" Click=\"btnVersendungen_Click\" \r\n         LargeImageSource=\"images\\mail2.png\"&gt;&lt;\/RibbonButton&gt;\r\n&lt;\/RibbonGroup&gt;<\/pre>\n<p>F&uuml;r die Schaltfl&auml;che hinterlegen wir die folgende Ereignismethode:<\/p>\n<pre>private void btnVersendungen_Click(object sender, \r\n         RoutedEventArgs e) {\r\n     Versendungen wnd = new Versendungen();\r\n     wnd.ShowDialog();\r\n}<\/pre>\n<p>Damit schauen wir uns nun den Entwurf des Fensters <b>Versendungen.xaml <\/b>an (siehe Bild 6). Das Fenster enth&auml;lt drei Spalten und drei Zeilen. Die erste Zeile enth&auml;lt lediglich das Kombinationsfeld <b>cboVersendungen <\/b>zur Auswahl der gew&uuml;nschten Versendung. Der Inhalt befindet sich in einem horizontal ausgerichteten <b>StackPanel<\/b>-Element, dass sich &uuml;ber alle drei Spalten erstreckt (<b>Grid.ColumnSpan=&#8221;3&#8243;<\/b>).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2017_04\/pic_96_006.png\" alt=\"Entwurf des Fensters Versendungen.xaml\" width=\"424,7115\" height=\"323,0201\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 6: Entwurf des Fensters Versendungen.xaml<\/span><\/b><\/p>\n<p>Die zweite Zeile enth&auml;lt in der ersten Spalte das erste Listenfeld, in der zweiten Spalte ein vertikales <b>StackPanel<\/b>-Element mit den vier Schaltfl&auml;chen und die dritte Spalte das zweite Listenfeld. Die dritte Spalte schlie&szlig;lich enth&auml;lt eine <b>OK<\/b>-Schaltfl&auml;che zum Schlie&szlig;en des Fensters. Der <b>.xaml<\/b>-Code des Fensters sieht in gek&uuml;rzter Form wie folgt aus:<\/p>\n<pre>&lt;Window x:Class=\"Bestellverwaltung.Versendungen\" ... Title=\"Versendungen\" Height=\"300\" Width=\"400\"&gt;\r\n     &lt;Grid&gt;\r\n         &lt;Grid.RowDefinitions&gt;\r\n             &lt;RowDefinition Height=\"Auto\"&gt;&lt;\/RowDefinition&gt;\r\n             &lt;RowDefinition Height=\"*\"&gt;&lt;\/RowDefinition&gt;\r\n             &lt;RowDefinition Height=\"Auto\"&gt;&lt;\/RowDefinition&gt;\r\n         &lt;\/Grid.RowDefinitions&gt;\r\n         &lt;Grid.ColumnDefinitions&gt;\r\n             &lt;ColumnDefinition&gt;&lt;\/ColumnDefinition&gt;\r\n             &lt;ColumnDefinition Width=\"Auto\"&gt;&lt;\/ColumnDefinition&gt;\r\n             &lt;ColumnDefinition&gt;&lt;\/ColumnDefinition&gt;\r\n         &lt;\/Grid.ColumnDefinitions&gt;\r\n         &lt;StackPanel Orientation=\"Horizontal\" Grid.Row=\"0\" Grid.Column=\"0\" Grid.ColumnSpan=\"3\"&gt;\r\n             &lt;Label Margin=\"5\"&gt;Versendung:&lt;\/Label&gt;\r\n             &lt;ComboBox x:Name=\"cboVersendungen\" Margin=\"5\"&gt;&lt;\/ComboBox&gt;\r\n         &lt;\/StackPanel&gt;\r\n         &lt;ListBox Grid.Column=\"0\" Grid.Row=\"1\" Margin=\"5\"&gt;&lt;\/ListBox&gt;\r\n         &lt;StackPanel Orientation=\"Vertical\" Grid.Column=\"1\" Grid.Row=\"1\"&gt;\r\n             &lt;Button x:Name=\"btnEinenHinzufuegen\" Margin=\"5\" Content=\"&lt;\"&gt;&lt;\/Button&gt;\r\n             &lt;Button x:Name=\"btnAlleHinzufuegen\" Margin=\"5\" Content=\"&lt;&lt;\"&gt;&lt;\/Button&gt;\r\n             &lt;Button x:Name=\"btnEinenEntfernen\" Margin=\"5\" Content=\"&gt;\"&gt;&lt;\/Button&gt;\r\n             &lt;Button x:Name=\"btnAlleEntfernen\" Margin=\"5\" Content=\"&gt;&gt;\"&gt;&lt;\/Button&gt;\r\n         &lt;\/StackPanel&gt;\r\n         &lt;ListBox Grid.Column=\"2\" Grid.Row=\"1\" Margin=\"5\"&gt;&lt;\/ListBox&gt;\r\n         &lt;StackPanel Orientation=\"Horizontal\" Grid.Row=\"2\" Grid.Column=\"0\" Grid.ColumnSpan=\"3\"&gt;\r\n             &lt;Button x:Name=\"btnOK\" Margin=\"5\" Click=\"btnOK_Click\"&gt;OK&lt;\/Button&gt;\r\n         &lt;\/StackPanel&gt;\r\n     &lt;\/Grid&gt;\r\n&lt;\/Window&gt;<\/pre>\n<p>Interessant ist hier, wie wir die Breite und die H&ouml;he der Spalten und Zeilen eingestellt haben. Damit die mittlere Spalte genau die f&uuml;r die vier Schaltfl&auml;chen in dem Stackpanel ben&ouml;tigte Spaltenbreite annimmt, haben wir die Eigenschaft <b>Width <\/b>auf den Wert <b>Auto <\/b>eingestellt. Die linke und die rechte Spalte sollen sich den &uuml;brigen Platz gleichm&auml;&szlig;ig aufteilen, daher erh&auml;lt die Eigenschaft <b>Width <\/b>hier den Wert <b>*<\/b>.<\/p>\n<p>Die obere Zeile und die untere Zeile sollen wie die mittlere Spalte nur den ben&ouml;tigten Platz einnehmen, also stellen wir die Eigenschaft <b>Height <\/b>f&uuml;r beide auf den Wert <b>Auto <\/b>ein. Die mittlere Zeile soll den Rest der H&ouml;he beanspruchen, war wir durch den Wert <b>* <\/b>f&uuml;r die Eigenschaft <b>Height <\/b>erreichen.<\/p>\n<p>Die Definition enth&auml;lt bislang nur die reinen Steuer-elemente ohne jegliche Bindung.<\/p>\n<h2>Kombinationsfeld mit den Versendungen f&uuml;llen<\/h2>\n<p>Um das Kombinationsfeld mit den Datens&auml;tzen der Tabelle <b>Versendungen <\/b>in alphabetischer Reihenfolge zu f&uuml;llen, m&uuml;ssen zun&auml;chst im Code behind-Modul eine entsprechende Auflistung erzeugen und aus dem Entity Data Model f&uuml;llen.<\/p>\n<p>Dazu erstellen wir zun&auml;chst einen Datenbank-Kontext im allgemeinen Teil der Klasse, der somit direkt beim Erstellen angelegt wird:<\/p>\n<pre>BestellverwaltungEntities dbContext = new BestellverwaltungEntities();<\/pre>\n<p>F&uuml;r den Inhalt des Kombinationsfeldes legen wir eine ObservableCollection an, die wir als private Variable namens <b>versendungen <\/b>sowie als &ouml;ffentliche Variable namens <b>AlleVersendungen <\/b>definieren (<b>AlleVersendungen<\/b>, weil wir bereits das Fenster <b>Versendungen <\/b>genannt haben):<\/p>\n<pre>private ObservableCollection&lt;Versendung&gt; versendungen;\r\npublic ObservableCollection&lt;Versendung&gt; AlleVersendungen{\r\n     get { return versendungen; }\r\n     set { versendungen = value; }\r\n}<\/pre>\n<p>In der Konstruktor-Methode des Fensters f&uuml;llen wir dann zun&auml;chst die ObservableCollection, die als Datenquelle f&uuml;r das Kombinationsfeld dienen soll und weisen dem Fenster die Code behind-Klasse als <b>DataContext <\/b>zu:<\/p>\n<pre>public Versendungen() {\r\n     InitializeComponent();\r\n     versendungen = new ObservableCollection&lt;Versendung&gt;(dbContext.Versendungen);\r\n     DataContext = this;\r\n}<\/pre>\n<p>Nun passen wir in <b>Versendungen.xaml <\/b>die Definition des <b>ComboBox<\/b>-Elements an, damit es die Daten der <b>ObservableCollection <\/b>anzeigt:<\/p>\n<pre>&lt;ComboBox x:Name=\"cboVersendungen\" ... IsEditable=\"True\" \r\n     Text=\"{Binding NewEntry, UpdateSourceTrigger=LostFocus}\" \r\n     ItemsSource=\"{Binding AlleVersendungen}\" \r\n     DisplayMemberPath=\"Bezeichnung\" \r\n     SelectedValuePath=\"ID\"\r\n     VerticalAlignment=\"Center\"&gt;&lt;\/ComboBox&gt;<\/pre>\n<p>Hier haben wir gleich die Vorbereitungen getroffen, dass der Benutzer neue Versendungen direkt in das Kombinationsfeld eingeben kann. Wie das im Detail funktioniert, erl&auml;utern wir im Artikel <b>Neuer Eintrag in ComboBox<\/b>. Hier nur die Kurzfassung: <b>IsEditable=&#8221;True&#8221; <\/b>sorgt daf&uuml;r, dass der Benutzer Text in das Kombinationsfeld eintippen kann. Das Binding f&uuml;r das Attribut <b>Text <\/b>sorgt daf&uuml;r, dass eine Eigenschaftsmethode namens <b>NewEntry <\/b>neue Werte entgegennimmt und <b>UpdateSourceTrigger=&#8221;LostFocus&#8221; <\/b>sorgt daf&uuml;r, dass die Methode <b>NewEntry <\/b>beim Fokusverlust ausgel&ouml;st wird. Die Methode <b>NewEntry<\/b> sieht so aus:<\/p>\n<pre>public string NewEntry {\r\n     set {\r\n         if (cboVersendungen.SelectedIndex == -1) {\r\n             if (!string.IsNullOrEmpty(value)) {\r\n                 MessageBoxResult result = MessageBox.Show(\"Eintrag ''\" + value + \"'' zu den Versendungen hinzuf&uuml;gen\", \r\n                     \"Neuer Eintrag\", MessageBoxButton.YesNo);\r\n                 if (result == MessageBoxResult.Yes) {\r\n                     Versendung newVersendung = new Versendung();\r\n                     newVersendung.Bezeichnung = value;\r\n                     versendungen.Add(newVersendung);\r\n                     dbContext.Versendungen.Add(newVersendung);\r\n                     dbContext.SaveChanges();\r\n                 }\r\n             }\r\n         }\r\n     }\r\n}<\/pre>\n<p>Sie pr&uuml;ft, ob der Inhalt des eingegebenen Textes, der wie &uuml;blich &uuml;ber den Parameter <b>value <\/b>geliefert wird, nicht leer ist und fragt in diesem Fall den Benutzer, ob er den Wert als neuen Eintrag hinzuf&uuml;gen m&ouml;chte (siehe Bild 7). Falls ja, legt die Methode ein neues Objekt des Typs <b>Versendung <\/b>an und weist <b>value <\/b>als <b>Bezeichnung <\/b>hinzu. Dann f&uuml;gt sie das neue Objekt zur <b>ObservableCollection <\/b>und zur entsprechenden Liste des Entity Data Models hinzu und speichert die &Auml;nderung in der Datenbank.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2017_04\/pic_96_007.png\" alt=\"Anlegen eines neuen Eintrags im Kombinationsfeld\" width=\"424,7115\" height=\"300,1791\"\/><\/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\/55000096\/\">\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\/55000096?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\/55000096\/\"\/>\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>Wir haben in der Beispieldatenbank Bestellverwaltung bereits eine m:n-Beziehung &uuml;ber ein Fenster realisiert, das an eine Tabelle gebunden ist und ein DataGrid enth&auml;lt, das die verkn&uuml;pfte Elemente anzeigt. Dabei handelt es sich um die Abbildung von Bestellungen, Bestelldetails und Produkte, wo zus&auml;tzlich zur Verkn&uuml;pfung noch weitere Daten wie der Einzelpreis f&uuml;r die Bestellposition gespeichert werden. Im vorliegenden Artikel werden wir uns ansehen, wie wir eine m:n-Beziehung ohne weitere Daten in der Verkn&uuml;pfungstabelle verwalten k&ouml;nnen. Dazu wollen wir Kunden &uuml;ber eine Verkn&uuml;pfungstabelle einer Tabelle mit Versendungen etwa zu Werbe- oder Informationszwecken verkn&uuml;pfen.<\/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,44000023,44000036,44000015],"tags":[],"yst_prominent_words":[],"class_list":["post-55000096","post","type-post","status-publish","format-standard","hentry","category-662017","category-66042017","category-Benutzeroberflaeche_mit_WPF","category-PowerApps","category-Ribbon_programmieren","category-WPFSteuerelemente"],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/posts\/55000096","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=55000096"}],"version-history":[{"count":0,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/posts\/55000096\/revisions"}],"wp:attachment":[{"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/media?parent=55000096"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/categories?post=55000096"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/tags?post=55000096"},{"taxonomy":"yst_prominent_words","embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/yst_prominent_words?post=55000096"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}