Steuerelemente aktivieren und deaktivieren

Lies diesen Artikel und viele weitere mit einem kostenlosen, einwöchigen Testzugang.

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.

pic001.png

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.

pic002.png

Bild 2: Das Kombinationsfeld aktiviert oder deaktiviert die weiteren Steuerelemente.

Steuerelemente beim Anzeigen des Datensatzes aktivieren oder deaktivieren

Einen kleinen Schönheitsfehler hat die Lösung noch: Beim Öffnen des Formulars oder beim Datensatzwechseln werden die Textfelder nicht entsprechend der ausgewählten Kundenart aktiviert beziehungsweise deaktiviert. Also fügen Sie eine weitere Ereignisprozedur hinzu, die beim Anzeigen eines jeden Datensatzes ausgelöst wird. Das Ereignis heißt Beim Anzeigen und die Ereignisprozedur müsste eigentlich genau den gleichen Inhalt haben wie die durch das Kombinationsfeld ausgelöste:

Private Sub Form_Current()
    Me!txtFirma.Enabled = Nz(Me!cboKundenartID) = 1
    Me!txtVorname.Enabled = Nz(Me!cboKundenartID) = 2
    Me!txtNachname.Enabled = Nz(Me!cboKundenartID) = 2
End Sub

Nun fragen alle drei Anweisungen den gleichen Wert im Formular ab und führen auch noch die Nz-Funktion mit diesem Wert als Parameter aus. Das sollte nur einmal geschehen, also ermitteln wir den Wert von Nz(Me!cboKundenartID) zu Beginn und schreiben das Ergebnis in eine Variable. Diese wird später als Vergleichswert hinzugezogen:

Dim intKundenart As Integer
intKundenart = Nz(Me!cboKundenartID)
Me!txtFirma.Enabled = intKundenart = 1
Me!txtVorname.Enabled = intKundenart = 2
Me!txtNachname.Enabled = intKundenart = 2

Wenn zwei Prozeduren genau die gleichen Anweisungen enthalten, ist es jedoch Zeit für ein kleines Refactoring. Wir schreiben die drei Anweisungen in eine eigene Prozedur und rufen diese von den ursprünglichen Prozeduren auf:

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

Testzugang

eine Woche kostenlosen Zugriff auf diesen und mehr als 1.000 weitere Artikel

diesen und alle anderen Artikel mit dem Jahresabo

Schreibe einen Kommentar