Es gibt immer wieder Situationen, in denen man Controls ansprechen möchte, von denen man lediglich ein bestimmtes Attribut kennt.
Dies ist noch relativ einfach, wenn man beispielsweise den Namen kennt. Will man beispielsweise allen Textboxen deren Namen beispielsweise Textbox1, Textbox2 … lautet, so kann man dies mittels
Controls dynamisch ansprechen
Erläuterungen:
- Die Schleife
For i As Integer = 1 To 10
wiederholt sich zehn Mal, miti
von 1 bis 10. - In jedem Durchgang der Schleife wird versucht, ein Steuerelement (Control) auf der Form zu finden, dessen Name der Konvention
TextboxX
folgt, wobeiX
der laufenden Nummer entspricht. Me.Controls("Textbox" & i)
greift auf die Controls-Sammlung der Form zu und sucht nach einem Control mit dem spezifizierten Namen.- Es wird eine Typüberprüfung durchgeführt, um sicherzustellen, dass das gefundene Control tatsächlich eine
TextBox
ist. Dies verhindert Laufzeitfehler, falls kein Control mit dem angegebenen Namen gefunden wird oder das Control ein anderer Steuerelementtyp ist. - Der Text des Textfelds wird dann auf den aktuellen Wert von
i
gesetzt.
Komplizierter wird es, wenn man die Controls nicht anhand ihres Namens ansprechen will, sondern aufgrund bestimmter Eigenschaften erst suchen muss. Will man beispielsweise alle Controls mit einem bestimmten Tag ansprechen, so geht das nur, wenn man alle Controls durchläuft.Dies könnte man beispielsweise so realisieren
Textfeld mittels Tag ansprechen
Erläuterung des Codes:
- Die Funktion nimmt ein
Form
-Objekt (myForm
) und einen String (strTag
) als Parameter. - Sie durchläuft alle Steuerelemente (
Controls
) auf der übergebenen Form. - Für jedes Steuerelement wird überprüft, ob es vom Typ
TextBox
ist und ob seinTag
-Attribut mit dem gesuchten String (strTag
) übereinstimmt. - Wird ein passendes
TextBox
gefunden, wird es als Rückgabewert der Funktion zurückgegeben. - Falls kein entsprechendes
TextBox
gefunden wird, gibt die FunktionNothing
zurück.
Achtung:
Dies funktioniert nicht, wenn die Controls bestandteile anderer Controls sind. Auch wenn man Me.Textbox1 direkt ansprechen kann, kann es sein, dass es sich beispielsweise um eine Textbox in einem Panel oder in einer Groupbox handelt. Dann kann man sie nicht auf diese Methoden ansprechen.
Aber auch für diesen Fall gibt es eine Lösung: (die selbe Funktion, die sich rekursiv aufruft)
Erläuterung des Codes:
- Die Funktion
getTextboxByName
nimmt ein Objekt (myObject
), dasControls
enthält, und einen String (strName
) als Parameter. - Sie durchläuft alle Steuerelemente (
Controls
) inmyObject
. - Für jedes Steuerelement wird überprüft, ob es vom Typ
TextBox
ist und ob seinName
-Attribut mit dem gesuchten String (strName
) übereinstimmt. - Wird ein
TextBox
mit dem entsprechenden Namen gefunden, wird es zurückgegeben. - Falls das aktuelle Steuerelement kein
TextBox
ist oder nicht den gesuchten Namen hat, wird die Funktion rekursiv aufgerufen, um auch in untergeordneten Steuerelementen zu suchen. - Falls kein entsprechendes
TextBox
gefunden wird, gibt die FunktionNothing
zurück.