Die Community zu .NET und Classic VB.
Menü

VB.NET-Tipp 0014: Steuerelemente in einem Container enumerieren

 von 

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:

Schwierigkeitsgrad 1

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:

Download des Beispielprojektes [5,88 KB]

' 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.