{"id":55000172,"date":"2019-04-01T00:00:00","date_gmt":"2020-03-27T19:36:56","guid":{"rendered":"http:\/\/access-im-unternehmen.aix-dev.de\/aiu\/?p=172"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-30T00:00:00","slug":"Mehrspaltige_Kombinationsfelder","status":"publish","type":"post","link":"https:\/\/vbentwickler.de\/Mehrspaltige_Kombinationsfelder\/","title":{"rendered":"Mehrspaltige Kombinationsfelder"},"content":{"rendered":"<p><b>Manchmal m&ouml;chte man mit einem Kombinationsfeld nicht nur den Wert eines Feldes anzeigen, sondern gleich mehrere. Unter Access war das zumindest f&uuml;r die Auswahlliste schnell erledigt &#8211; Sie brauchten einfach nur die Eigenschaften Spaltenanzahl und Spaltenbreiten anzupassen. Wenn der Inhalt des Kombinationsfeldes auch die Daten mehrerer Felder liefern sollte, mussten Sie diese per Zeichenkettenfunktion zusammenf&uuml;hren. Wie aber sieht das im WPF-Steuerelement &#8220;ComboBox&#8221; aus Dieser Artikel zeigt, welche M&ouml;glichkeiten dieses Steuer-element f&uuml;r mehrspaltige Eintr&auml;ge bietet.<\/b><\/p>\n<h2>Vorbereitung<\/h2>\n<p>F&uuml;r das Beispiel verwenden wir die Basis vieler anderer Artikel: Wir verwenden die aus einer Access-Datenbank erzeugten Entit&auml;tsklassen plus den von dort exportierten Daten. Sie brauchen, wenn Sie das Beispielprojekt verwenden wollen, einfach nur die Paket-Manager-Konsole anzuzeigen und den folgenden Befehl einzugeben:<\/p>\n<pre>Update-Database<\/pre>\n<p>Das f&uuml;gt dann eine neue Datenbank entsprechend der Verbindungszeichenfolge aus der Datei <b>App.config<\/b>, die Sie gegebenenfalls noch anpassen m&uuml;ssen, zum SQL Server beziehungsweise zu <b>LocalDb <\/b>hinzu.<\/p>\n<p>Im Code behind-Modul f&uuml;gen wir folgenden Code hinzu:<\/p>\n<pre>Imports System.Collections.ObjectModel0\r\n<span style=\"color:blue;\">Class<\/span> MainWindow\r\n     <span style=\"color:blue;\">Private <\/span>m_Kunden<span style=\"color:blue;\"> As <\/span>List(Of Kunde)\r\n     <span style=\"color:blue;\">Private <\/span>dbContext<span style=\"color:blue;\"> As <\/span>BestellverwaltungContext\r\n     <span style=\"color:blue;\">Public <\/span>Sub New()\r\n         InitializeComponent()\r\n         dbContext = <span style=\"color:blue;\">New<\/span> BestellverwaltungContext\r\n         Kunden = <span style=\"color:blue;\">New<\/span> List(Of Kunde)(dbContext.Kunden)\r\n         DataContext = Me\r\n     End Sub\r\n     <span style=\"color:blue;\">Public <\/span>Property Kunden<span style=\"color:blue;\"> As <\/span>List(Of Kunde)\r\n         Get\r\n             Return m_Kunden\r\n         End Get\r\n         Set(value<span style=\"color:blue;\"> As <\/span>List(Of Kunde))\r\n             m_Kunden = value\r\n         End <span style=\"color:blue;\">Set<\/span>\r\n     End Property\r\n<span style=\"color:blue;\">End Class<\/span><\/pre>\n<p>Danach f&uuml;gen wir das folgende <b>ComboBox<\/b>-Element zum Startfenster <b>MainWindow.xaml <\/b>hinzu (siehe <b>cboKundeID_EinFeld<\/b>):<\/p>\n<pre>&lt;ComboBox x:Name=\"cboKundeID_EinFeld\" Padding=\"0\" Height=\"21\" Margin=\"118,111,0,0\" Width=\"78\"\r\n     ItemsSource = \"{Binding Kunden}\"&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;Binding Path=\"Nachname\" \/&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;<\/pre>\n<p>Damit erhalten wir das Kombinationsfeld aus Bild 1. Um den Inhalt eines zweiten Feldes als ausgew&auml;hlten Eintrag anzuzeigen wie etwa <b>Vorname<\/b>, passen Sie das <b>MultiBinding<\/b>-Element einfach wie folgt an (siehe ):<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2019_02\/pic_172_001.png\" alt=\"Kombinationsfeld mit einer Spalte\" width=\"399,7285\" height=\"263,0604\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 1: Kombinationsfeld mit einer Spalte<\/span><\/b><\/p>\n<pre>&lt;MultiBinding StringFormat=\"{}{0},{1}\"&gt;\r\n     &lt;Binding Path=\"Nachname\" \/&gt;\r\n     &lt;Binding Path=\"Vorname\" \/&gt;\r\n&lt;\/MultiBinding&gt;<\/pre>\n<p>Das Ergebnis sieht dann wie in Bild 2 aus. Sowohl der ausgew&auml;hlte Eintrag als auch die Eintr&auml;ge der Liste werden dann im gew&uuml;nschten Format <b><Nachname>, <Vorname> <\/b>angezeigt.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2019_02\/pic_172_002.png\" alt=\"Kombinationsfeld mit einer Spalte und zwei kombinierten Feldern\" width=\"399,7285\" height=\"254,1062\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 2: Kombinationsfeld mit einer Spalte und zwei kombinierten Feldern<\/span><\/b><\/p>\n<h2>Mehrspaltige Anzeige<\/h2>\n<p>Um die Anzeige nun auch noch auf mehrere Spalten aufzuteilen, verwenden Sie ein etwas aufwendigeres Konstrukt. Dabei weisen wir dem Unterelement <b>ComboBox.ItemTemplate <\/b>das <b>DataTemplate<\/b>-Element zu, das ein <b>StackPanel <\/b>mit den drei <b>TextBlock<\/b>-Elementen f&uuml;r unsere drei Spalten aufnimmt (siehe <b>cboKunden_MehrereSpaltenNichtBuendig<\/b>):<\/p>\n<pre>&lt;ComboBox x:Name=\"cboKunden_MehrereSpaltenNichtBuendig\" ItemsSource=\"{Binding Kunden}\" Margin=\"157,10,311,381\" &gt;\r\n     &lt;ComboBox.ItemTemplate&gt;\r\n         &lt;DataTemplate&gt;\r\n             &lt;StackPanel Orientation=\"Horizontal\"&gt;\r\n                 &lt;TextBlock Margin=\"5\" Grid.Column=\"0\" Text=\"{Binding Vorname}\"&gt;&lt;\/TextBlock&gt;\r\n                 &lt;TextBlock Margin=\"5\" Grid.Column=\"1\" Text=\"{Binding Nachname}\"&gt;&lt;\/TextBlock&gt;\r\n                 &lt;TextBlock Margin=\"5\" Grid.Column=\"2\" Text=\"{Binding EMail}\"&gt;&lt;\/TextBlock&gt;\r\n             &lt;\/StackPanel&gt;\r\n         &lt;\/DataTemplate&gt;\r\n     &lt;\/ComboBox.ItemTemplate&gt;\r\n&lt;\/ComboBox&gt;<\/pre>\n<p>Wenn wir das Beispielprojekt nun starten, zeigt die Liste bereits die gew&uuml;nschten Daten an (siehe Bild 3).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2019_02\/pic_172_003.png\" alt=\"Kombinationsfeld mit drei Spalten, die allerdings nicht b&uuml;ndig sind\" width=\"349,7625\" height=\"259,9443\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 3: Kombinationsfeld mit drei Spalten, die allerdings nicht b&uuml;ndig sind<\/span><\/b><\/p>\n<p>Allerdings bleibt das Kombinationsfeld nach der Auswahl eines der Eintr&auml;ge leer. Au&szlig;erdem werden die Elemente der drei Spalten nicht b&uuml;ndig angezeigt.<\/p>\n<h2>ComboBox-Spalten per Grid<\/h2>\n<p>Also versuchen wir eine Alternative. Diese verwendet innerhalb des <b>DataTemplate<\/b>-Elements ein <b>Grid <\/b>mit den <b>ColumnDefinition<\/b>-Elementen f&uuml;r die drei Spalten, in denen wir feste Spaltenbreiten definieren (siehe <b>cboKunden_MehrereSpaltenFixeBreite<\/b>):<\/p>\n<pre>&lt;ComboBox x:Name=\"cboKunden_MehrereSpaltenFixeBreite\" ItemsSource=\"{Binding Kunden}\" Margin=\"157,10,311,381\"&gt;\r\n     &lt;ComboBox.ItemTemplate&gt;\r\n         &lt;DataTemplate&gt;\r\n             &lt;Grid&gt;\r\n                 &lt;Grid.ColumnDefinitions&gt;\r\n                     &lt;ColumnDefinition Width=\"100\"&gt;&lt;\/ColumnDefinition&gt;\r\n                     &lt;ColumnDefinition Width=\"100\"&gt;&lt;\/ColumnDefinition&gt;\r\n                     &lt;ColumnDefinition Width=\"150\"&gt;&lt;\/ColumnDefinition&gt;\r\n                 &lt;\/Grid.ColumnDefinitions&gt;\r\n                 &lt;TextBlock Margin=\"5\" Grid.Column=\"0\" Text=\"{Binding Vorname}\"&gt;&lt;\/TextBlock&gt;\r\n                 &lt;TextBlock Margin=\"5\" Grid.Column=\"1\" Text=\"{Binding Nachname}\"&gt;&lt;\/TextBlock&gt;\r\n                 &lt;TextBlock Margin=\"5\" Grid.Column=\"2\" Text=\"{Binding EMail}\"&gt;&lt;\/TextBlock&gt;\r\n             &lt;\/Grid&gt;\r\n         &lt;\/DataTemplate&gt;\r\n     &lt;\/ComboBox.ItemTemplate&gt;\r\n&lt;\/ComboBox&gt;<\/pre>\n<p>Das Ergebnis liefert nun immerhin feste Spaltenbreiten f&uuml;r alle Listeneintr&auml;ge. Allerdings sind diese nun nat&uuml;rlich fix vorgegeben und k&ouml;nnen sich nicht an die Inhalte der drei Spalten anpassen (siehe Bild 4).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2019_02\/pic_172_004.png\" alt=\"Kombinationsfeld mit drei Spalten mit fixen Spaltenbreiten\" width=\"399,7285\" height=\"280,5482\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 4: Kombinationsfeld mit drei Spalten mit fixen Spaltenbreiten<\/span><\/b><\/p>\n<p>Stellen wir die Spaltenbreiten testweise auf dynamische Spaltenbreiten um, bei der die Spaltenbreiten an die Inhalte angepasst werden:<\/p>\n<pre>&lt;Grid.ColumnDefinitions&gt;\r\n     &lt;ColumnDefinition Width=\"*\"&gt;&lt;\/ColumnDefinition&gt;\r\n     &lt;ColumnDefinition Width=\"*\"&gt;&lt;\/ColumnDefinition&gt;\r\n     &lt;ColumnDefinition Width=\"*\"&gt;&lt;\/ColumnDefinition&gt;\r\n&lt;\/Grid.ColumnDefinitions&gt;<\/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\/55000172\/\">\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\/55000172?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\/55000172\/\"\/>\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>Manchmal m&ouml;chte man mit einem Kombinationsfeld nicht nur den Wert eines Feldes anzeigen, sondern gleich mehrere. Unter Access war das zumindest f&uuml;r die Auswahlliste schnell erledigt &#8211; Sie brauchten einfach nur die Eigenschaften Spaltenanzahl und Spaltenbreiten anzupassen. Wenn der Inhalt des Kombinationsfeldes auch die Daten mehrerer Felder liefern sollte, mussten Sie diese per Zeichenkettenfunktion zusammenf&uuml;hren. Wie aber sieht das im WPF-Steuerelement &#8220;ComboBox&#8221; aus Dieser Artikel zeigt, welche M&ouml;glichkeiten dieses Steuer-element f&uuml;r mehrspaltige Eintr&auml;ge bietet.<\/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,44000002,44000015],"tags":[],"yst_prominent_words":[],"class_list":["post-55000172","post","type-post","status-publish","format-standard","hentry","category-66022019","category-662019","category-Benutzeroberflaeche_mit_WPF","category-WPFSteuerelemente"],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/posts\/55000172","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=55000172"}],"version-history":[{"count":0,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/posts\/55000172\/revisions"}],"wp:attachment":[{"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/media?parent=55000172"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/categories?post=55000172"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/tags?post=55000172"},{"taxonomy":"yst_prominent_words","embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/yst_prominent_words?post=55000172"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}