Wenn eine Funktion oder ein Steuerelemente temporär nicht zur Verfügung steht, haben Sie zwei Möglichkeiten: Entweder Sie weisen den Benutzer per Meldungsfenster auf diesen Umstand hin, wenn er versucht, das Steuerelemente dennoch zu benutzen. Das ist schlecht, weil dies den Benutzer einen unnötigen Klick kostet. Oder Sie deaktivieren das Steuerelement direkt. Das dies manchmal gar nicht so einfach ist und wie Sie es dennoch schaffen, zeigt dieser Beitrag.
Gründe, Steuerelemente zu deaktivieren, gibt es viele:
- Eine Speichern-Schaltfläche oder eine Abbrechen-Schaltfläche soll nur aktiviert sein, wenn es überhaupt änderungen gibt, die gespeichert oder verworfen werden könnten.
- Eine OK-Schaltfläche soll nur aktiviert sein, wenn der Benutzer alle notwendigen Daten eingegeben hat.
- Eine Suchen-Schaltfläche wird nur aktiviert, wenn der Benutzer einen Suchbegriff eingegeben hat.
- Ein Textfeld steht nicht zur Verfügung, weil die entsprechende Option nicht ausgewählt ist.
Schauen wir uns also erstmal an, wie wir Steuerelemente in Abhängigkeit bestimmter Bedingungen aktiviern und deaktivieren können.
Steuerelemente in Abhängigkeit anderer Steuerelemente aktivieren oder deaktivieren
Das Formular aus Bild 1 besteht aus einem Kombinationsfeld, das die Kundenart festlegt (Firma oder Privatperson) und davon abhängig die Textfelder txtFirma, txtVorname und txtNachname aktivieren beziehungsweise deaktivieren soll. Wenn keine Kundenart ausgewählt ist, sollen dementsprechend alle Steuerelemente deaktiviert sein.
Bild 1: Beispielformular der Datenbank
Schauen wir uns erst an, was geschehen soll, wenn der Benutzer eine Kundenart auswählt. Dies löst das Ereignis Nach Aktualisierung des Kombinationsfelds aus. Die entsprechende Ereignisprozedur sieht wie folgt aus:
Private Sub cboKundenartID_AfterUpdate() Select Case Me!cboKundenartID Case 1 Me!txtFirma.Enabled = True Me!txtVorname.Enabled = False Me!txtNachname.Enabled = False Case 2 Me!txtFirma.Enabled = False Me!txtVorname.Enabled = True Me!txtNachname.Enabled = True Case Else Me!txtFirma.Enabled = False Me!txtVorname.Enabled = False Me!txtNachname.Enabled = False End Select End Sub
Sie fragt den Wert von cboKundenartID ab und stellt die Enabled-Eigenschaft der folgenden Textfelder entsprechend ein.
Das Einstellen von Eigenschaften wie Enabled, Locked, Visible et cetera, die abhängig von einer oder mehrerer Bedingungen auf True oder False eingestellt werden können, ist grundsätzlich auf zwei Arten möglich: Auf die die schreibintensive Art wie oben oder auf eine etwas pfiffigere Weise wie in der folgenden Variante:
Private Sub cboKundenartID_AfterUpdate() Me!txtFirma.Enabled = Nz(Me!cboKundenartID) = 1 Me!txtVorname.Enabled = Nz(Me!cboKundenartID) = 2 Me!txtNachname.Enabled = Nz(Me!cboKundenartID) = 2 End Sub
Genau wie oben soll das Feld txtFirma nur aktiviert sein, wenn das Kombinationsfeld cboKundenartID den Wert 1 enthält. Beim Wert 2 sollen nur die beiden Felder txtVorname und txtNachname aktiviert sein.
Die zweite Variante löst dies etwas eleganter und mit wesentlich weniger Codezeilen. Die erste Zeile sorgt beispielsweise dafür, dass die Eigenschaft Enabled des Textfeldes txtFirma nur auf True eingestellt wird, wenn cboKundenartID den Wert 1 hat (sollte cboKundenartID den Wert Null aufweisen, was darauf hindeutet, dass gar kein Eintrag ausgewählt ist, liefert Nz(Me!cboKundenartID) ersatzweise den Wert 0).
Beide Varianten liefern das Ergebnis aus Bild 2.
Bild 2: Das Kombinationsfeld aktiviert oder deaktiviert die weiteren Steuerelemente.