VB.NET-Tipp 0014: Steuerelemente in einem Container enumerieren
von Herfried Wagner
Beschreibung
Die Klasse CControlEnumerator dient dazu, alle Steuerelemente in einem oder mehreren angegebenen Containern liegen, nicht aber in einer Menge anderer Container, und einen bestimmten Datentyp aufweisen, zu ermitteln.
Schwierigkeitsgrad: | Framework-Version(en): .NET Framework 1.0, .NET Framework 1.1, .NET Framework 2.0, .NET Framework 3.0, .NET Framework 3.5 | .NET-Version(en): Visual Basic 2002, Visual Basic 2003, Visual Basic 2005, Visual Basic 2008 | Download: |
' Dieser Quellcode stammt von http://www.activevb.de ' und kann frei verwendet werden. Für eventuelle Schäden ' wird nicht gehaftet. ' Um Fehler oder Fragen zu klären, nutzen Sie bitte unser Forum. ' Ansonsten viel Spaß und Erfolg mit diesem Source! ' Projektversion: Visual Studio 2002/2003 ' Option Strict: An ' Option Explicit: An ' ' Referenzen: ' - System ' - System.Drawing ' - System.Windows.Forms ' ' ############################################################################## ' ########################### ControlEnumerator.vb ############################# ' ############################################################################## Option Explicit On Option Strict On Option Compare Binary Imports System Imports System.Windows.Forms ' <remarks> ' Stellt Funktionalität zum Enumerieren aller ' Steuerelemente bestimmter Typen in einer Menge ' von Containern bereit, die nicht in einem der in ' einer weiteren Menge von Containern liegenden ' Container enthalten sind. ' </remarks> Public Class ControlEnumerator ' <summary> ' Wird für jedes während des Enumerationsvorgangs ' gefundene Steuerelement ausgelöst. ' <summary> ' <param name="ctrControl">Steuerelement, das gefunden wurde.</param> Public Event ControlFound(ByVal sender As Object, _ ByVal e As ControlFoundEventArgs) ' Private Variablen zum Speichern der Eigenschaftswerte. Private m_actrExcludedContainers() As Control Private m_atypInterestingControlTypes() As Type Private m_ctrRootContainers() As Control ' <summary> ' Ruft für jedes Steuerelement, das einem der ' Steuerelemente in <c>RootContainers</c> ' untergeordnet ist, jedoch nicht <c>ExcludedContainers</c>, ' und zusätzlich noch einen ' der Datentypen in <c>InterestingControlTypes</c> aufweist, ' das Ereignis <c>ControlFound</c> auf. ' </summary> Public Sub Enumerate() Dim ctr As Control For Each ctr In Me.RootContainers DoEnumeration(ctr) Next ctr End Sub ' <summary> ' Führt eine rekursive Enumeration der interessanten ' Steuerelemente in einem Container durch. ' </summary> ' <param name="ctrControl">Steuerelement, für ' das die Enumeration aufgerufen wird.</param> Private Sub DoEnumeration( _ ByVal ctrControl As Control) ' Der Container ist nicht einer der "verbotenen" Container. If Not IsExcludedContainer(ctrControl) Then ' Es handelt sich nicht um einen Wurzelcontainer (diese ' sind als "Ergebniskandidaten" ausgenommen). If Not IsRootContainer(ctrControl) Then If IsInterestingControl(ctrControl) Then RaiseEvent ControlFound(Me, _ New ControlFoundEventArgs(ctrControl)) End If End If ' Wenn der Container überhaupt Kinder besitzt. If ctrControl.HasChildren Then ' Für alle Steuerelemente rekursiv aufrufen. Dim ctr As Control For Each ctr In ctrControl.Controls DoEnumeration(ctr) Next ctr End If End If End Sub ' <summary> ' Gibt zurück, ob das angegeben Steuerelement in der ' Sammlung der Wurzelcontainer enthalten ist. ' </summary> ' <param name="ctrControl">Zu untersuchendes Steuerelement.</param> ' <returns> ' Boolescher Wert, der angibt, ob das ' im Parameter <paramref name="ctrControl"/> ' übergebene Steuerelement ein Wurzelcontainer ist. ' </returns> Private Function IsRootContainer( _ ByVal ctrControl As Control) As Boolean Dim ctr As Control For Each ctr In Me.RootContainers If ctrControl Is ctr Then Return True End If Next ctr Return False End Function ' <summary> ' Gibt zurück, ob es sich beim im Parameter ' <paramref name="ctrControl"/> übergebenen ' Steuerelement um einen von der Enumeration ' ausgenommenen Container handelt. ' </summary> ' <param name="ctrControl">Zu untersuchendes Steuerelement.</param> ' <returns> ' Boolescher Wert, der angibt, ob das im Parameter ' <paramref name="ctrControl"/> übergebene ' Steuerelement eine uninteressanter Container ist. ' </returns> Private Function IsExcludedContainer( _ ByVal ctrControl As Control) As Boolean Dim ctr As Control For Each ctr In Me.ExcludedContainers If ctrControl Is ctr Then Return True End If Next ctr Return False End Function ' <summary> ' Gibt zurück, ob das im Parameter ' <paramref name="ctrControl"/> angegebene Steuerelement ' Instanz eines interessanten Typs ist. ' </summary> ' <param name="ctrControl">Zu untersuchendes Steuerelement.</param> ' <returns> ' Boolescher Wert, der angibt, ob das im Parameter ' <paramref name="ctrControl"/> übergebene Steuerelement interessant ist. ' </returns> Private Function IsInterestingControl( _ ByVal ctrControl As Control) As Boolean Dim typ As Type For Each typ In Me.InterestingControlTypes If ctrControl.GetType() Is typ Then Return True End If Next typ Return False End Function ' <summary> ' Gibt eine Menge von Steuerelementcontainern, ' in denen nicht weiter gesucht werden soll, ' an oder gibt sie zurück. ' </summary> ' <value>Menge von Containern, deren enthaltene ' Steuerelemente nicht betrachtet werden.</value> Public Property ExcludedContainers() As Control() Get Return m_actrExcludedContainers End Get Set(ByVal Value() As Control) m_actrExcludedContainers = Value End Set End Property ' <summary> ' Gibt eine Menge interessanter Steuerelementtypen ' an oder gibt sie zurück. Steuerelemente ' eines dieser Typen, die während der Enumeration ' durchlaufen werden, werden ausgegeben. ' </summary> ' <vaule>Menge interessanter Steuerelementtypen.</value> Public Property InterestingControlTypes() As Type() Get Return m_atypInterestingControlTypes End Get Set(ByVal Value() As Type) m_atypInterestingControlTypes = Value End Set End Property ' <summary> ' Gibt eine Menge von Wurzelcontainern, die ' auf untergeordnete Steuerelemente eines ' der Typen in <c>InterestingControlTypes</c> ' untersucht werden soll, an oder gibt ' sie zurück. ' </summary> ' <value>Menge von zu durchsuchenden Wurzelcontainern.</value> Public Property RootContainers() As Control() Get Return m_ctrRootContainers End Get Set(ByVal Value() As Control) m_ctrRootContainers = Value End Set End Property End Class ' ############################################################################## ' ######################### ControlFoundEventArgs.vb ########################### ' ############################################################################## Option Explicit On Option Strict On Option Compare Binary Imports System Imports System.Windows.Forms ' <remarks> ' Stellt Informationen zum Ereignis <c>ControlFound</c> ' der Klasse <c>ControlEnumerator</c> bereit. ' </remarks> Public Class ControlFoundEventArgs Inherits EventArgs Private m_ctrControl As Control ' <summary> ' Erstellt eine neue Instanz der Klasse und ' weist den Eigenschaften die übergebenen ' Werte zu. ' </summary> ' <param name="ctrControl">Steuerelement, für ' das das Ereignis ausgelöst wird.</param> Public Sub New(ByVal ctrControl As Control) m_ctrControl = ctrControl End Sub ' <summary> ' Gibt das Steuerelement, für das das ' Ereignis ausgelöst wird, an oder gibt es zurück. ' </summary> ' <value>Steuerelement, für das das Ereignis ausgelöst wird.</value> Public Property Control() As Control Get Return m_ctrControl End Get Set(ByVal Value As Control) m_ctrControl = Value End Set End Property End Class ' ############################################################################## ' ################################ MainForm.vb ################################# ' ############################################################################## Option Explicit On Option Strict On Option Compare Binary Imports System Imports System.Windows.Forms ' <remarks> ' Hauptformular der Anwendung. ' </remarks> Public Class MainForm Inherits System.Windows.Forms.Form Private Sub btnStart_Click( _ ByVal sender As System.Object, _ ByVal e As System.EventArgs) _ Handles btnStart.Click Dim tbe As New ControlEnumerator() AddHandler tbe.ControlFound, _ AddressOf Me.ControlEnumerator_ControlFound With tbe .RootContainers = New Control() {Me, Me.GroupBox3} .ExcludedContainers = New Control() {Me.GroupBox2} .InterestingControlTypes = New Type() {GetType(TextBox), _ GetType(ComboBox)} .Enumerate() End With RemoveHandler tbe.ControlFound, _ AddressOf Me.ControlEnumerator_ControlFound End Sub ' ' In diese Prozedur werden alle "interessanten" ' Steuerelemente durchgereicht. ' Private Sub ControlEnumerator_ControlFound( _ ByVal sender As Object, _ ByVal e As ControlFoundEventArgs) MessageBox.Show(e.Control.Name) End Sub End Class
Ihre Meinung
Falls Sie Fragen zu diesem Artikel haben oder Ihre Erfahrung mit anderen Nutzern austauschen möchten, dann teilen Sie uns diese bitte in einem der unten vorhandenen Themen oder über einen neuen Beitrag mit. Hierzu können sie einfach einen Beitrag in einem zum Thema passenden Forum anlegen, welcher automatisch mit dieser Seite verknüpft wird.