Komfortable Dropdown-Listenfelder

Listenfelder manuell füllen

Zunächst einmal wird das Listenfeld manuell gefüllt. Am einfachsten geht das mit Hilfe einer Funktion, die diese Aufgabe übernimmt (Listing 1). Wenn Sie ihr neben der SQL-Anweisung, die die Daten liefert, auch das zu füllende Dropdown- Listenelement sowie den Standardwert für das Listenelement übergeben, können Sie die Funktion für beliebige Formulare verwenden. Wichtig ist dann allerdings, dass Sie darauf achten, die SQL-Anweisung so zu formulieren, dass das erste zurückgegebene Feld die ID des Datensatzes ist. Standardmäßig wird dieses Feld nicht angezeigt, da seine Spaltenbreite auf 0 gesetzt wird.

Sub Listefuellen(objLFeld As ComboBox, strSQL As String, Optional lngWert = 0)
Dim objRS As ADODB.Recordset
Dim strTemp As String
Dim lngI As Long
Set objRS = New ADODB.Recordset

objRS.Open strSQL, Application.CurrentProject.Connection, adOpenStatic
objRS.MoveFirst
'Listenfeld leeren
Do While objLFeld.ListCount > 0
objLFeld.RemoveItem objLFeld.ListCount - 1
Loop
Do While Not (objRS.EOF)
'Listenfeld füllen
strTemp = ""
For lngI = 0 To objRS.Fields.Count - 1
strTemp = strTemp & objRS.Fields(lngI) & ";"
Next lngI
'letztes Semikolon abschneiden
strTemp = Mid(strTemp, 1, Len(strTemp) - 1)
'Eintrag hinzufügen
objLFeld.AddItem strTemp
objRS.MoveNext
Loop
'Zusätzlichen Datensatz anhängen
objLFeld.AddItem "0;[neuer Eintrag ...]"
'Formatierungen
objLFeld.BoundColumn = 1
objLFeld.ColumnCount = objRS.Fields.Count
If objLFeld.ColumnWidths = "" Then
objLFeld.ColumnWidths = "0;3cm"
End If
objLFeld.Value = lngWert
objRS.Close
Set objRS = Nothing
End Sub

Sie können allerdings die Spaltenbreiten individuell an Ihre Bedürfnisse anpassen, indem Sie die Eigenschaft Spaltenbreiten des Steuerelements setzen. Die Prozedur ersetzt diese Einstellung nicht, sondern legt nur Spaltenbreiten von 0;3cm fest, wenn die Eigenschaft nicht gesetzt wurde.

Die Prozedur Listefuellen führt zunächst die angegebene SQL-Anweisung aus und löscht dann alle vorhandenen Einträge im Listenfeld. Danach durchläuft sie das Ergebnis der Abfrage. Für jeden Datensatz erzeugt sie dann einen Eintrag, in dem alle Feldwerte nacheinander angegeben und durch Semikolons getrennt werden. Die Semikolons sorgen dafür, dass jeder Feldwert in einer eigenen Spalte innerhalb des Dropdown-Listenfeldes dargestellt wird.

Wenn auf diese Weise alle Datensätze abgearbeitet wurden, wird ein zusätzlicher Eintrag mit der ID 0 und dem Text "[neuer Eintrag ...]" eingefügt. Anschließend erfolgt die Formatierung der Liste. Mit der Eigenschaft BoundColumn wird die Spalte festgelegt, deren Wert als Wert des Kombinationslistenfeldes verwendet wird. Anschließend wird die Spaltenanzahl auf die Anzahl Felder in der Datenbankgruppe festgelegt, die als Ergebnis der SQL-Anweisung geliefert wurde. Danach wird die Feldbreite festgelegt, falls die Eigenschaft ColumnWidths eine leere Zeichenfolge als Wert hat. Ganz zum Schluss wird noch der übermittelte Parameter lngWert als Wert für das Listenfeld ausgewählt, um den gewünschten Listeneintrag auszuwählen.

Damit das Listenfeld jedoch gefüllt wird, müssen Sie die Funktion noch aufrufen. Außerdem benötigen Sie neben dem ungebundenen Kombinationslistenfeld ein gebundenes Textfeld, das den aktuellen Wert des Feldes Gruppe anzeigt. Damit ist es dann ganz einfach möglich, den korrekten Wert im Listenfeld anzeigen zu lassen. Das Textfeld (im Beispiel heißt es Gruppe) können Sie mit Hilfe der Sichtbar-Eigenschaft des Steuerelements ausblenden. Die Prozedur Listefuellen rufen Sie dann beim Öffnen des Formulars auf, indem Sie eine Ereignisprozedur für das Open-Ereignis erstellen (Listing 2).

Listing 2: Die Prozedur beim Laden des Formulars ausführen
Private Sub Form_Open(Cancel As Integer)
Listefuellen Me.cmbGruppe, _
"SELECT ID, Gruppe FROM Gruppen ORDER BY Gruppe ASC", _
Me.Gruppe.Value
End Sub

Außerdem müssen Sie nun noch dafür sorgen, dass beim Auswählen eines neuen Eintrags der Wert des Listenfeldes in das Textfeld Gruppe geschrieben und umgekehrt beim Wechseln des Datensatzes das Kombinationslistenfeld aktualisiert wird. Dazu erstellen Sie Ereignisprozeduren für das Change-Ereignis des Kombinationslistenfeldes und das Current-Ereignis des Formulars (Listing 3).

Private Sub cmbGruppe_Change()
Me.Gruppe.Value = Me.cmbGruppe.Value
End Sub
Private Sub Form_Current()
If Not (IsNull(Me.Gruppe.Value)) Then
Me.cmbGruppe.Value = Me.Gruppe.Value
Else
Me.cmbGruppe.Value = 0
End If
End Sub