Wenn Sie ein Abonnement des Magazins 'Access im Unternehmen' besitzen, können Sie sich anmelden und den kompletten Artikel lesen.
Anderenfalls können Sie das Abonnement hier im Shop erwerben.
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.
Bild 1: Datensatzherkunft des Listenfeldes lstKunden
Diese Abfrage liefert die Felder KundeID, 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.
Bild 2: Das Formular frmKunden mit dem Listenfeld zur Anzeige der Kunden in der EntwurfsansichtDas 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.
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.
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):
Bild 5: Einstellen der Spaltenbreiten für unseren Anwendungsfall0cm;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.
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).
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).
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).
Bild 9: Neues Formular, neues Textfeld zur Anzeige der aktuell veränderbaren SpalteWas 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.
Nun wollen wir dafür sorgen, dass der Benutzer durch einen einfachen Mausklick auf eine der Spalten die angeklickte Spalte zur flexibel einstellbaren Spalte machen kann. Das heißt: Zu Beginn ist beispielsweise die Spalte Firma flexibel einstellbar. Dann klickt der Benutzer auf die Spalte Vorname und ändert dann die Formularbreite. Nun ändert sich nicht mehr automatisch die Breite der Spalte Firma, sondern die der Spalte Vorname! Dazu sind einige Verrenkungen nötig, aber wenn man länger mit Access arbeitet, weiß man, dass man fast alles erreichen kann, wenn man nur ein wenig Zeit und Hirnschmalz investiert.
Der Plan sieht so aus: Der Benutzer klickt auf die Spalte, die er zur flexibeln Spalte machen möchte. Dadurch löst er das Ereignis Bei Maustaste auf aus. Dieses Ereignis liefert mit seinen Parametern beispielsweise den Wert der X-Koordinate der Position, die der Benutzer angeklickt hat:
Private Sub lstKunden_MouseUp(Button As Integer, Shift As Integer, X As Single, Y As Single)
Damit wollen wir nun alle Spalten durchlaufen und deren Start-X-Koordinate und End-X-Koordinate ermitteln. Wenn wir eine Spalte finden, für die der Wert des Parameters X der angeklickten Position zwischen Start- und Endkoordinate der Spalte liegt, haben wir bereits die angeklickte Spalte entdeckt.
Dies war die Leseprobe dieses Artikels.
Melden Sie sich an, um auf den vollständigen Artikel zuzugreifen.