{"id":55000178,"date":"2019-04-01T00:00:00","date_gmt":"2020-03-27T19:37:43","guid":{"rendered":"http:\/\/access-im-unternehmen.aix-dev.de\/aiu\/?p=178"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-30T00:00:00","slug":"Detailformulare_mit_Combo_Checkbox_und_Button","status":"publish","type":"post","link":"https:\/\/vbentwickler.de\/Detailformulare_mit_Combo_Checkbox_und_Button\/","title":{"rendered":"Detailformulare mit Combo, Checkbox und Button"},"content":{"rendered":"<p><b>Im Artikel &#8220;Access zu WPF: Detailformulare mit Textfeldern&#8221; schauen wir uns an, wie die programmgesteuerten M&ouml;glichkeiten aussehen, um Formulare automatisch als WPF-Fenster oder -Seiten abzubilden. Damit haben wir einfache Detailformulare samt Textfeldern und Datenbindung unter WPF abgebildet. Nun wollen wir einen Schritt weitergehen und uns um weitere Steuer-elemente wie etwa Kombinationsfelder und Kontrollk&auml;stchen k&uuml;mmern. Au&szlig;erdem wollen wir noch Schaltfl&auml;chen zum Bl&auml;ttern in den Datens&auml;tzen sowie zum Anlegen neuer Datens&auml;tze hinzuf&uuml;gen.<\/b><\/p>\n<h2>Voraussetzungen<\/h2>\n<p>Wir gehen an dieser Stelle davon aus, dass Sie bereits ein Entity Data Model auf Basis des Access-Datenmodells erstellt und eine entsprechende SQL Server-Datenbank auf Basis des Entity Data Modells erstellt haben. Wie das gelingt, zeigen die Artikel <b>Von Access zu Entity Framework: Datenmodell <\/b>und <b>Von Access zu Entity Framework: Daten<\/b> aus Ausgabe 5\/2018. Die weiteren Vorarbeiten werden im Artikel <b>Access zu WPF: Detailformulare mit Textfeldern <\/b>erl&auml;utert.<\/p>\n<h2>Kombinationsfelder hinzuf&uuml;gen<\/h2>\n<p>Wenn wir etwa das Kombinationsfeld cboAnredeID im WPF-Fenster abbilden m&ouml;chten, ben&ouml;tigen wir einige weitere Elemente. Das erste ist nat&uuml;rlich das <b>ComboBox<\/b>-Element im XAML-Code. Diesem m&uuml;ssen wir die Eigenschaften f&uuml;r die Bindung &uuml;bergeben. Au&szlig;erdem brauchen wir im Code behind-Modul der WPF-Seite zus&auml;tzlichen Code, der die Auflistung der Anreden als &ouml;ffentliche Eigenschaft bereith&auml;lt, damit wir vom XAML-Code aus auf die Anreden zugreifen k&ouml;nnen. Wir schauen uns als Erstes die notwendigen &Auml;nderungen an. Im XAML-Code f&uuml;gen wir allgemeine Eigenschaften f&uuml;r den Steuerelementtyp <b>ComboBox <\/b>hinzu:<\/p>\n<pre>&lt;Window x:Class=\"frmKundendetails\" ... Title=\"frmKundendetails\" Height=\"332\" Width=\"362\"&gt;\r\n     &lt;Window.Resources&gt;\r\n         ...\r\n         &lt;Style TargetType=\"{x:Type ComboBox}\"&gt;\r\n             &lt;Setter Property=\"HorizontalAlignment\" Value=\"Left\"&gt;&lt;\/Setter&gt;\r\n             &lt;Setter Property=\"VerticalAlignment\" Value=\"Top\"&gt;&lt;\/Setter&gt;\r\n             &lt;Setter Property=\"FontFamily\" Value=\"Calibri\"&gt;&lt;\/Setter&gt;\r\n             &lt;Setter Property=\"FontSize\" Value=\"11pt\"&gt;&lt;\/Setter&gt;\r\n         &lt;\/Style&gt;\r\n     &lt;\/Window.Resources&gt;<\/pre>\n<p>F&uuml;r das Kombinationsfeld selbst f&uuml;gen wir das <b>ComboBox<\/b>-Element hinzu. Im Beispielformular, das die Daten eines Kunden anzeigen soll, wollen wir mit der folgenden Definition eines <b>ComboBox<\/b>-Elements die Daten der Tabelle <b>Anreden <\/b>zur Auswahl einf&uuml;gen und die f&uuml;r den aktuellen Kunden ausgew&auml;hlte Anrede anzeigen:<\/p>\n<pre>     &lt;Grid&gt;\r\n         ...\r\n         &lt;Label x:Name=\"Bezeichnungsfeld4\" Content=\"Anrede:\" Padding=\"0\" Height=\"21\" Margin=\"5,111,0,0\" Width=\"64\"\/&gt;\r\n         &lt;ComboBox x:Name=\"MehrwertsteuersatzID\" Padding=\"0\" Height=\"21\" Margin=\"118,111,0,0\" Width=\"221\"\r\n                   ItemsSource=\"{Binding Anreden}\"\r\n                   SelectedItem=\"{Binding Kunde.Anrede, ValidatesOnDataErrors=True}\"\r\n                   SelectedValuePath=\"ID\" SelectionChanged=\"Anrede_SelectionChanged\"&gt;\r\n             &lt;ComboBox.ItemTemplate&gt;\r\n                 &lt;DataTemplate&gt;\r\n                     &lt;TextBlock&gt;\r\n                         &lt;TextBlock.Text&gt;\r\n                             &lt;MultiBinding StringFormat=\"{}{0}\"&gt;\r\n                                 &lt;!--&lt;MultiBinding StringFormat=\"{}{0}, {1}\"&gt;--&gt;\r\n                                 &lt;Binding Path=\"Name\" \/&gt;\r\n                                 &lt;!--&lt;Binding Path=\"Vorname\" \/&gt;--&gt;\r\n                             &lt;\/MultiBinding&gt;\r\n                         &lt;\/TextBlock.Text&gt;\r\n                     &lt;\/TextBlock&gt;\r\n                 &lt;\/DataTemplate&gt;\r\n             &lt;\/ComboBox.ItemTemplate&gt;\r\n         &lt;\/ComboBox&gt;\r\n         ....\r\n     &lt;\/Grid&gt;\r\n&lt;\/Window&gt;<\/pre>\n<p>In der Code behind-Klasse f&uuml;gen wir zun&auml;chst im allgemeinen Teil die private Variable f&uuml;r die Liste der Anreden hinzu sowie die &ouml;ffentliche Eigenschaft, &uuml;ber welche diese dann verf&uuml;gbar ist:<\/p>\n<pre><span style=\"color:blue;\">Private <\/span>_Anreden<span style=\"color:blue;\"> As <\/span>List(Of Anrede)\r\n<span style=\"color:blue;\">Public Property <\/span>Anreden<span style=\"color:blue;\"> As <\/span>List(Of Anrede)\r\n     Get\r\n         Return _Anreden\r\n     End Get\r\n     Set(value<span style=\"color:blue;\"> As <\/span>List(Of Anrede))\r\n         _Anreden = value\r\n     End <span style=\"color:blue;\">Set<\/span>\r\n<span style=\"color:blue;\">End Property<\/span><\/pre>\n<p>Schlie&szlig;lich ben&ouml;tigen wir in den Konstruktor-Methoden jeweils eine Anweisung, welche die Auflistung der Anreden mit den Daten der <b>DbSet<\/b>-Auflistung <b>Anreden <\/b>f&uuml;llt:<\/p>\n<pre><span style=\"color:blue;\">Public Sub <\/span>New()\r\n     ...\r\n     Anreden = <span style=\"color:blue;\">New<\/span> List(Of Anrede)(dbContext.Anreden)\r\n     DataContext = Me\r\n<span style=\"color:blue;\">End Sub<\/span>\r\n<span style=\"color:blue;\">Public Sub <\/span>New(lngID<span style=\"color:blue;\"> As Long<\/span>)\r\n     ...\r\n     Anreden = <span style=\"color:blue;\">New<\/span> List(Of Anrede)(dbContext.Anreden)\r\n     DataContext = Me\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<h2>Standardeigenschaften f&uuml;r ComboBox-Element hinzuf&uuml;gen<\/h2>\n<p>Das w&auml;ren zun&auml;chst einmal die Anforderungen f&uuml;r die einzuf&uuml;genden Elemente, die wir in den Prozeduren des Moduls <b>mdlAccessZuWPF <\/b>ber&uuml;cksichtigen m&uuml;ssen. Die Erweiterungen sind teilweise trivial wie etwa die f&uuml;r die Standardeigenschaften f&uuml;r die Kombinationsfelder beziehungsweise <b>ComboBox<\/b>-Elemente. Diese f&uuml;gen wir der Prozedur <b>AttributeHinzufuegen <\/b>wie folgt hinzu:<\/p>\n<pre><span style=\"color:blue;\">Public Sub <\/span>AttributeHinzufuegen(frm<span style=\"color:blue;\"> As <\/span>Form, strXAML<span style=\"color:blue;\"> As String<\/span>)\r\n     strXAML = strXAML & \"        &lt;Window.Resources&gt;\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n     ...\r\n     <span style=\"color:blue;\">With<\/span> frm.DefaultControl(acComboBox)\r\n         strXAML = strXAML & \"        &lt;Style TargetType=\"\"{x:Type ComboBox}\"\"&gt;\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n         strXAML = strXAML & \"            &lt;Setter Property=\"\"HorizontalAlignment\"\" Value=\"\"Left\"\"&gt;&lt;\/Setter&gt;\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n         strXAML = strXAML & \"            &lt;Setter Property=\"\"VerticalAlignment\"\" Value=\"\"Top\"\"&gt;&lt;\/Setter&gt;\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n         strXAML = strXAML & \"            &lt;Setter Property=\"\"FontFamily\"\" Value=\"\"\" & .FontName & \"\"\"&gt;&lt;\/Setter&gt;\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n         strXAML = strXAML & \"            &lt;Setter Property=\"\"FontSize\"\" Value=\"\"\" & .FontSize & \"pt\"\"&gt;&lt;\/Setter&gt;\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n         strXAML = strXAML & \"        &lt;\/Style&gt;\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n     End <span style=\"color:blue;\">With<\/span>\r\n     strXAML = strXAML & \"        &lt;\/Window.Resources&gt;\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<h2>ComboBox-Element hinzuf&uuml;gen<\/h2>\n<p>Der Teil, der die XAML-Definition des <b>ComboBox<\/b>-Elements zusammenstellt, ist etwas umfangreicher als der f&uuml;r das Zusammenstellen eines <b>Label<\/b>&#8211; oder eines <b>TextBox<\/b>-Elements. Das liegt daran, dass wir ein paar mehr Informationen sammeln m&uuml;ssen &#8211; etwa, um herauszufinden, welche Tabelle beziehungsweise welches <b>DbSet<\/b>-Element die Daten f&uuml;r das aufgeklappte <b>ComboBox<\/b>-Element liefert. Genau genommen ist es sogar recht kompliziert &#8211; und umso komplizierter, je mehr m&ouml;gliche F&auml;lle man abdecken m&ouml;chte.<\/p>\n<p>Gehen wir einmal davon aus, dass wir etwa das Kombinationsfeld zur Auswahl der Anrede eines Kunden abbilden wollen. Dann hat dieses Kombinationsfeld beispielsweise die folgende Abfrage als Datensatzherkunft:<\/p>\n<pre>SELECT [tblAnreden].[AnredeID], [tblAnreden].[Anrede] FROM tblAnreden;<\/pre>\n<p>Daneben verwendet es die erste Spalte dieser Abfrage als gebundene Spalte und die zweite soll angezeigt werden. Schlie&szlig;lich ist das Kombinationsfeld an das Feld <b>AnredeID <\/b>der Tabelle <b>tblKunden <\/b>gebunden. Diese Informationen ben&ouml;tigen wir auch f&uuml;r das <b>ComboBox<\/b>-Element &#8211; genau genommen sogar einige davon abgeleitete Informationen. Wir wollen ja nicht den Namen der Tabelle <b>tblAnreden <\/b>f&uuml;r das Attribut <b>ItemsSource <\/b>angeben, sondern ben&ouml;tigen das <b>DbSet <\/b>des Entity Data Models, dass die Daten dieser Tabelle liefert.<\/p>\n<h2>Generiertes Entity Data Model nutzen<\/h2>\n<p>In den Artikeln <b>Von Access zu Entity Framework: Datenmodell <\/b>und <b>Von Access zu Entity Framework: Update 1 <\/b>haben wir gezeigt, wie Sie aus dem Datenmodell einer Access-Datenbank ein Entity Data Model erstellen k&ouml;nnen. Dort haben wir unter anderem eine Collection zusammengestellt, welche die resultierenden Mappings enth&auml;lt &#8211; also etwa die Namen der Tabellen (zum Beispiel <b>tblKunden<\/b>), der resultierenden Klasse (<b>Kunde<\/b>), des <b>DbSet<\/b>-Elements (<b>Kunden<\/b>) und weiterer Informationen. Die Daten aus dieser Collection k&ouml;nnen wir auch noch nutzen, um die Informationen zur Definition der <b>ComboBox<\/b>-Elemente zusammenzustellen. In der Collection, die Elemente des Typs <b>clsMapping <\/b>aufnimmt, fehlen allerdings noch zwei Informationen, die wir noch ben&ouml;tigen: Wenn der Name eines Feldes mit dem resultierenden Namen der Klasse &uuml;bereinstimmt, was etwa bei der Tabelle <b>tblAnreden <\/b>mit den Feldern <b>AnredeID <\/b>und <b>Anrede <\/b>auftritt, dann soll der Name dieses Feldes als Eigenschaft der Klasse in <b>Name <\/b>umbenannt werden. Da wir zuf&auml;llig genau beim Beispiel der Tabelle <b>tblKunden<\/b>, welche ja im Fremdschl&uuml;sselfeld <b>AnredeID <\/b>auf die Datens&auml;tze der Tabelle <b>tblAnreden <\/b>zugreift, auf diesen Fall treffen, wissen wir auch, dass diese Informationen gut noch in den Elementen der Collection <b>colMappings <\/b>untergebracht werden k&ouml;nnten. Dazu erweitern wir zun&auml;chst die Klasse <b>clsMapping <\/b>in der Access-Datenbank, welche die zu migrierenden Formulare enth&auml;lt, um die folgenden beiden privaten Variablen und die entsprechenden Getter und Setter:<\/p>\n<pre><span style=\"color:blue;\">Private <\/span>m_RenamedField<span style=\"color:blue;\"> As String<\/span>\r\n<span style=\"color:blue;\">Private <\/span>m_RenamedFieldOriginal<span style=\"color:blue;\"> As String<\/span>\r\n<span style=\"color:blue;\">Public Property Get <\/span>RenamedField()<span style=\"color:blue;\"> As String<\/span>\r\n     RenamedField = m_RenamedField\r\n<span style=\"color:blue;\">End Property<\/span>\r\n<span style=\"color:blue;\">Public Property Let <\/span>RenamedField(str<span style=\"color:blue;\"> As String<\/span>)\r\n     m_RenamedField = str\r\n<span style=\"color:blue;\">End Property<\/span>\r\n<span style=\"color:blue;\">Public Property Get <\/span>RenamedFieldOriginal()<span style=\"color:blue;\"> As String<\/span>\r\n     RenamedFieldOriginal = m_RenamedFieldOriginal\r\n<span style=\"color:blue;\">End Property<\/span>\r\n<span style=\"color:blue;\">Public Property Let <\/span>RenamedFieldOriginal(str<span style=\"color:blue;\"> As String<\/span>)\r\n     m_RenamedFieldOriginal = str\r\n<span style=\"color:blue;\">End Property<\/span><\/pre>\n<p>Die Eigenschaft <b>RenamedFieldOriginal <\/b>soll dann etwa den Namen des Feldes <b>Anrede <\/b>aufnehmen und <b>RenamedField <\/b>den Namen der resultierenden Eigenschaft der Klasse <b>Anrede<\/b>, also <b>Name<\/b>.<\/p>\n<p>Die Prozedur <b>EDMErstellen <\/b>aus dem Modul <b>mdlEDM <\/b>wandeln wir in eine gleichnamige Funktion um, welche eine Collection als Funktionswert zur&uuml;ckliefern soll:<\/p>\n<pre><span style=\"color:blue;\">Public Function <\/span>EDMErstellen()<span style=\"color:blue;\"> As <\/span>Collection\r\n     ...\r\n     <span style=\"color:blue;\">Set<\/span> colMappings = <span style=\"color:blue;\">New<\/span> Collection\r\n     ...<\/pre>\n<p>In der <b>For Each<\/b>-Schleife &uuml;ber alle Mappings, in denen die Funktion die Felder untersucht, schreibt die Funktion dann die entsprechenden Werte in die beiden Eigenschften <b>RenamedField <\/b>und <b>RenamedFieldOriginal <\/b>der <b>clsMapping<\/b>-Klasse:<\/p>\n<pre>     For Each objMapping In colMappings\r\n         <span style=\"color:blue;\">With<\/span> objMapping\r\n             ...\r\n             For Each fld In tdf.Fields\r\n                 ...\r\n                 <span style=\"color:blue;\">If <\/span>fld.Name = .Entity_Original<span style=\"color:blue;\"> Then<\/span>\r\n                     strFieldname = \"Name\"\r\n                     objMapping.RenamedField = \"Name\"\r\n                     objMapping.RenamedFieldOriginal = fld.Name\r\n                 <span style=\"color:blue;\">Else<\/span>\r\n                     ...\r\n                 <span style=\"color:blue;\">End If<\/span>\r\n                 ...\r\n             <span style=\"color:blue;\">Next<\/span> fld\r\n             ...\r\n         End <span style=\"color:blue;\">With<\/span>\r\n         ...\r\n     <span style=\"color:blue;\">Next<\/span> objMapping\r\n     ...<\/pre>\n<p>Schlie&szlig;lich wird die Collection <b>colMappings <\/b>als Funktionswert der Funktion <b>EDMErstellen <\/b>zur&uuml;ckgegeben:<\/p>\n<pre>     <span style=\"color:blue;\">Set<\/span> EDMErstellen = colMappings\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<h2>Anpassung der Prozeduren zum Migrieren des Formulars<\/h2>\n<p>Die Funktion <b>EDMErstellen <\/b>rufen wir nun nicht mehr nur auf, wenn wir das Entity Data Model auf Basis des Datenmodells der Datenbank erstellen wollen, sondern auch beim Migrieren eines der Formular mit der Prozedur <b>FormularNachWPF <\/b>des Moduls <b>mdlAccessZuWPF <\/b>der Access-Datenbank. Dies erledigen wir direkt in der ersten Anweisung nach dem Deklarationsteil der Prozedur:<\/p>\n<pre><span style=\"color:blue;\">Public Sub <\/span>FormularNachWPF(strForm<span style=\"color:blue;\"> As String<\/span>, strKlasse<span style=\"color:blue;\"> As String<\/span>)\r\n     ...\r\n     <span style=\"color:blue;\">Dim <\/span>colMappings<span style=\"color:blue;\"> As <\/span>Collection\r\n     <span style=\"color:blue;\">Set<\/span> colMappings = EDMErstellen\r\n     ...<\/pre>\n<p>Dann &uuml;bergeben wir diese Collection beim Aufruf der Prozedur <b>SteuerelementeHinzufuegen <\/b>als neuen Parameter:<\/p>\n<pre>     SteuerelementeHinzufuegen frm, strXAML, strKlasse, colMappings\r\n     ...\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Die Prozedur <b>SteuerelementeHinzufuegen <\/b>erf&auml;hrt die umfassendsten Anpassungen. Zun&auml;chst f&uuml;gen wir <b>colMappings<\/b> mit dem Datentyp <b>Collection <\/b>als vierten Parameter zur Prozedur hinzu:<\/p>\n<pre><span style=\"color:blue;\">Public Function <\/span>SteuerelementeHinzufuegen(frm<span style=\"color:blue;\"> As <\/span>Form, strXAML<span style=\"color:blue;\"> As String<\/span>, strKlasse<span style=\"color:blue;\"> As String<\/span>, colMappings<span style=\"color:blue;\"> As <\/span>Collection)\r\n     ...<\/pre>\n<p>Dann ben&ouml;tigen wir die folgenden zus&auml;tzlichen Variablen. Die erste namens <b>strEntitiesCombo <\/b>nimmt den Namen der <b>DbSet<\/b>-Auflistung f&uuml;r die Elemente des <b>ComboBox<\/b>-Elements auf (etwa <b>Anreden<\/b>), das zweite namens <b>strEntityCombo <\/b>den Namen der Klasse f&uuml;r die Auflistung. <b>strPKCombo <\/b>erh&auml;lt das Prim&auml;rschl&uuml;sselfeld der entsprechenden Entit&auml;t, also zum Beispiel <b>ID<\/b>. <b>strSichtbaresFeldCombo <\/b>schlie&szlig;lich f&uuml;llen wir mit dem Namen des zweiten Feldes der Datensatzherkunft des Kombinationsfeldes, im Falle der Datensatzherkunft <b>SELECT [tblAnreden].[AnredeID], [tblAnreden].[Anrede] FROM tblAnreden; <\/b>also etwa das Feld <b>Anrede<\/b>. Diesen Wert &auml;ndern wir aber in diesem Fall noch, da <b>Anrede <\/b>ja dem Namen der entstehenden Entit&auml;t entspricht und dementsprechend umbenannt werden muss.<\/p>\n<pre>     <span style=\"color:blue;\">Dim <\/span>strEntitiesCombo<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>strEntityCombo<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>strPKCombo<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>strSichtbaresFeldCombo<span style=\"color:blue;\"> As String<\/span>\r\n     ...<\/pre>\n<p>In der Schleife &uuml;ber alle Steuer-elemente des Formulars landen wir dann fr&uuml;her oder sp&auml;ter bei einem Kombinationsfeld. F&uuml;r dieses haben wir in einer Select Case-Bedingung einen eigenen Zweig eingerichtet. In diesem f&uuml;gen wir zun&auml;chst die Schriftart und Schriftgr&ouml;&szlig;e ein, sollte sich diese von der Standardschriftart f&uuml;r dieses Steuer-element unterscheiden:<\/p>\n<pre>     For Each ctl In frm.Controls\r\n         ...\r\n         Select Case ctl.ControlType\r\n             ...\r\n             <span style=\"color:blue;\">Case <\/span>acComboBox\r\n                 <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Not<\/span> ctl.FontName = strFontFamilyTextBox<span style=\"color:blue;\"> Then<\/span>\r\n                      strFontname = \"FontFamily=\"\"\" & strFontFamilyTextBox & \"\"\" \"\r\n                 <span style=\"color:blue;\">End If<\/span>\r\n                 <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Not<\/span> ctl.FontSize = strFontSizeTextBox<span style=\"color:blue;\"> Then<\/span>\r\n                     strFontSize = \"FontSize=\"\"\" & strFontSizeTextBox & \"pt\"\" \"\r\n                 <span style=\"color:blue;\">End If<\/span><\/pre>\n<p>Danach f&uuml;llen wir die Variable <b>strFeldname <\/b>mit dem Wert des Feldes <b>Steuerelementinhalt <\/b>des Kombinationsfeldes:<\/p>\n<pre>                 strFeldname = ctl.ControlSource<\/pre>\n<p>Die Variable <b>strSichtbaresFeldCombo <\/b>nimmt das zweite Feld der als Datensatzherkunft angegebenen Tabelle oder Abfrage als Wert:<\/p>\n<pre>                 strSichtbaresFeldCombo = CurrentDb.OpenRecordset(ctl.RowSource).Fields(1).Name<\/pre>\n<p>In einer <b>If&#8230;Then<\/b>-Bedingung verwenden wir dann das Ergebnis eines Aufrufs der Funktion <b>GetDbSetCombo <\/b>als Kriterium. Liefert diese Funktion, welche aus den <b>Mapping<\/b>-Informationen aus <b>colMappings <\/b>und der Datensatzherkunft des Steuerelements den Namen der Entit&auml;tenliste, des Prim&auml;rschl&uuml;sselfeldes und des sichtbaren Feldes ermitteln soll, den Wert <b>True<\/b>, wurden diese Werte erfolgreich gef&uuml;llt und wir k&ouml;nnen den Code f&uuml;r das <b>ComboBox<\/b>-Element zusammenstellen:<\/p>\n<pre>                 If GetDbSetCombo(colMappings, ctl.RowSource, strEntitiesCombo, strPKCombo, strSichtbaresFeldCombo, _\r\n                     strEntityCombo) Then<\/pre>\n<p>Ist das der Fall, tragen wir zun&auml;chst den Namen des Steuer-element f&uuml;r das Attribut <b>Name <\/b>des <b>ComboBox<\/b>-Elements ein sowie die H&ouml;he, die Breite und die Abst&auml;nde zum linken und oberen Rand:<\/p>\n<pre>                     strXAML = strXAML & \"&lt;ComboBox x:Name=\"\"\" & ctl.Name & \"\"\" Padding=\"\"0\"\" Height=\"\"\" & lngHeight _\r\n                         & \"\"\" Margin=\"\"\" & lng<span style=\"color:blue;\">Left<\/span> & \",\" & lngTop & \",0,0\"\" Width=\"\"\" & lngWidth & \"\"\"\" & <span style=\"color:blue;\">vbCrLf<\/span><\/pre>\n<p>F&uuml;r das Attribut <b>ItemsSource <\/b>stellen wir eine Bindung zu dem Element aus <b>strEntitiesCombo <\/b>her, in diesem Fall <b>Anreden<\/b>:<\/p>\n<pre>                     strXAML = strXAML & \"            ItemsSource = \"\"{Binding \" & strEntitiesCombo & \"}\"\"\" & <span style=\"color:blue;\">vbCrLf<\/span><\/pre>\n<p>Den aktuell ausgew&auml;hlten Eintrag wollen wir &uuml;ber das Feld <b>Name <\/b>der Klasse <b>Anrede <\/b>ermitteln und tragen diesen f&uuml;r das Attribut <b>SelectedItem <\/b>ein:<\/p>\n<pre>                     strXAML = strXAML & \"            SelectedItem = \"\"{Binding \" & strKlasse & \".\" & strEntityCombo _\r\n                         & \", ValidatesOnDataErrors=True}\"\"\" & <span style=\"color:blue;\">vbCrLf<\/span><\/pre>\n<p>Zu den allgemeinen Attributen geh&ouml;rt auch noch <b>SelectedValuePath<\/b>, das festlegt, welche Eigenschaft der gebundenen Spalte entspricht, also wonach der Eintrag der <b>ComboBox <\/b>f&uuml;r den aktuellen Datensatz im Fenster ausgew&auml;hlt wird:<\/p>\n<pre>                     strXAML = strXAML & \"            SelectedValuePath=\"\"\" & strPKCombo & \"\"\"&gt; \" & <span style=\"color:blue;\">vbCrLf<\/span><\/pre>\n<p>Danach folgen die anzuzeigenden Werte des <b>ComboBox<\/b>-Elements. Dazu legen wir das folgende Konstrukt an, mit dem Sie direkt ein <b>MultiBinding<\/b>-Element haben, das Sie nach der Migration leicht um weitere Felder erweitern k&ouml;nnen. Wir f&uuml;gen hier f&uuml;r das Element <b>Binding <\/b>die Eigenschaft auf <b>strSichtbaresFeldCombo <\/b>ein, was im Beispiel der Bezeichnung <b>Name <\/b>entspricht:<\/p>\n<pre>                     strXAML = strXAML & \"    &lt;ComboBox.ItemTemplate&gt;\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n                     strXAML = strXAML & \"        &lt;DataTemplate&gt;\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n                     strXAML = strXAML & \"            &lt;TextBlock&gt;\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n                     strXAML = strXAML & \"                &lt;TextBlock.Text&gt;\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n                     strXAML = strXAML & \"                    &lt;MultiBinding StringFormat=\"\"{}{0}\"\"&gt;\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n                     strXAML = strXAML & \"                        &lt;Binding Path=\"\"\" & strSichtbaresFeldCombo & \"\"\" \/&gt;\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n                     strXAML = strXAML & \"                    &lt;\/MultiBinding&gt;\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n                     strXAML = strXAML & \"                &lt;\/TextBlock.Text&gt;\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n                     strXAML = strXAML & \"            &lt;\/TextBlock&gt;\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n                     strXAML = strXAML & \"        &lt;\/DataTemplate&gt;\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n                     strXAML = strXAML & \"    &lt;\/ComboBox.ItemTemplate&gt;\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n                     strXAML = strXAML & \"&lt;\/ComboBox&gt;\" & <span style=\"color:blue;\">vbCrLf<\/span><\/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\/55000178\/\">\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\/55000178?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\/55000178\/\"\/>\n\t\t\t\t<input type=\"hidden\" name=\"rcp_login_nonce\" value=\"dbce743e9d\"\/>\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;Access zu WPF: Detailformulare mit Textfeldern&#8221; schauen wir uns an, wie die programmgesteuerten M&ouml;glichkeiten aussehen, um Formulare automatisch als WPF-Fenster oder -Seiten abzubilden. Damit haben wir einfache Detailformulare samt Textfeldern und Datenbindung unter WPF abgebildet. Nun wollen wir einen Schritt weitergehen und uns um weitere Steuer-elemente wie etwa Kombinationsfelder und Kontrollk&auml;stchen k&uuml;mmern. Au&szlig;erdem wollen wir noch Schaltfl&auml;chen zum Bl&auml;ttern in den Datens&auml;tzen sowie zum Anlegen neuer Datens&auml;tze hinzuf&uuml;gen.<\/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":[66022019,662019,44000022,44000015],"tags":[],"yst_prominent_words":[],"class_list":["post-55000178","post","type-post","status-publish","format-standard","hentry","category-66022019","category-662019","category-Von_Access_zu_NET","category-WPFSteuerelemente"],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/posts\/55000178","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=55000178"}],"version-history":[{"count":0,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/posts\/55000178\/revisions"}],"wp:attachment":[{"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/media?parent=55000178"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/categories?post=55000178"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/tags?post=55000178"},{"taxonomy":"yst_prominent_words","embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/yst_prominent_words?post=55000178"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}