{"id":55000825,"date":"2012-04-01T00:00:00","date_gmt":"2020-05-22T21:53:26","guid":{"rendered":"http:\/\/access-im-unternehmen.aix-dev.de\/aiu\/?p=825"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-30T00:00:00","slug":"ListViewKonfigurator","status":"publish","type":"post","link":"https:\/\/access-im-unternehmen.de\/ListViewKonfigurator\/","title":{"rendered":"ListView-Konfigurator"},"content":{"rendered":"<p><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/vg05.met.vgwort.de\/na\/c9598b88fa9f4e22a06a07675efb7b4a\" width=\"1\" height=\"1\" alt=\"\"><\/p>\n<p><b>Das ListView-Steuerelement bietet einige interessante Features, die Sie in der Datenblattansicht und im Listenfeld nicht finden. Allein das Best&uuml;cken mit Daten ist ein wenig m&uuml;hselig &#8211; das ListView-Steuerelement kann nicht wie das Listenfeld oder ein Unterformular in der Datenblattansicht einfach an eine Datenherkunft gebunden werden. Diese und einige andere Schw&auml;chen behebt die vorliegende L&ouml;sung &#8211; der ListView-Konfigurator.<\/b><\/p>\n<p class=\"zwischen-berschrift-oberer-spaltenrand\">ListView-Konfigurator im Einsatz<\/p>\n<p>Der ListView-Konfigurator ist eine Klasse, mit der Sie ein ListView-Steuerelement programmieren k&ouml;nnen &#8211; allerdings etwas umfangreicher und einfacher, als dies mit dem herk&ouml;mmlichen Funktionsumfang dieses Steuerelements m&ouml;glich ist. Um den ListView-Konfigurator einzusetzen, gehen Sie wie folgt vor:<\/p>\n<ul>\n<li class=\"aufz-hlung\">F&uuml;gen Sie ein ListView-Steuerelement zum gew&uuml;nschten Formular hinzu und nennen Sie es <b>ctlListView<\/b>.<\/li>\n<li class=\"aufz-hlung\">Importieren Sie die Klasse <b>clsListViewConf <\/b>in die Datenbank, in der sich auch das Formular befindet. Sie finden die Klasse in der Beispieldatenbank zu diesem Beitrag.<\/li>\n<li class=\"aufz-hlung\">Deklarieren Sie eine Objektvariable f&uuml;r diese Klasse:<\/li>\n<\/ul>\n<pre>Dim WithEvents objListViewConf As clsListViewConf<\/pre>\n<ul>\n<li class=\"aufz-hlung\">Legen Sie eine Prozedur f&uuml;r das Ereignis <b>Beim Laden <\/b>des Formulars an. Dieses statten Sie zun&auml;chst mit der Instanzierung der Klasse aus. Au&szlig;erdem weisen Sie der Eigenschaft <b>ListView <\/b>der Instanz einen Verweis auf das betroffene Steuerelement zu:<\/li>\n<\/ul>\n<pre>Private Sub Form_Load()\r\n    Set objListViewConf = New clsListViewConf\r\n    With objListViewConf\r\n        Set .ListView = Me!ctlListView.Object\r\n        ... weitere Befehle\r\n    End With\r\nEnd Sub<\/pre>\n<p>Danach nehmen Sie weitere Einstellungen vor, die wir nun vorstellen. Zun&auml;chst folgen einige allgemeine Eigenschaften, die Sie auch f&uuml;r herk&ouml;mmliche Listenfelder vornehmen k&ouml;nnen:<\/p>\n<pre>.Appearance = ccFlat\r\n.BorderStyle = ccNone\r\n.View = lvwReport\r\n.Font.Name = &quot;Calibri&quot;\r\n.Font.Size = 10<\/pre>\n<p>Dies f&uuml;hrt nach dem F&uuml;llen des ListView-Steuerelements, das wir sp&auml;ter mit der <b>Fill<\/b>-Methode der Klasse <b>clsListViewConf<\/b> durchf&uuml;hren, zu einer Ansicht wie in Bild 1. Alle folgenden Beispiele zielen auf eine solche datenblattartige Ansicht ab; die Darstellung von Icons, Bildern et cetera in anderen Ansichten wird nicht optimal unterst&uuml;tzt. <\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2012_02\/ListViewKonfigurator-web-images\/pic002.png\" alt=\"pic002.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 1: Einfache ListView-Ansicht<\/span><\/b><\/p>\n<p>Um diese Ansicht zu erhalten, brauchen Sie zu den obigen Anweisungen nur noch zwei weitere Codezeilen hinzuzuf&uuml;gen:<\/p>\n<pre>.RowSource = &quot;qryArtikel_ListView&quot;\r\n.Fill<\/pre>\n<p>Die neue Eigenschaft <b>RowSource <\/b>nimmt den Namen einer Tabelle oder Abfrage oder auch einen SQL-Ausdruck an. Die <b>Fill<\/b>-Methode schlie&szlig;lich liest die Werte dieser Datenherkunft aus und schreibt sie wie in der Abbildung in das ListView-Steuerelement. Eine weitere Voraussetzung ist eine entsprechend vorbereitete Datenherkunft. In diesem Fall sieht die Abfrage <b>qryArtikel_ListView<\/b> wie in Bild 2 aus.<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2012_02\/ListViewKonfigurator-web-images\/pic003.png\" alt=\"pic003.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 2: Beispiel f&uuml;r eine Datenherkunft f&uuml;r das ListView-Steuerelement<\/span><\/b><\/p>\n<p>Hier sind zwei Dinge zu beachten: Erstens wurde das Prim&auml;rschl&uuml;sselfeld nach hinten geschoben, da die Felder in der Reihenfolge wie in der Datenherkunft eingelesen und angezeigt werden. Auf diese Weise steht der Artikelname ganz vorn und kann gegebenenfalls manuell im Listenfeld bearbeitet werden. Zweitens wurden Fremdschl&uuml;sselfelder durch die Felder der entsprechenden verkn&uuml;pften Tabellen ersetzt, also <b>Firma <\/b>statt <b>LieferantID <\/b>und <b>Kategoriename <\/b>statt <b>KategorieID<\/b>.<\/p>\n<p><b>Nur die ersten n Felder anzeigen<\/b><\/p>\n<p>Die Datenherkunft muss also bereits die anzuzeigenden Felder in der richtigen Reihenfolge enthalten. Felder, die nicht angezeigt werden sollen, aber dennoch eine Funktion erf&uuml;llen &#8211; also etwa das Prim&auml;rschl&uuml;sselfeld -, landen hinten. Und damit kommen wir zur ersten zus&auml;tzlichen Eigenschaft des ListView-Konfigurators. Die Eigenschaft hei&szlig;t <b>NumberOfVisibleFields <\/b>und nimmt die Anzahl der anzuzeigenden Felder entgegen. Sie stellen diese wie folgt ein &#8211; hier auf die ersten vier Felder:<\/p>\n<pre>objListViewConf.NumberOfVisibleFields = 4<\/pre>\n<p>Das Formular <b>frmListViewTest_ErsteN<\/b> zeigt das Ergebnis (s. Bild 3).<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2012_02\/ListViewKonfigurator-web-images\/pic005.png\" alt=\"pic005.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 4: ListView mit optimaler Spaltenbreite<\/span><\/b><\/p>\n<p class=\"zwischen-berschrift-oberer-spaltenrand\">Feldname oder Beschriftung<\/p>\n<p>Die <b>Fill<\/b>-Methode untersucht automatisch, ob f&uuml;r das Feld einer Tabelle oder einer Abfrage eine Beschriftung angegeben wurde. Ist dies der Fall, wird die Beschriftung statt des Feldnamens als Spalten&uuml;berschrift verwendet.<\/p>\n<p><b>Optimale Spaltenbreite<\/b><\/p>\n<p>Hier tritt gleich ein Problem auf, das auch von Listenfeldern und Datenbl&auml;ttern bekannt ist: Die Spalten werden nicht in der optimalen Breite angezeigt. Das Problem l&ouml;sen Sie mit dem ListView-Konfigurator ganz einfach, indem Sie die Eigenschaft <b>OptimizeColumnWidths <\/b>auf den Wert <b>True <\/b>einstellen. Ein Beispiel hierf&uuml;r finden Sie im Formular <b>frmListViewTest_OptimaleBreite <\/b>(s. Bild 4).<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2012_02\/ListViewKonfigurator-web-images\/pic004.png\" alt=\"pic004.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 3: ListView-Steuerelement mit den ersten vier Feldern der Datenherkunft<\/span><\/b><\/p>\n<p><b>Wert der ersten Spalte anpassen<\/b><\/p>\n<p>Wenn Sie die eingebaute Eigenschaft <b>LabelEdit <\/b>auf den Wert <b>lvwAutomatic <\/b>einstellen, k&ouml;nnen Sie den Wert der ersten Spalte eines Listeneintrags im Bearbeitungsmodus darstellen und diesen &auml;ndern. Das Problem ist, dass die &auml;nderung nicht auf die zugrunde liegende Tabelle &uuml;bertragen wird, da das ListView-Steuerelement ja normalerweise nicht an eine Datenherkunft gebunden ist. Dies &auml;ndert der ListView-Konfigurator. Er f&uuml;gt einige weitere Eigenschaften hinzu, die das &auml;ndern des Wertes dieser einen Spalte erlauben. Dazu ben&ouml;tigen Sie drei Eigenschaften:<\/p>\n<ul>\n<li class=\"aufz-hlung\"><b>SaveLabelEdits<\/b>: Legt mit dem Wert <b>True<\/b> fest, dass &auml;nderungen an der ersten angezeigten Spalte direkt nach der &auml;nderung in die zugrunde liegende Tabelle &uuml;bertragen werden.<\/li>\n<li class=\"aufz-hlung\"><b>PrimaryKey<\/b>: Legt fest, welches Feld der Datenherkunft das Prim&auml;rschl&uuml;sselfeld ist.<\/li>\n<li class=\"aufz-hlung\"><b>BaseTable<\/b>: Legt fest, aus welcher Tabelle Prim&auml;rschl&uuml;sselfeld und zu &auml;nderndes Feld stammen. Beide m&uuml;ssen zur gleichen Tabelle geh&ouml;ren.<\/li>\n<\/ul>\n<p>Erst die beiden Eigenschaften <b>PrimaryKey<\/b> und <b>BaseTable <\/b>erlauben es, die Tabelle und den Datensatz zu finden, in welche die vorgenommene &auml;nderung &uuml;bertragen werden soll. Die Konfiguration sieht nun wie folgt aus:<\/p>\n<pre>Private Sub Form_Load()\r\n    Set objListViewConf = New clsListViewConf\r\n    With objListViewConf\r\n        Set .ListView = Me!ctlListView.Object\r\n        .Appearance = ccFlat\r\n        .BorderStyle = ccNone\r\n        .View = lvwReport\r\n        .FullRowSelect = True\r\n        .Font.Name = &quot;Calibri&quot;\r\n        .Font.Size = 10\r\n        .LabelEdit = lvwAutomatic\r\n        .RowSource = &quot;qryArtikel_ListView&quot;\r\n        .NumberOfVisibleFields = 4\r\n        .PrimaryKey = &quot;ArtikelID&quot;\r\n        .BaseTable = &quot;tblArtikel&quot;\r\n        .OptimizeColumnWidths = True\r\n        .SaveLabelEdits = True\r\n        .Fill\r\n    End With\r\nEnd Sub<\/pre>\n<p>Bild 5 zeigt das Formular <b>frmListViewTest_Anpassbar <\/b>mit einem Feld, das gerade bearbeitet wird.<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2012_02\/ListViewKonfigurator-web-images\/pic006.png\" alt=\"pic006.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 5: &auml;ndern der ersten Spalte eines Listenfeldeintrags<\/span><\/b><\/p>\n<p><b>Kontrollk&auml;stchen anzeigen und speichern<\/b><\/p>\n<p>Eines der interessanten Features von ListViews ist die M&ouml;glichkeit, in der ersten Spalte ein Kontrollk&auml;stchen anzuzeigen und mit beliebigen Daten zu f&uuml;llen. Mit ein paar Zeilen Code k&ouml;nnen &auml;nderungen daran in der zugrunde liegenden Tabelle gespeichert werden. Die Klasse <b>clsListViewConf <\/b>bietet vier Eigenschaften an, mit denen Sie Kontrollk&auml;stchen anzeigen, f&uuml;llen und &auml;nderungen in die zugrunde liegende Tabelle schreiben k&ouml;nnen:<\/p>\n<ul>\n<li class=\"aufz-hlung\"><b>Checkboxes <\/b>ist eine <b>Boolean<\/b>-Eigenschaft, die bei der Einstellung <b>True <\/b>ein Kontrollk&auml;stchen in der ersten Spalte einblendet. Allein mit dieser eingebauten Eigenschaft geschieht nichts weiter &#8211; es werden keine Kontrollk&auml;stchen mit dem Wert <b>True <\/b>vorbelegt und auch keine &auml;nderungen gespeichert.<\/li>\n<li class=\"aufz-hlung\"><b>CheckBoxField<\/b>: Diese Eigenschaft erwartet den Namen eines <b>Boolean<\/b>-Feldes, das den Wert f&uuml;r das Kontrollk&auml;stchen liefert. Im Beispiel haben wir daf&uuml;r das Feld <b>Auslaufartikel <\/b>angegeben. Dementsprechend wird das Kontrollk&auml;stchen f&uuml;r alle Auslaufartikel aktiviert (s. Bild 6).<\/li>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2012_02\/ListViewKonfigurator-web-images\/pic007.png\" alt=\"pic007.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 6: Automatisch gef&uuml;llte Kontrollk&auml;stchen<\/span><\/b><\/p>\n<li class=\"aufz-hlung\"><b>CheckboxInOwnColumn<\/b>: Normalerweise wird das Kontrollk&auml;stchen gemeinsam mit dem entsprechenden Wert mit in der ersten Spalte angezeigt. Dies k&ouml;nnen Sie &auml;ndern, indem Sie die Eigenschaft <b>CheckboxInOwnColumn <\/b>auf den Wert <b>True <\/b>einstellen. In diesem Fall wird eine eigene Spalte f&uuml;r die Kontrollk&auml;stchen angelegt.<\/li>\n<li class=\"aufz-hlung\"><b>CheckboxUpdate<\/b>: Diese Eigenschaft stellen Sie auf <b>True <\/b>ein, wenn &auml;nderungen an den Kontrollk&auml;stchen direkt in das entsprechende Feld der Datenherkunft des ListView-Steuerelements &uuml;bertragen werden sollen. Diese Funktion ber&uuml;cksichtigt das f&uuml;r <b>CheckboxField <\/b>angegebene Feld und ben&ouml;tigt auch die Angabe der beiden Eigenschaften <b>PrimaryKey <\/b>und <b>BaseTable<\/b>.<\/li>\n<\/ul>\n<p>Eine Beispielkonfiguration k&ouml;nnte so aussehen:<\/p>\n<pre>.Checkboxes = True\r\n.CheckboxField = &quot;Auslaufartikel&quot;\r\n.CheckboxInOwnColumn = True\r\n.CheckboxUpdate = True<\/pre>\n<p>Es spielt keine Rolle, ob das Kontrollk&auml;stchen in einer eigenen Spalte oder gemeinsam mit dem Wert der eigentlichen ersten Spalte angezeigt wird. Bild 7 zeigt den Unterschied zwischen ListView-Steuerelementen ohne Kontrollk&auml;stchen, mit Kontrollk&auml;stchen mit Text in der ersten Spalte und mit Kontrollk&auml;stchen in einer eigenen Spalte.<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2012_02\/ListViewKonfigurator-web-images\/pic009.png\" alt=\"pic009.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 7: Checkbox-Varianten<\/span><\/b><\/p>\n<p><b>Erweiterte Programmierm&ouml;glichkeiten<\/b><\/p>\n<p>Durch das Wrappen der kompletten ListView-Klasse mit der Klasse <b>clsListViewConf <\/b>k&ouml;nnen auch Ereignisse hinzugef&uuml;gt werden. Manchmal fehlt beispielsweise ein einfaches Ereignis, das beim Doppelklick den Prim&auml;rschl&uuml;sselwert des angeklickten Elements liefert. Bild 8 zeigt, wie Sie das neue Ereignis <b>ItemDoubleClick <\/b>aus der Liste der Ereignisprozeduren f&uuml;r das Objekt <b>objListViewConf <\/b>ausw&auml;hlen k&ouml;nnen. Wenn Sie die Ereignisprozedur wie folgt erg&auml;nzen, zeigt das ListView-Steuerelement beim Doppelklick auf einen Eintrag den Prim&auml;rschl&uuml;sselwert des jeweiligen Eintrags an &#8211; vorausgesetzt, Sie haben die Eigenschaft <b>PrimaryKey <\/b>auf das Prim&auml;rschl&uuml;sselfeld der Datenherkunft eingestellt.<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2012_02\/ListViewKonfigurator-web-images\/pic008.png\" alt=\"pic008.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 8: Hinzuf&uuml;gen neuer Ereignisse<\/span><\/b><\/p>\n<p><b>ListView-Konfigurator im Eigenbau<\/b><\/p>\n<p>Sie haben nun die M&ouml;glichkeiten des ListView-Konfigurators kennengelernt. Damit Sie den ListView-Konfigurator selbst erweitern k&ouml;nnen, zeigen wir auf den n&auml;chsten Seiten, wie dieser funktioniert. Der ListView-Konfigurator soll zun&auml;chst das Zuweisen einer Datenherkunft wie einer Tabelle, einer Abfrage oder auch einer SQL-SELECT-Anweisung erm&ouml;glichen. Um dies zu erledigen, brauchen Sie zumindest eine Prozedur, der Sie einen Verweis auf das betroffene ListView-Steuerelement zuweisen und dem Sie die zu verwendende Datenherkunft mitteilen. Das allein reicht jedoch nicht aus: In zus&auml;tzlichen Schritten m&uuml;ssen Sie festlegen, welche Felder der Datenherkunft angezeigt werden, ob ein Kontrollk&auml;stchen dargestellt werden soll und an welches Feld dieses gebunden wird und so weiter. Das ist ein wenig viel f&uuml;r eine einfache Prozedur mit einigen Parametern: Eine Klasse muss her, und diese soll sowohl die vorhandenen Eigenschaften, Methoden und Ereignisse des ListView-Steuerelements abbilden als auch die gew&uuml;nschten neuen M&ouml;glichkeiten anbieten.<\/p>\n<p><b>ListView-Klasse wrappen<\/b><\/p>\n<p>Also beginnen wir, indem wir eine neue Klasse namens <b>clsListViewConf <\/b>erstellen, die alle Eigenschaften, Methoden und Ereignisse des echten ListView-Steuerelements abbildet. Dies ist teilweise eine echte Sisyphus-Arbeit, aber kein Problem f&uuml;r Sie: Sie k&ouml;nnen ja die Klasse der Beispieldatenbank in eigene Projekte &uuml;bernehmen. An dieser Stelle sollen Sie jedoch trotzdem erfahren, wie die Basisfunktionen des ListView-Steuerelements abgebildet wurden. Nachdem die Klasse dann fertiggestellt ist, f&uuml;gen wir dieser weitere Eigenschaften wie etwa die zum Zuweisen der Datenherkunft hinzu &#8211; und die dahinter stehende Funktionalit&auml;t sorgt dann daf&uuml;r, dass die entsprechenden Daten auch im ListView-Steuerelement angezeigt werden.<\/p>\n<p>Die nachfolgenden Schritte sind n&ouml;tig, damit Sie nur eine Klasse ben&ouml;tigen, um auf die Funktionen des ListView-Steuerelements zuzugreifen. Sie sollen ja nicht nur die neuen, hinzugef&uuml;gten Funktionen nutzen, sondern auch die vorhandenen Features.<\/p>\n<p><b>Eigenschaften abbilden<\/b><\/p>\n<p>Wenn Sie Eigenschaften f&uuml;r ein ListView-Steuerelement per VBA einstellen, referenzieren Sie dieses zun&auml;chst und stellen dann die Eigenschaften ein. Im folgenden Beispiel geschieht das beispielsweise f&uuml;r die Eigenschaft <b>Checkboxes<\/b>, die angibt, ob f&uuml;r jeden Eintrag ein Kontrollk&auml;stchen angezeigt werden soll:<\/p>\n<pre>Dim objListView As MSComctlLib.ListView\r\nSet objListView = Me!ctlListView.Object\r\nWith objListView\r\n    .Checkboxes = True\r\nEnd With<\/pre>\n<p>Dies bekommen Sie nat&uuml;rlich auch &uuml;ber den entsprechenden Eigenschaften-Dialog des Steuerelements hin (s. Bild 9).<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2012_02\/ListViewKonfigurator-web-images\/pic001.png\" alt=\"pic001.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 9: Eigenschaften-Dialog eines ListView-Steuerelements<\/span><\/b><\/p>\n<p><!--30percent--><\/p>\n<p>Wenn Sie jedoch einmal ein ListView-Steuerelement samt Konfiguration in ein anderes Formular oder auch in eine andere Anwendung &uuml;bernehmen m&ouml;chten, nehmen Sie die Einstellungen per VBA vor &#8211; Sie brauchen dann nur ein neues ListView-Steuerelement anzulegen und diesem mit den kopierten VBA-Anweisungen zur Laufzeit die Eigenschaften zuzuweisen. Nat&uuml;rlich k&ouml;nnen Sie unter VBA auch direkt &uuml;ber eine Referenz auf das Steuerelement zugreifen und Eigenschaften einstellen:<\/p>\n<pre>Me!ctlListView.Checkboxes = True<\/pre>\n<p>Nachteil: Diese Eigenschaften werden nicht per IntelliSense angezeigt. Um also sp&auml;ter alle Eigenschaften des ListView-Steuerelements auch &uuml;ber unsere neue Klasse nutzen zu k&ouml;nnen, m&uuml;ssen wir diese wrappen. Das bedeutet, dass wir in der Klasse zun&auml;chst eine Objektvariable anlegen, die einen Verweis auf das ListView-Steuerelement aufnimmt:<\/p>\n<pre>Private WithEvents m_ListView As MSComctlLib.ListView<\/pre>\n<p>Um dieser Objektvariablen einen Verweis auf das ListView-Steuerelement zuweisen zu k&ouml;nnen, legen Sie die folgende <b>Property Set<\/b>-Anweisung an:<\/p>\n<pre>Public Property Set ListView(objListView As MSComctlLib.ListView)\r\n    Set m_ListView = objListView\r\nEnd Property<\/pre>\n<p>Wenn Sie die Klasse unter dem Namen <b>clsListViewConf <\/b>speichern, deklarieren Sie in einem Formular eine Objektvariable wie die folgende, um eine Instanz der Klasse aufzunehmen:<\/p>\n<pre>Dim WithEvents objListViewConf As clsListViewConf<\/pre>\n<p>In der Prozedur <b>Form_Load <\/b>weisen Sie diese dann zu:<\/p>\n<pre>Private Sub Form_Load()\r\n    Set objListViewConf = New clsListViewConf\r\n    With objListViewConf\r\n        Set .ListView = Me!ctlListView.Object\r\n    End With\r\nEnd Sub<\/pre>\n<p>Nun zu den Eigenschaften: Um die oben bereits erw&auml;hnte Eigenschaft <b>Checkboxes <\/b>abzubilden, brauchen Sie eine <b>Property Let<\/b>-Prozedur, mit der Sie den Wert der Eigenschaft von au&szlig;en einstellen k&ouml;nnen, und eine <b>Property Get<\/b>-Prozedur, mit der Sie den aktuellen Wert auslesen k&ouml;nnen.<\/p>\n<p>Die <b>Property Let<\/b>-Prozedur fragt den zu setzenden Wert ab und stellt diesen direkt f&uuml;r die aktuelle Instanz des ListView-Steuerelements ein:<\/p>\n<pre>Public Property Let Checkboxes(bol As Boolean)\r\n    m_ListView.Checkboxes = bol\r\nEnd Property<\/pre>\n<p>Die <b>Property Get<\/b>-Prozedur gibt den aktuellen Wert zur&uuml;ck:<\/p>\n<pre>Public Property Get Checkboxes() As Boolean\r\n    Checkboxes = m_ListView.Checkboxes\r\nEnd Property<\/pre>\n<p>Im Klassenmodul eines Formulars greifen Sie dann wie gewohnt auf diese Eigenschaft zu &#8211; mit dem Unterschied, dass Sie diese von der Instanz der Klasse <b>clsListViewConf <\/b>beziehen und nicht direkt vom ListView-Objekt:<\/p>\n<pre>With objListViewConf\r\n    Set .ListView = Me!ctlListView.Object\r\n    .Checkboxes = True\r\n    Debug.Print .Checkboxes\r\nEnd With<\/pre>\n<p>Auf die gleiche Weise wurden in der Klasse <b>clsListViewConf <\/b>alle weiteren Eigenschaften des <b>ListView<\/b>-Steuerelements abgebildet.<\/p>\n<p class=\"zwischen-berschrift-oberer-spaltenrand\">Abbildung der Methoden und Funktionen<\/p>\n<p>Auch die eingebauten Methoden des ListView-Steuerelements sollen zur Verf&uuml;gung stehen. Eine einfache Methode wie <b>Refresh<\/b> wird normalerweise so aufgerufen:<\/p>\n<pre>objListView.Refresh<\/pre>\n<p>Damit diese auch als Methode der in der Klasse <b>clsListViewConf <\/b>unter <b>m_ListView <\/b>referenzierten Objektvariablen aufgerufen werden kann, legen Sie dort etwa folgende &ouml;ffentliche Funktion an:<\/p>\n<pre>Public Sub Refresh()\r\n    m_ListView.Refresh\r\nEnd Sub<\/pre>\n<p>Bei einer Funktion wie <b>HitTest<\/b>, die einen Verweis auf ein angeklicktes <b>ListItem<\/b>-Objekt zur&uuml;ckliefert, legen Sie wiederum eine Funktion an. Beachten Sie, dass Sie die gleichen Parameter wie in der Original-Funktion verwenden und auch das von dieser Funktion gelieferte Ergebnis als Ergebnis der Wrapper-Funktion zur&uuml;ckliefern:<\/p>\n<pre>Public Function HitTest(ByVal x As Single, ByVal y As Single) As ListItem\r\n    HitTest = m_ListView.HitTest(x, y)\r\nEnd Function<\/pre>\n<p>&auml;hnlich werden auch die &uuml;brigen Methoden und Funktionen in der Klasse <b>clsListViewConf <\/b>abgebildet.<\/p>\n<p><b>Abbildung von Ereignissen<\/b><\/p>\n<p>Wenn Sie die Klasse <b>clsListViewConf <\/b>mit dem Schl&uuml;sselwort <b>WithEvents <\/b>deklarieren, soll dieses die gleichen Ereignisprozeduren anbieten wie auch das ListView-Steuerelement selbst:<\/p>\n<pre>Dim WithEvents objListViewConf As clsListViewConf<\/pre>\n<p>Dazu ist es au&szlig;erdem wichtig, dass Sie die Objektvariable f&uuml;r den Verweis auf das ListView-Steuerelement ebenfalls als <b>WithEvents<\/b> deklarieren:<\/p>\n<pre>Private WithEvents m_ListView As MSComctlLib.ListView<\/pre>\n<p>In der Klasse <b>clsListViewConf <\/b>legen Sie zun&auml;chst eine Ereignisprozedur an, die durch das Ereignis <b>Click <\/b>der Objektvariable <b>m_ListView <\/b>ausgel&ouml;st wird:<\/p>\n<pre>Private Sub m_ListView_Click()\r\nEnd Sub<\/pre>\n<p>Wie kann die Klasse dieses Ereignis nun an das instanzierende Objekt, in diesem Fall das Formular mit dem ListView-Steuerelement, weiterleiten Dazu legen Sie zun&auml;chst ein Ereignis fest:<\/p>\n<pre>Public Event Click()<\/pre>\n<p>Damit k&ouml;nnen Sie nun bereits vom Formularmodul aus eine entsprechende Ereignisprozedur anlegen:<\/p>\n<pre>Private Sub objListViewConf_Click()\r\nEnd Sub<\/pre>\n<p>Fehlt nur noch eine Verbindung von der eigentlichen Ereignisprozedur innerhalb der Klasse <b>clsListViewConf<\/b> zum Ereignis. Diese schaffen Sie, indem Sie f&uuml;r die Ereignisprozedur innerhalb der Klasse das betroffene Ereignis mit der <b>RaiseEvent<\/b>-Methode ausl&ouml;sen:<\/p>\n<pre>Private Sub m_ListView_Click()\r\n    RaiseEvent Click\r\nEnd Sub<\/pre>\n<p>Fertig! Auf diese Weise k&ouml;nnen Sie Ereignisse, die durch das in <b>clsListViewConf <\/b>referenzierte ListView-Steuerelement ausgel&ouml;st werden, an Objekte weiterleiten, welche die Ereignisse der Klasse <b>clsListViewConf <\/b>implementieren. Wenn Sie dies f&uuml;r ein Ereignis mit Parametern durchf&uuml;hren wollen, erstellen Sie zun&auml;chst ein entsprechendes Ereignis mit den betroffenen Parametern:<\/p>\n<pre>Public Event KeyDown(ByRef KeyCode As Integer, ByVal Shift As Integer)<\/pre>\n<p>Dann legen Sie eine Ereignisprozedur an, die durch das entsprechende Ereignis des Steuerelements ausgel&ouml;st wird und das passende benutzerdefinierte Ereignis abfeuert:<\/p>\n<pre>Private Sub m_ListView_KeyDown(KeyCode As Integer, ByVal Shift As Integer)\r\n    RaiseEvent KeyDown(KeyCode, Shift)\r\nEnd Sub<\/pre>\n<p><b>KeyCode <\/b>etwa ist ein Parameter, der sowohl den Code der gedr&uuml;ckten Taste liefert und der auch eingestellt werden kann, um einen anderen Code weiterzuleiten. Wenn Sie also nur einen Tastenanschlag auswerten, diesen aber nicht weiterleiten wollen, verwenden Sie eine Ereignisprozedur wie die folgende:<\/p>\n<pre>Private Sub objListViewConf_KeyDown(KeyCode As Integer, ByVal Shift As Integer)\r\n    Debug.Print KeyCode\r\n    KeyCode = 0\r\nEnd Sub<\/pre>\n<p>Diese Prozedur gibt den <b>KeyCode <\/b>im Direktfenster aus und stellt diesen dann auf <b>0 <\/b>ein, damit sich der Tastenanschlag nicht auswirkt.<\/p>\n<p><b>Datenherkunft zuweisen<\/b><\/p>\n<p>Nach dieser etwas umfangreicheren Vorbereitung k&uuml;mmern wir uns um die erste und wohl auch umfassendste Erweiterung des ListView-Steuerelements. Die Eigenschaft, die wir hier einf&uuml;hren, hei&szlig;t <b>RowSource<\/b>. Der Wert, also der Name der Tabelle oder Abfrage beziehungsweise der SQL-SELECT-Ausdruck, soll in der Variablen <b>m_RowSource <\/b>gespeichert werden:<\/p>\n<pre>Private m_Rowsource As String<\/pre>\n<p>Die <b>Property Let<\/b>-Prozedur zum Zuweisen der Eigenschaft sieht so aus:<\/p>\n<pre>Public Property Let RowSource(strRowsource As String)\r\n    m_Rowsource = strRowsource\r\nEnd Property<\/pre>\n<p>Nun fragen Sie sich m&ouml;glicherweise, warum nach dem Zuweisen der Datenherkunft nicht gleich auch das Listenfeld gef&uuml;llt werden soll, was sich gleich in der <b>Property Let<\/b>-Prozedur erledigen lie&szlig;e. Der Grund ist, dass es noch einige weitere Parameter gibt, die gegebenenfalls vorab eingestellt werden sollen: Welche Felder der Datenherkunft sollen angezeigt werden Soll das ListView-Steuerelement Kontrollk&auml;stchen f&uuml;r jeden Listeneintrag anzeigen Und aus welchem Feld der Datenherkunft sollen diese Kontrollk&auml;stchen gef&uuml;llt werden Daher legen wir zum F&uuml;llen des ListView-Steuerelements eine eigene Methode namens <b>Fill <\/b>an:<\/p>\n<pre>Public Sub Fill()\r\n    ''ListView f&uuml;llen\r\nEnd Sub<\/pre>\n<p>Diese Prozedur wird sp&auml;ter alle notwendigen Schritte zum F&uuml;llen des ListView-Steuerelements vornehmen. Vorher schauen wir uns noch die von uns hinzugef&uuml;gten Eigenschaften an und zeigen, wie Sie diese in der Klasse <b>clsListView <\/b>implementieren. Die folgenden privat deklarierten Variablen werden mithilfe entsprechender <b>Property Let<\/b>-Prozeduren entgegengenommen. Beispiele f&uuml;r den Einsatz und somit deren Bedeutung wurden bereits weiter oben angef&uuml;hrt:<\/p>\n<pre>Private m_Rowsource As String\r\nPrivate m_NumberOfVisibleFields As Integer\r\nPrivate m_CheckboxField As String\r\nPrivate m_CheckboxUpdate As Boolean\r\nPrivate m_BaseTable As String\r\nPrivate m_PrimaryKey As String\r\nPrivate m_CheckboxInOwnColumn As Boolean\r\nPrivate m_OptimizeColumnWidths As Boolean\r\nPrivate m_SaveLabelEdits As Boolean<\/pre>\n<p>Die Prozedur zum Einstellen der Eigenschaft <b>RowSource <\/b>sieht beispielsweise so aus:<\/p>\n<pre>Public Property Let RowSource(strRowsource As String)\r\n    m_Rowsource = strRowsource\r\nEnd Property<\/pre>\n<p>Da die &uuml;brigen <b>Property Let<\/b>-Prozeduren identisch aufgebaut sind, bilden wir diese hier nicht alle ab. Die meisten dieser Variablen werden in der Fill-Methode verwendet, einige auch an anderen Stellen.<\/p>\n<p class=\"zwischen-berschrift-oberer-spaltenrand\">Daten ins Listenfeld schreiben<\/p>\n<p>Die <b>Fill<\/b>-Methode &uuml;bernimmt die Arbeit, f&uuml;r die sonst jeweils die individuelle Programmierung des ListView-Steuerelements n&ouml;tig ist (s. <span class=\"verweis-ohneumbruch\"><a href=\"#anker-57-anchor\">Listing 1<\/a><\/span>). Hier reicht die Angabe einiger Eigenschaften aus, den Rest erledigt die <b>Fill<\/b>-Methode. Gleich zu Beginn pr&uuml;ft diese Methode, ob die Variable <b>m_RowSource <\/b>&uuml;berhaupt einen Wert enth&auml;lt. Falls nicht, liegt keine Datenherkunft vor und die Prozedur wird unter Ausgabe einer entsprechenden Meldung abgebrochen. Enth&auml;lt <b>m_RowSource <\/b>hingegen einen Wert, erstellt die Prozedur eine Datensatzgruppe auf Basis des angegebenen Ausdrucks und referenziert diese mit der Variablen <b>rst<\/b>. Danach f&uuml;llt sie einige weitere Variablen, die f&uuml;r den weiteren Verlauf interessant sind &#8211; allerdings nicht unbedingt f&uuml;r die <b>Fill<\/b>-Methode, sondern f&uuml;r weitere Ereignisse wie etwa das Aktivieren einer Checkbox oder das &auml;ndern des Inhalts der ersten Spalte des ListView-Steuerelements:<\/p>\n<p class=\"listingueberschrift\">Listing 1: Anhaken eines Mail-Ordners im TreeView-Steuerelement<\/p>\n<pre>Public Sub Fill()\r\n    Dim db As DAO.Database\r\n    Dim rst As DAO.Recordset\r\n    Dim objColumnHeader As MSComctlLib.ColumnHeader\r\n    Dim objListitem As MSComctlLib.ListItem\r\n    Dim i As Integer\r\n    Dim intFirstField As Integer\r\n    If Len(m_Rowsource) = 0 Then\r\n         MsgBox &quot;Keine Datenherkunft f&uuml;r die Eigenschaft ''RowSource'' angegeben.&quot;\r\n        Exit Sub\r\n    End If\r\n    Set db = CurrentDb\r\n    Set rst = db.OpenRecordset(m_Rowsource, dbOpenDynaset)\r\n    strLabelfield = rst.Fields(0).Name\r\n    bolLabelIsString = IsTextfield(rst.Fields(0))\r\n    bolPKIsString = IsTextfield(rst.Fields(m_PrimaryKey))\r\n    If m_NumberOfVisibleFields = 0 Then\r\n         m_NumberOfVisibleFields = rst.Fields.Count\r\n    End If\r\n    If m_ListView.Checkboxes And m_CheckboxInOwnColumn Then\r\n         m_ListView.ColumnHeaders.Add , , , 330\r\n    End If\r\n    For i = 0 To m_NumberOfVisibleFields - 1\r\n         m_ListView.ColumnHeaders.Add , , GetCaption(rst.Fields(i))\r\n    Next i\r\n    Do While Not rst.EOF\r\n         Set objListitem = m_ListView.ListItems.Add()\r\n        If Len(m_PrimaryKey) &gt; 0 Then\r\n            objListitem.Key = &quot;a&quot; &amp; rst.Fields(m_PrimaryKey)\r\n        End If\r\n        If m_ListView.Checkboxes Then\r\n            If m_CheckboxInOwnColumn Then\r\n                objListitem.Text = rst.Fields(0).Value\r\n                intFirstField = 0\r\n            Else\r\n                objListitem.Text = rst.Fields(0).Value\r\n                intFirstField = 1\r\n            End If\r\n            If Len(m_CheckboxField) &gt; 0 Then\r\n                objListitem.Checked = rst.Fields(m_CheckboxField)\r\n            End If\r\n        Else\r\n            objListitem.Text = rst.Fields(0).Value\r\n            intFirstField = 1\r\n        End If\r\n        For i = intFirstField To m_NumberOfVisibleFields - 1\r\n            objListitem.ListSubItems.Add , , rst.Fields(i).Value\r\n        Next i\r\n        rst.MoveNext\r\n    Loop\r\n    If m_OptimizeColumnWidths Then\r\n         LVColumnWidth m_ListView, True\r\n        If m_ListView.Checkboxes And m_CheckboxInOwnColumn Then\r\n            m_ListView.ColumnHeaders(1).Width = 330\r\n        End If\r\n    End If\r\nEnd Sub<\/pre>\n<ul>\n<li class=\"aufz-hlung\"><b>strLabelfield <\/b>nimmt den Namen des ersten Feldes der Datenherkunft auf, dessen Inhalt in der ersten Spalte erscheint und direkt &uuml;ber das ListView-Steuerelement ge&auml;ndert werden kann &#8211; vorausgesetzt, der Benutzer hat die Eigenschaft <b>EditLabel <\/b>auf <b>lvwAutomatic <\/b>eingestellt. Der Name dieses Feldes ist sp&auml;ter interessant, wenn der Benutzer den Inhalt dieses Feldes &auml;ndert und die &auml;nderung in die zugrunde liegende Tabelle &uuml;bertragen werden soll.<\/li>\n<li class=\"aufz-hlung\"><b>bolLabelIsString<\/b>: Gibt an, ob das Feld der ersten Spalte ein Text- oder Memofeld oder ein anderes Feld ist. Um dies zu ermitteln, wird eine Referenz auf das entsprechende <b>Field<\/b>-Objekt an die Funktion <b>IsTextfield <\/b>&uuml;bergeben, die entweder den Wert <b>True <\/b>oder <b>False<\/b> zur&uuml;ckliefert.<\/li>\n<li class=\"aufz-hlung\"><b>bolPKIsString<\/b>: Gegebenenfalls wird ein Textfeld als Prim&auml;rschl&uuml;sselfeld verwendet. Ist dies der Fall, wird der Wert der Variablen <b>bolPKIsString <\/b>ebenfalls auf <b>True <\/b>eingestellt.<\/li>\n<\/ul>\n<p><b>bolLabelIsString <\/b>und <b>bolPKIsString <\/b>werden sp&auml;ter ben&ouml;tigt, wenn der Benutzer &auml;nderungen an eventuell angezeigten Kontrollk&auml;stchen oder an den Werten der ersten Spalte durchf&uuml;hrt. Die Funktion, die den Felddatentyp ermittelt und so diese beiden Variablen f&uuml;llt, sieht so aus:<\/p>\n<pre>Private Function IsTextfield(fld As DAO.Field) As Boolean\r\n    Select Case fld.Type\r\n        Case dbText, dbMemo\r\n            IsTextfield = True\r\n    End Select\r\nEnd Function<\/pre>\n<p>Zur&uuml;ck zur Methode <b>Fill<\/b>: Diese pr&uuml;ft im n&auml;chsten Schritt, ob der Benutzer einen Wert f&uuml;r die Eigenschaft <b>NumberOfVisibleFields <\/b>angegeben hat. Falls nicht, legt die Prozedur f&uuml;r die Variable <b>m_NumberOfVisibleFields <\/b>die Anzahl der in der Datenherkunft enthaltenen Felder fest.<\/p>\n<p>Nun folgt ein Block, der die einzelnen Spalten und deren &Uuml;berschriften anlegt. Im ersten Schritt pr&uuml;ft die Prozedur, ob das ListView-Steuerelement Kontrollk&auml;stchen anzeigen soll und ob diese in einer eigenen Spalte erscheinen sollen. Falls ja, wird eine Spalte mit entsprechender Breite angelegt.<\/p>\n<p>Danach legt die Prozedur innerhalb einer <b>For&#8230;Next<\/b>-Schleife die entsprechend dem Wert von <b>m_NumberOfVisibleFields <\/b>ben&ouml;tigte Anzahl Spalten an. Jede Spalte wird dabei mit der entsprechenden Beschriftung versehen, die durch die Funktion <b>GetCaption <\/b>ermittelt wird. Warum ist dazu eine Funktion n&ouml;tig Nicht immer soll der Feldname als Spalten&uuml;berschrift verwendet werden. In Tabellen und Abfragen k&ouml;nnen Sie mit der Eigenschaft <b>Beschriftung <\/b>eines Feldes eine &Uuml;berschrift etwa f&uuml;r die Datenblattansicht festlegen. Liegt eine solche Beschriftung vor, wird diese als Spalten&uuml;berschrift f&uuml;r das ListView-Steuerelement verwendet, sonst liefert die Funktion <b>GetCaption <\/b>schlicht den Feldnamen zur&uuml;ck:<\/p>\n<pre>Private Function GetCaption(fld As DAO.Field) As String\r\n    Dim prp As DAO.Property\r\n    Set prp = fld.Properties(&quot;Caption&quot;)\r\n    If Not prp Is Nothing Then\r\n        GetCaption = prp.Value\r\n    Else\r\n        GetCaption = fld.Name\r\n    End If\r\nEnd Function<\/pre>\n<p>Schlie&szlig;lich folgt der interessanteste Teil der <b>Fill<\/b>-Prozedur: das F&uuml;llen des ListView-Steuerelements mit Daten. Dies geschieht innerhalb einer <b>Do While<\/b>-Schleife &uuml;ber alle Datens&auml;tze des Recordsets <b>rst<\/b>. Die erste Anweisung legt einen neuen Eintrag im Listenfeld an &#8211; ohne jede weitere Information. Diese werden in den folgenden Schritten hinzugef&uuml;gt. Die erste h&auml;ngt davon ab, ob der Benutzer angegeben hat, welches Feld als Prim&auml;rschl&uuml;sselfeld verwendet werden soll. In diesem Fall wird die <b>Key<\/b>-Eigenschaft mit einem Ausdruck gef&uuml;llt, der aus dem Buchstaben <b>a <\/b>und dem Wert des Prim&auml;rschl&uuml;sselfeldes besteht. Der Key kann dann sp&auml;ter ausgelesen werden, wenn &auml;nderungen an einem Listeneintrag in die zugrunde liegende Datenherkunft &uuml;bernommen werden sollen.<\/p>\n<p>Die folgende <b>If&#8230;Then<\/b>-Bedingung untersucht, ob ein Kontrollk&auml;stchen je Datensatz angezeigt werden soll. Falls ja, gibt es weitere zwei M&ouml;glichkeiten: Entweder das Kontrollk&auml;stchen soll in einer eigenen Spalte angezeigt werden oder nicht. Falls ja, wird die erste Spalte gar nicht mit einem Wert gef&uuml;llt und die Variable <b>intFirstField <\/b>auf <b>0 <\/b>eingestellt &#8211; mehr dazu sp&auml;ter. Anderenfalls wird der Wert des ersten Feldes der Datenherkunft als Wert der ersten Spalte angegeben und <b>intFirstField <\/b>auf den Wert <b>1 <\/b>gesetzt. Wenn der Benutzer f&uuml;r die Eigenschaft <b>CheckboxField <\/b>ein Feld angegeben hat, aus dem das Kontrollk&auml;stchen seine Daten beziehen soll, wird die Eigenschaft <b>Checked <\/b>des Kontrollk&auml;stchens entsprechend dem Wert des angegebenen Feldes des aktuellen Datensatzes eingestellt.<\/p>\n<p>Wenn das ListView-Steuerelement kein Kontrollk&auml;stchen anzeigen soll, wird die erste Spalte direkt mit dem Wert des ersten Feldes der Datenherkunft gef&uuml;llt, die Variable <b>intFirstField <\/b>erh&auml;lt wiederum den Wert <b>1<\/b>.<\/p>\n<p>Die Bedeutung der Variablen <b>intFirstField <\/b>offenbart sich in der nun folgenden <b>For&#8230;Next<\/b>-Schleife, in der alle verbleibenden Felder der Datenherkunft durchlaufen werden &#8211; entsprechend der in <b>m_NumberOfFields <\/b>angegebenen Anzahl der auszugebenden Felder. &#8222;Alle verbleibenden&#8220; bedeutet, dass entweder alle Felder (wenn das erste Feld nicht in der ersten Spalte gelandet ist, weil dort allein das Kontrollk&auml;stchen angezeigt werden soll) oder alle Felder au&szlig;er dem ersten Feld in weitere Spalten eingetragen werden.<\/p>\n<p>Schlie&szlig;lich pr&uuml;ft die Prozedur <b>Fill <\/b>noch, ob die Spaltenbreiten optimiert werden sollen. Falls ja, ruft sie die Prozedur <b>LVColumnWidth <\/b>auf und optimiert so die Spaltenbreiten. Der zweite Parameter dieses Aufrufs legt fest, ob die Spalten&uuml;berschriften in die Optimierung mit einbezogen werden sollen. Die folgenden Abschnitte beschreiben noch weitere Feinheiten &#8211; zum Beispiel, wie das Speichern der Werte des Kontrollk&auml;stchens oder der ersten Spalte verl&auml;uft oder wie die benutzerdefinierte Ereignisprozedur <b>ItemDoubleClick <\/b>funktioniert.<\/p>\n<p><b>Doppelklick auf Elemente<\/b><\/p>\n<p>Beginnen wir gleich mit der Ereignisprozedur, die durch einen Doppelklick auf einen der Eintr&auml;ge des ListView-Steuerelements ausgel&ouml;st wird. Um einer Klasse ein Ereignis hinzuzuf&uuml;gen, legen Sie dieses samt den gew&uuml;nschten Parametern wie folgt an:<\/p>\n<pre>Public Event ItemDoubleClick(varID As Variant)<\/pre>\n<p>Nun sorgen Sie noch daf&uuml;r, dass dieses Ereignis zum entsprechenden Zeitpunkt ausgel&ouml;st wird. Dies soll bei einem Doppelklick auf eines der Elemente geschehen. Es gibt zwar ein Ereignis, das beim Doppelklick auf das ListView-Steuerelement ausgel&ouml;st wird, aber dieses liefert keine Informationen &uuml;ber das Element, das angeklickt wurde &#8211; wenn der Benutzer &uuml;berhaupt auf ein Element geklickt hat und nicht in den leeren Bereich des Listenfeldes. Das Ereignis <b>DblClick <\/b>soll aber dennoch Ausl&ouml;ser f&uuml;r unser benutzerdefiniertes Ereignis sein. Wir m&uuml;ssen nur vorher festhalten, wo der zuletzt ausgef&uuml;hrte Mausklick landete. Dazu deklarieren Sie zun&auml;chst zwei Variablen:<\/p>\n<pre>Private sngX As Single\r\nPrivate sngY As Single<\/pre>\n<p>Dann nutzen wir das Ereignis <b>MouseDown<\/b>, um die Koordinaten des letzten Mausklicks in diesen beiden Variablen zu speichern:<\/p>\n<pre>Private Sub m_ListView_MouseDown(ByVal Button As Integer, ByVal Shift As Integer, _\r\n        ByVal x As stdole.OLE_XPOS_PIXELS, ByVal y As stdole.OLE_YPOS_PIXELS)\r\n    sngX = x\r\n    sngY = y\r\n    RaiseEvent MouseDown(Button, Shift, x, y)\r\nEnd Sub<\/pre>\n<p>Diese Werte wiederum lesen wir in der Ereignisprozedur aus, die durch den Doppelklick auf das ListView-Steuerelement ausgel&ouml;st wird (s. <span class=\"verweis-ohneumbruch\"><a href=\"#anker-58-anchor\">Listing 2<\/a><\/span>).<\/p>\n<p class=\"listingueberschrift\">Listing 2: Doppelklick auf das ListView-Steuerelement<\/p>\n<pre>Private Sub m_ListView_DblClick()\r\n    Dim varID As Variant\r\n    Dim objListitem As MSComctlLib.ListItem\r\n    Set objListitem = m_ListView.HitTest(sngX, sngY)\r\n    If Not objListitem Is Nothing Then\r\n        varID = Mid(objListitem.Key, 2)\r\n        RaiseEvent ItemDoubleClick(varID)\r\n    End If\r\n    RaiseEvent DblClick\r\nEnd Sub<\/pre>\n<p>Die Prozedur pr&uuml;ft mit der <b>HitTest<\/b>-Methode, ob sich unter den angegebenen Koordinaten ein Listenelement befindet. Falls ja, wird <b>objListItem <\/b>mit einem Verweis auf das entsprechende Element gef&uuml;llt, falls nicht, bleibt es leer. Dies pr&uuml;ft die folgende <b>If&#8230;Then<\/b>-Bedingung. Im Erfolgsfall schreibt die Prozedur den in der <b>Key<\/b>-Eigenschaft gespeicherten Wert des Prim&auml;rschl&uuml;sselfeldes f&uuml;r diesen Eintrag in die Variable <b>varID <\/b>und &uuml;bergibt diese an das benutzerdefinierte Ereignis <b>ItemDoubleClick<\/b>, das somit auch gleichzeitig ausgel&ouml;st wird. Im Formularmodul m&uuml;ssen Sie nun nur noch mit einer entsprechenden Implementierung auf dieses Ereignis reagieren &#8211; also etwa so:<\/p>\n<pre>Private Sub objListViewConf3_ItemDoubleClick(varID As Variant)\r\n    MsgBox varID\r\nEnd Sub<\/pre>\n<p><b>Kontrollk&auml;stchen speichern<\/b><\/p>\n<p>Kommen wir zum Speichern der Werte von Kontrollk&auml;stchen, wenn der Benutzer diese markiert oder leert. Voraussetzung f&uuml;r das &Uuml;bertragen der &auml;nderung in die zugrunde liegende Tabelle ist, dass die Eigenschaft <b>CheckboxUpdate <\/b>aktiviert ist. Au&szlig;erdem m&uuml;ssen daf&uuml;r die Eigenschaften <b>PrimaryKey <\/b>und <b>BaseTable <\/b>sowie <b>CheckboxField <\/b>angegeben sein &#8211; Letztere werden hier nicht explizit gepr&uuml;ft. Die Prozedur aus <span class=\"verweis-ohneumbruch\"><a href=\"#anker-59-anchor\">Listing 3<\/a><\/span> ermittelt zun&auml;chst den Prim&auml;rschl&uuml;ssel aus der <b>Key<\/b>-Eigenschaft des mit dem Parameter <b>Item <\/b>&uuml;bergebenen Listenelements. Hier kommt erstmals die Variable <b>bolPKIsString <\/b>zum Einsatz. Wenn diese den Wert <b>True <\/b>hat, bedeutet dies, dass der Prim&auml;rschl&uuml;ssel den Datentyp <b>Text <\/b>besitzt. In diesem Fall wirkt sich dies so aus, dass der Vergleichswert im Kriterium des SQL-Ausdrucks zum Aktualisieren des zugrunde liegenden Datensatzes in Hochkommata eingefasst werden muss. So wird dann aus <b>ALFKI <\/b>der Ausdruck <b>&#8220;ALFKI&#8220; <\/b>&#8211; und damit tritt im Falle eines Text-Prim&auml;rschl&uuml;ssels kein Fehler auf. Die <b>UPDATE<\/b>-Anweisung schlie&szlig;lich stellt das f&uuml;r das Kontrollk&auml;stchen angegebene Feld auf den mit der <b>Checked<\/b>-Eigenschaft ermittelten Wert ein.<\/p>\n<p class=\"listingueberschrift\">Listing 3: Speichern von &auml;nderungen der Werte von Kontrollk&auml;stchen<\/p>\n<pre>Private Sub m_ListView_ItemCheck(ByVal Item As MSComctlLib.ListItem)\r\n    RaiseEvent ItemCheck(Item)\r\n    If m_CheckboxUpdate Then\r\n        Dim db As DAO.Database\r\n        Dim varPrimarykey As Variant\r\n        varPrimarykey = Mid(Item.Key, 2)\r\n        If bolPKIsString Then\r\n            varPrimarykey = &quot;''&quot; &amp; varPrimarykey &amp; &quot;''&quot;\r\n        End If\r\n        Set db = CurrentDb\r\n        db.Execute &quot;UPDATE &quot; &amp; m_BaseTable &amp; &quot; SET &quot; &amp; m_CheckboxField &amp; &quot; = &quot; &amp; CInt(Item.Checked) _\r\n            &amp; &quot; WHERE &quot; &amp; m_PrimaryKey &amp; &quot; = &quot; &amp; varPrimarykey, dbFailOnError\r\n    End If\r\nEnd Sub<\/pre>\n<p><b>&auml;nderungen in die Tabelle schreiben<\/b><\/p>\n<p>Fehlt noch das Eintragen von &auml;nderungen am Text der ersten Spalte eines Eintrags (s. <span class=\"verweis-ohneumbruch\"><a href=\"#anker-60-anchor\">Listing 4<\/a><\/span>). Wenn die Eigenschaft <b>SaveLabelEdits <\/b>den Wert <b>True <\/b>aufweist, sollen &auml;nderungen am Text der ersten Spalte gespeichert werden. Dazu ist das Vorhandensein eines Wertes f&uuml;r die Eigenschaft <b>PrimaryKey <\/b>sowie <b>BaseTable <\/b>n&ouml;tig. Der Prim&auml;rschl&uuml;sselwert des zu &auml;ndernden Datensatzes wird aus der <b>Key<\/b>-Eigenschaft des Listenelements ermittelt. Wenn der Prim&auml;rschl&uuml;ssel aus einem Text besteht, wird dieser noch in Hochkommata eingefasst. Der Parameter <b>NewString <\/b>liefert den neuen Wert, den der Benutzer f&uuml;r das Listenelement angegeben hat. Auch das zu &auml;ndernde Feld kann ein Textfeld sein, was in der Eigenschaft <b>bolLabelIsString <\/b>festgehalten wurde. Auch hier werden gegebenenfalls Hochkommata hinzugef&uuml;gt. Sollte das Prim&auml;rschl&uuml;sselfeld dem zu &auml;ndernden Feld entsprechen, wird die &auml;nderung abgebrochen. Anderenfalls f&uuml;hrt eine <b>UPDATE<\/b>-Anweisung die &auml;nderung durch.<\/p>\n<p class=\"listingueberschrift\">Listing 4: &Uuml;bernahme von &auml;nderungen am Inhalt der ersten Spalte<\/p>\n<pre>Private Sub m_ListView_AfterLabelEdit(Cancel As Integer, NewString As String)\r\n    Dim db As DAO.Database\r\n    Dim varPrimarykey As Variant\r\n    Dim varValue As Variant\r\n    If m_SaveLabelEdits Then\r\n        If Len(m_PrimaryKey) = 0 Or Len(m_BaseTable) = 0 Then\r\n            MsgBox &quot;Speichern von &auml;nderungen nur nach Einstellung der Eigenschaft ''PrimaryKey'' m&ouml;glich&quot;\r\n            Exit Sub\r\n        Else\r\n            Set db = CurrentDb\r\n            varPrimarykey = Mid(m_ListView.SelectedItem.Key, 2)\r\n            If bolPKIsString Then\r\n                varPrimarykey = &quot;''&quot; &amp; varPrimarykey &amp; &quot;''&quot;\r\n            End If\r\n            varValue = NewString\r\n            If bolLabelIsString Then\r\n                varValue = &quot;''&quot; &amp; Replace(varValue, &quot;''&quot;, &quot;''''&quot;) &amp; &quot;''&quot;\r\n            End If\r\n            If m_PrimaryKey = strLabelfield Then\r\n                Exit Sub\r\n            End If\r\n            db.Execute &quot;UPDATE &quot; &amp; m_BaseTable &amp; &quot; SET &quot; &amp; strLabelfield &amp; &quot; = &quot; &amp; varValue _\r\n            &amp; &quot; WHERE &quot; &amp; m_PrimaryKey &amp; &quot; = &quot; &amp; varPrimarykey, dbFailOnError\r\n        End If\r\n    End If\r\n    If m_CheckboxInOwnColumn Then\r\n        m_ListView.SelectedItem.ListSubItems(1).Text = NewString\r\n    End If\r\n    RaiseEvent AfterLabelEdit(Cancel, NewString)\r\nEnd Sub<\/pre>\n<p>Wenn das ListView-Steuerelement das Kontrollk&auml;stchen in einer eigenen Spalte anzeigt, wird der Inhalt dieser Spalte zur &auml;nderung angeboten. Daher wurde auch die erste Spalte mit dem anzuzeigenden Wert gef&uuml;llt, allerdings so weit verkleinert, dass nur das Kontrollk&auml;stchen sichtbar ist. Nach einer &auml;nderung an diesem Feld wird diese nat&uuml;rlich nicht direkt sichtbar, weil ja der Inhalt der hinter dem Kontrollk&auml;stchen verborgenen Spalte ge&auml;ndert wurde. Also sorgt eine zus&auml;tzliche Anweisung daf&uuml;r, dass dieser Wert auch in die zweite Spalte &uuml;bertragen wird.<\/p>\n<p><b>Zusammenfassung und Ausblick<\/b><\/p>\n<p>Allein das f&uuml;r viele Konfigurationen m&ouml;gliche F&uuml;llen des Listenfeldes mit den Daten einer Datenherkunft wie einer Tabelle oder Abfrage spart eine Menge Code &#8211; und Zeit, wenn Sie nicht &ouml;fter mal ein ListView mit Daten f&uuml;llen.<\/p>\n<p>Die M&ouml;glichkeit, Kontrollk&auml;stchen direkt an ein Feld der Datenherkunft zu binden und &auml;nderungen daran in die zugrunde liegende Tabelle zu &uuml;bertragen sowie das Speichern von &auml;nderungen am Inhalt der ersten Spalte des ListView-Steuerelements sind weitere wertvolle Features. Alles in allem kostet Sie das nunmehr nur noch wenige Zeilen Code.<\/p>\n<p>Es sind noch mehr Erweiterungen denkbar. So k&ouml;nnen Sie beispielsweise daf&uuml;r sorgen, dass der Inhalt des Listenfeldes in Abh&auml;ngigkeit von einem Steuerelement des Formulars, in dem es sich befindet, gefiltert wird &#8211; also etwa so wie bei der Synchronisierung von Haupt- und Unterformularen mit verkn&uuml;pften Daten. Und auch ein weiteres Feature des ListView-Steuerelements, die Anzeige von Icons, l&auml;sst sich mit einigen Zeilen Code hinzuf&uuml;gen. Wir entwickeln den ListView-Konfigurator weiter &#8211; und halten Sie auf dem Laufenden!<\/p>\n<h3>Downloads zu diesem Beitrag<\/h3>\n<p>Enthaltene Beispieldateien:<\/p>\n<p>ListViewKonfigurator.mdb<\/p>\n<p><a href=\"..\/fileadmin\/beispiele\/{E34FE84D-59B5-4412-950D-C5E5A772DD4D}\/aiu_825.zip\">Download<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Das ListView-Steuerelement bietet einige interessante Features, die Sie in der Datenblattansicht und im Listenfeld nicht finden. Allein das Best&uuml;cken mit Daten ist ein wenig m&uuml;hselig &#8211; das ListView-Steuerelement kann nicht wie das Listenfeld oder ein Unterformular in der Datenblattansicht einfach an eine Datenherkunft gebunden werden. Diese und einige andere Schw&auml;chen behebt die vorliegende L&ouml;sung &#8211; der ListView-Konfigurator.<\/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":[66022012,662012,44000023],"tags":[],"class_list":["post-55000825","post","type-post","status-publish","format-standard","hentry","category-66022012","category-662012","category-Mit_Formularen_arbeiten"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v20.9 (Yoast SEO v27.3) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>ListView-Konfigurator - Access im Unternehmen<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/access-im-unternehmen.de\/ListViewKonfigurator\/\" \/>\n<meta property=\"og:locale\" content=\"de_DE\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"ListView-Konfigurator\" \/>\n<meta property=\"og:description\" content=\"Das ListView-Steuerelement bietet einige interessante Features, die Sie in der Datenblattansicht und im Listenfeld nicht finden. Allein das Best&uuml;cken mit Daten ist ein wenig m&uuml;hselig - das ListView-Steuerelement kann nicht wie das Listenfeld oder ein Unterformular in der Datenblattansicht einfach an eine Datenherkunft gebunden werden. Diese und einige andere Schw&auml;chen behebt die vorliegende L&ouml;sung - der ListView-Konfigurator.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/access-im-unternehmen.de\/ListViewKonfigurator\/\" \/>\n<meta property=\"og:site_name\" content=\"Access im Unternehmen\" \/>\n<meta property=\"article:published_time\" content=\"2020-05-22T21:53:26+00:00\" \/>\n<meta property=\"og:image\" content=\"http:\/\/vg05.met.vgwort.de\/na\/c9598b88fa9f4e22a06a07675efb7b4a\" \/>\n<meta name=\"author\" content=\"Andr\u00e9 Minhorst\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Verfasst von\" \/>\n\t<meta name=\"twitter:data1\" content=\"Andr\u00e9 Minhorst\" \/>\n\t<meta name=\"twitter:label2\" content=\"Gesch\u00e4tzte Lesezeit\" \/>\n\t<meta name=\"twitter:data2\" content=\"29\u00a0Minuten\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/ListViewKonfigurator\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/ListViewKonfigurator\\\/\"},\"author\":{\"name\":\"Andr\u00e9 Minhorst\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/person\\\/13395c4bcd7d7963efe33be9c584d93f\"},\"headline\":\"ListView-Konfigurator\",\"datePublished\":\"2020-05-22T21:53:26+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/ListViewKonfigurator\\\/\"},\"wordCount\":4691,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/ListViewKonfigurator\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg05.met.vgwort.de\\\/na\\\/c9598b88fa9f4e22a06a07675efb7b4a\",\"articleSection\":[\"2\\\/2012\",\"2012\",\"Mit Formularen arbeiten\"],\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/ListViewKonfigurator\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/ListViewKonfigurator\\\/\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/ListViewKonfigurator\\\/\",\"name\":\"ListView-Konfigurator - Access im Unternehmen\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/ListViewKonfigurator\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/ListViewKonfigurator\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg05.met.vgwort.de\\\/na\\\/c9598b88fa9f4e22a06a07675efb7b4a\",\"datePublished\":\"2020-05-22T21:53:26+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/ListViewKonfigurator\\\/#breadcrumb\"},\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/ListViewKonfigurator\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/ListViewKonfigurator\\\/#primaryimage\",\"url\":\"http:\\\/\\\/vg05.met.vgwort.de\\\/na\\\/c9598b88fa9f4e22a06a07675efb7b4a\",\"contentUrl\":\"http:\\\/\\\/vg05.met.vgwort.de\\\/na\\\/c9598b88fa9f4e22a06a07675efb7b4a\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/ListViewKonfigurator\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/access-im-unternehmen.de\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"ListView-Konfigurator\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#website\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/\",\"name\":\"Access im Unternehmen\",\"description\":\"Das Magazin f\u00fcr Datenbankentwickler auf Basis von Microsoft Access\",\"publisher\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/access-im-unternehmen.de\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"de\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#organization\",\"name\":\"Andr\u00e9 Minhorst Verlag\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/wp-content\\\/uploads\\\/2019\\\/09\\\/aiu_wp.png\",\"contentUrl\":\"https:\\\/\\\/access-im-unternehmen.de\\\/wp-content\\\/uploads\\\/2019\\\/09\\\/aiu_wp.png\",\"width\":370,\"height\":111,\"caption\":\"Andr\u00e9 Minhorst Verlag\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/logo\\\/image\\\/\"}},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/person\\\/13395c4bcd7d7963efe33be9c584d93f\",\"name\":\"Andr\u00e9 Minhorst\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g\",\"caption\":\"Andr\u00e9 Minhorst\"}}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"ListView-Konfigurator - Access im Unternehmen","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/access-im-unternehmen.de\/ListViewKonfigurator\/","og_locale":"de_DE","og_type":"article","og_title":"ListView-Konfigurator","og_description":"Das ListView-Steuerelement bietet einige interessante Features, die Sie in der Datenblattansicht und im Listenfeld nicht finden. Allein das Best&uuml;cken mit Daten ist ein wenig m&uuml;hselig - das ListView-Steuerelement kann nicht wie das Listenfeld oder ein Unterformular in der Datenblattansicht einfach an eine Datenherkunft gebunden werden. Diese und einige andere Schw&auml;chen behebt die vorliegende L&ouml;sung - der ListView-Konfigurator.","og_url":"https:\/\/access-im-unternehmen.de\/ListViewKonfigurator\/","og_site_name":"Access im Unternehmen","article_published_time":"2020-05-22T21:53:26+00:00","og_image":[{"url":"http:\/\/vg05.met.vgwort.de\/na\/c9598b88fa9f4e22a06a07675efb7b4a","type":"","width":"","height":""}],"author":"Andr\u00e9 Minhorst","twitter_card":"summary_large_image","twitter_misc":{"Verfasst von":"Andr\u00e9 Minhorst","Gesch\u00e4tzte Lesezeit":"29\u00a0Minuten"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/access-im-unternehmen.de\/ListViewKonfigurator\/#article","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/ListViewKonfigurator\/"},"author":{"name":"Andr\u00e9 Minhorst","@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/person\/13395c4bcd7d7963efe33be9c584d93f"},"headline":"ListView-Konfigurator","datePublished":"2020-05-22T21:53:26+00:00","mainEntityOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/ListViewKonfigurator\/"},"wordCount":4691,"commentCount":0,"publisher":{"@id":"https:\/\/access-im-unternehmen.de\/#organization"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/ListViewKonfigurator\/#primaryimage"},"thumbnailUrl":"http:\/\/vg05.met.vgwort.de\/na\/c9598b88fa9f4e22a06a07675efb7b4a","articleSection":["2\/2012","2012","Mit Formularen arbeiten"],"inLanguage":"de","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/access-im-unternehmen.de\/ListViewKonfigurator\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/access-im-unternehmen.de\/ListViewKonfigurator\/","url":"https:\/\/access-im-unternehmen.de\/ListViewKonfigurator\/","name":"ListView-Konfigurator - Access im Unternehmen","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/#website"},"primaryImageOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/ListViewKonfigurator\/#primaryimage"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/ListViewKonfigurator\/#primaryimage"},"thumbnailUrl":"http:\/\/vg05.met.vgwort.de\/na\/c9598b88fa9f4e22a06a07675efb7b4a","datePublished":"2020-05-22T21:53:26+00:00","breadcrumb":{"@id":"https:\/\/access-im-unternehmen.de\/ListViewKonfigurator\/#breadcrumb"},"inLanguage":"de","potentialAction":[{"@type":"ReadAction","target":["https:\/\/access-im-unternehmen.de\/ListViewKonfigurator\/"]}]},{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/access-im-unternehmen.de\/ListViewKonfigurator\/#primaryimage","url":"http:\/\/vg05.met.vgwort.de\/na\/c9598b88fa9f4e22a06a07675efb7b4a","contentUrl":"http:\/\/vg05.met.vgwort.de\/na\/c9598b88fa9f4e22a06a07675efb7b4a"},{"@type":"BreadcrumbList","@id":"https:\/\/access-im-unternehmen.de\/ListViewKonfigurator\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/access-im-unternehmen.de\/"},{"@type":"ListItem","position":2,"name":"ListView-Konfigurator"}]},{"@type":"WebSite","@id":"https:\/\/access-im-unternehmen.de\/#website","url":"https:\/\/access-im-unternehmen.de\/","name":"Access im Unternehmen","description":"Das Magazin f\u00fcr Datenbankentwickler auf Basis von Microsoft Access","publisher":{"@id":"https:\/\/access-im-unternehmen.de\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/access-im-unternehmen.de\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"de"},{"@type":"Organization","@id":"https:\/\/access-im-unternehmen.de\/#organization","name":"Andr\u00e9 Minhorst Verlag","url":"https:\/\/access-im-unternehmen.de\/","logo":{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/logo\/image\/","url":"https:\/\/access-im-unternehmen.de\/wp-content\/uploads\/2019\/09\/aiu_wp.png","contentUrl":"https:\/\/access-im-unternehmen.de\/wp-content\/uploads\/2019\/09\/aiu_wp.png","width":370,"height":111,"caption":"Andr\u00e9 Minhorst Verlag"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/logo\/image\/"}},{"@type":"Person","@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/person\/13395c4bcd7d7963efe33be9c584d93f","name":"Andr\u00e9 Minhorst","image":{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/secure.gravatar.com\/avatar\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g","caption":"Andr\u00e9 Minhorst"}}]}},"_links":{"self":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts\/55000825","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/comments?post=55000825"}],"version-history":[{"count":0,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts\/55000825\/revisions"}],"wp:attachment":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/media?parent=55000825"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/categories?post=55000825"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/tags?post=55000825"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}