Dynamische Listenfeldspalten

Listenfelder sind tolle Steuerelemente. Mit ihnen können Sie Daten schnell zur Auswahl bereitstellen. Allerdings haben sie einen Makel: Sie erlauben keine automatische änderung der Spaltenbreite zur Laufzeit – zumindest nicht mit Bordmitteln. Dieser Beitrag zeigt, wie Sie in Zusammenhang mit den Verankern-Eigenschaften von Formularen zumindest ein klein wenig Flexibilität aus den ansonsten recht statischen Listenfelder herausholen.

Beispiel Kundenliste

Als Beispiel für diesen Beitrag verwenden wir die Tabelle tblKunden der Suedsturm-Datenbank. Die Daten dieser Tabelle sollen in einem Listenfeld namens lstKunden angezeigt werden. Daher stellen wir die Datensatzherkunft dieses Steuerelements auf eine Abfrage ein, die wie in Bild 1 aussieht.

Datensatzherkunft des Listenfeldes lstKunden

Bild 1: Datensatzherkunft des Listenfeldes lstKunden

Diese Abfrage liefert die Felder Kunde-ID, KundenCode, Firma, Vorname und Nachname der Tabelle tblKunden sortiert nach dem Inhalt des Feldes Firma. Die Eigenschaften Datensatzmarkierer, Navigationsschaltflächen, Trennlinien und Bildlaufleisten dieses Formulars stellen wir auf Nein ein. Das Formular sieht in der Entwurfsansicht wie in Bild 2 aus. Es enthält lediglich das Listenfeld lstKunden als Steuerelement.

Das Formular frmKunden mit dem Listenfeld zur Anzeige der Kunden in der Entwurfsansicht

Bild 2: Das Formular frmKunden mit dem Listenfeld zur Anzeige der Kunden in der Entwurfsansicht

Das Listenfeld soll alle fünf Felder der als Datensatzherkunft verwendeten Abfrage nutzen, also legen wir für die Eigenschaft Spaltenanzahl den Wert 5 fest.

Die Eigenschaft Spaltenbreiten stellen wir auf den Wert 0cm;2cm;5cm;2cm;4cm ein. Damit legen wir fest, dass das erste Feld der Datensatzherkunft, also KundeID, nicht im Listenfeld angezeigt wird. Die übrigen Felder erscheinen in der jeweils angegebenen Breite, wie Bild 3 zeigt.

Die Formularansicht entspricht noch nicht unseren Wünschen.

Bild 3: Die Formularansicht entspricht noch nicht unseren Wünschen.

Dies ist allerdings noch längst nicht die Ansicht, die wir uns wünschen. In der Abbildung haben wir die Größe des Formulars bereits geändert, was sich aber aktuell noch nicht auf die Größe des Listenfeldes auswirkt. Dieses sollte sich eigentlich analog zum Rest des Formulars vergrößern. Damit dies im nächsten Anlauf gelingt, stellen wir die Eigenschaften Horizontaler Anker und Vertikaler Anker auf den Wert Beide ein. Außerdem korrigieren Sie den dabei automatisch geänderten Wert dieser beiden Eigenschaften für das Bezeichnungsfeld des Listenfeldes wieder auf Links und Oben.

Nun passt es: Das Listenfeld wird automatisch vergrößert, wenn man das Formular anpasst (s. Bild 4). Leider verändert sich innerhalb des Listenfeldes aber nur die Breite der letzten Spalte. Schön wäre es gewesen, wenn sich die Spalte mit der Firma automatisch entsprechend der Breite des Formulars angepasst hätte, damit ihre Inhalte komplett sichtbar sind.

Nun wird zumindest das Listenfeld mit dem Formular vergrößert.

Bild 4: Nun wird zumindest das Listenfeld mit dem Formular vergrößert.

Flexible Spalte – aber nur einmal

Damit kommen wir zum ersten notwendigen Schritt, wenn Sie dafür sorgen wollen, dass genau eine Spalte immer mit dem Formular vergrößert oder verkleinert wird. In diesem stellen wir die Eigenschaft Spaltenbreiten auf einen neuen Wert ein, der wie folgt lautet (s. Bild 5):

Einstellen der Spaltenbreiten für unseren Anwendungsfall

Bild 5: Einstellen der Spaltenbreiten für unseren Anwendungsfall

0cm;2cm;;2cm;4cm

Was ist wichtig an dieser Stelle Dass Sie für die Spalte, deren Breite flexibel eingestellt werden soll, keinen numerischen Wert angeben, sondern den Platz zwischen den entsprechenden Semikola (;) einfach freilassen.

Nun erhalten Sie die gewünschte Ansicht (s. Bild 6), aber nur unter einer Voraussetzung: Sie hatten das Formular zuvor geöffnet und bereits einmal auf eine gewisse Breite vergrößert und sind dann wieder zur Entwurfsansicht gewechselt.

Die Spalte mit der Firma wird auf die enthaltenen Daten optimiert.

Bild 6: Die Spalte mit der Firma wird auf die enthaltenen Daten optimiert.

Wenn Sie es dann erneut in der Formularansicht öffnen, wird die Spalte Firma so breit angezeigt, dass es genau den Rest der Breite des Listenfeldes minus der Spaltenbreite der übrigen Felder einnimmt.

Wenn Sie das Formular nun komplett schließen und wieder öffnen, erhalten Sie nicht nur den alten Zustand – es ist noch übler: Das Feld Firma erhält nun noch weniger Platz, nämlich wiederum die Gesamtbreite des Formulars minus der für die übrigen Spalten fix eingestellten Breiten (s. Bild 7).

Beim erneuten öffnen bekommt die Spalte Firma nun leider noch weniger Platz ab.

Bild 7: Beim erneuten öffnen bekommt die Spalte Firma nun leider noch weniger Platz ab.

Dauerhafte flexible Spalte

Nun kommt Schritt zwei der notwendigen änderungen für eine flexible Spaltenbreite im Listenfeld: Wir fügen dem Formular eine Ereignisprozedur für das Ereignis Bei Größenänderung hinzu, welche die folgende Anweisung ausführt:

Private Sub Form_Resize()
     Me!lstKunden.ColumnWidths = Me!lstKunden.ColumnWidths
End Sub

Das Ergebnis überzeugt: Von nun an ändert sich die Breite der Spalte Firma immer, sobald wir am rechten Rand des Formulars ziehen und so die Breite des Listenfeldes ändern (s. Bild 8).

Mit einer kleinen Ereignisprozedur passt sich die Spaltenbreite des Feldes Firma immer der Listenfeldbreite minus den übrigen fixen Spaltenbreiten an.

Bild 8: Mit einer kleinen Ereignisprozedur passt sich die Spaltenbreite des Feldes Firma immer der Listenfeldbreite minus den übrigen fixen Spaltenbreiten an.

Flexible Spalte selbst festlegen

Wir gehen noch einen Schritt weiter: Während bisher die flexible Spalte fest durch den Eintrag in die Eigenschaft Spaltenbreiten vorgegeben war, wollen wir diesen nun durch den Benutzer anpassen lassen. Dazu soll dieser einfach die entsprechende Spalte anklicken können und dann die Breite dieser Spalte durch Anpassen der Formularbreite vergrößern oder verkleinern. Um zu überprüfen, welche Spalte aktuell die flexible Spaltenbreite aufweist, zeigen wir ihren Namen in einem Textfeld namens txtDynamischeSpalte an (die neue Version des Formulars samt Textfeld finden Sie in Bild 9).

Neues Formular, neues Textfeld zur Anzeige der aktuell veränderbaren Spalte

Bild 9: Neues Formular, neues Textfeld zur Anzeige der aktuell veränderbaren Spalte

Was nun folgt, ist das Ergebnis einiger Experimente und der Verwendung des Maustaste auf-Ereignisses. Vorab die Idee, die hinter dieser Prozedur steckt: Aktuell ist genau eine Spalte durch änderung der Breite des Formulars anpassbar.

Dies geschieht erstens dadurch, dass Veränderungen der Formularbreite durch die Einstellung des Wertes Beide für das Steuerelement lstKunden die Listenfeldbreite verändert. Die oben vorgestellte Ereignisprozedur, die durch das Ereignis Bei Größenänderung ausgelöst wird, sorgt dann dafür, dass die Eigenschaft Spaltenbreiten des Listenfeldes bei jeder änderung der Formularbreite aktualisiert wird. So wird immer die Spalte, für die keine feste Breite festgelegt wurde, so angepasst, dass sie der Breite des Listenfeldes minus der Breite der übrigen Spalten entspricht.

Ende des frei verfügbaren Teil. Wenn Du mehr lesen möchtest, hole Dir ...

den kompletten Artikel im PDF-Format mit Beispieldatenbank

diesen und alle anderen Artikel mit dem Jahresabo

Schreibe einen Kommentar