vb@rchiv
VB Classic
VB.NET
ADO.NET
VBA
C#

https://www.vbarchiv.net
Rubrik: Controls   |   VB-Versionen: VB2010 - VB201504.03.20
Ändern von Control-Eigenschaften in der Runtime

Funktionen, die das Ändern einer Eigenschaft eines oder mehrerer Controls während der Laufzeit gestatten

Autor:   Dietrich HerrmannBewertung:  Views:  250 
ohne HomepageSystem:  Vista, Win7, Win8, Win10kein Beispielprojekt 

Ich hatte das Problem, meine Anwendungen auf eine andere Screen-Auflösung als der, unter der die Anwendungen entwickelt wurden, anzupassen; insbesondere Fontgrößen. Die Fenster enthalten viele Controls, sodass wirklich Funktionen für alle notwendig wurden.

Die folgenden Funktionen realisieren das Ändern einer bestimmten vorzugebenden Eigenschaft (mit ihrem Namen), deren Wert/Einstellung auf eine neue Vorgabe gesetzt werden soll. Die Funktionen sind ausreichend dokumentiert.

Die Verwendung der Funktionen erfordert:

Imports System.Reflection

Hier die betreffenden Funktionen:

1. Die gewünschte Eigenschaft der Controls eines bestimmten Typs auf neuen Wert ändern

''' <summary>
''' Alle Controls des angegebenen Typs im angegebenen Container-Objekt
''' eine bestimmte Eigenschaft mit neuem Wert versehen, 
''' wobei auch weitere Container-Controls 
''' innerhalb des Container-Objekts berücksichtigt werden können
''' </summary>
''' <param name="oContainer">der Original-Container</param>
''' <param name="refControl">das Referenz-Control (zur Ermittlung des Typs)</param>
''' <param name="thePropName">der Name der zu ändernden Eigenschaft</param>
''' <param name="thePropVal">der neue Eigenschaftenwert</param>
''' <param name="bSubContainerAlso">SubContainer berücksichtigen ja|nein</param>
Public Sub setControlsPropVal(oContainer As Control, refControl As Control, thePropName As String,
  Optional thePropVal As Object = Nothing,
  Optional bSubContainerAlso As Boolean = True)
 
  Dim typ As Type = refControl.GetType
  Dim PropertyInfo As PropertyInfo
 
  If Not IsNothing(oContainer) Then
    ' alle Controls des Container-Objekts durchlaufen
    For Each oControl As Control In oContainer.Controls
      If CtrlPropertyExists(oControl, thePropName) Then  'ist Eigenschaft vorhanden?
        ' Falls es sich um ein Container-Control handelt und die 
        ' Controls ebenfalls geändert werden sollen, muss
        ' die Funktion setControls rekursiv erneut aufgerufen werden
        If bSubContainerAlso AndAlso oControl.Controls.Count > 0 Then
          setControlsPropVal(oControl, refControl, thePropName, thePropVal)
        Else
          ' sofern es sich um ein Control vom Type typ handelt Inhalt ändern
          If oControl.GetType.Equals(typ) Then
            PropertyInfo = oControl.GetType().GetProperty(thePropName)
            PropertyInfo.SetValue(oControl, thePropVal, Nothing)
          End If
        End If
      End If
    Next 
  End If
End Sub

2. Die gewünschte Eigenschaft aller Controls verschiedenen Typs auf neuen Wert ändern

''' <summary>
''' Alle Controls im angegebenen Container-Objekt
''' eine bestimmte Eigenschaft mit neuem Wert versehen, 
''' wobei auch weitere Container-Controls 
''' innerhalb des Container-Objekts berücksichtigt werden können
''' </summary>
''' <param name="oContainer">der Original-Container</param>
''' <param name="thePropName">der Name der zu ändernden Eigenschaft</param>
''' <param name="thePropVal">der neue Eigenschaftenwert</param>
''' <param name="bSubContainerAlso">SubContainer berücksichtigen ja|nein</param>
Public Sub setAllControlsPropVal(oContainer As Control, thePropName As String,
  Optional thePropVal As Object = Nothing,
  Optional bSubContainerAlso As Boolean = True)
 
  Dim PropertyInfo As PropertyInfo
 
  If Not IsNothing(oContainer) Then
    ' alle Controls des Container-Objekts durchlaufen
    For Each oControl As Control In oContainer.Controls
      If CtrlPropertyExists(oControl, thePropName) Then  'ist Eigenschaft vorhanden?
        ' Falls es sich um ein Container-Control handelt und die 
        ' Controls ebenfalls geändert werden sollen, muss
        ' die Funktion setControls rekursiv erneut aufgerufen werden
        If bSubContainerAlso AndAlso oControl.Controls.Count > 0 Then
          setAllControlsPropVal(oControl, thePropName, thePropVal)
        Else
          PropertyInfo = oControl.GetType().GetProperty(thePropName)
          PropertyInfo.SetValue(oControl, thePropVal, Nothing)
        End If
      End If
    Next 
  End If
End Sub

3. Überprüfung, ob ein Control eien bestimmte Eigenschaft besitzt

''' <summary>
''' Prüfen, ob ein Control eine bestimmte Eigenschaft besitzt
''' </summary>
''' <param name="theCtrl">das Control</param>
''' <param name="thePropName">der Name der zu überprüfenden Eigenschaft</param>
''' <returns>True|False</returns>
Public Function CtrlPropertyExists(theCtrl As Control, thePropName As String) As Boolean
  ' Filter erzeugen, der bestimmt, ob eine Eigenschaft mit dem Namen "Text" verfügbar ist,
  ' dabei wird die Gross-und-Kleinschreibung ignoriert
  Dim filter As Reflection.MemberFilter _
    = Function(member As Reflection.MemberInfo, criteria As Object) _
      (member.Name.Equals(thePropName, StringComparison.InvariantCultureIgnoreCase))
 
  ' nur Eigenschaften, die sowohl öffentlich als auch nicht statisch sind, zulassen
  Dim flags As Reflection.BindingFlags _
    = Reflection.BindingFlags.Public Or Reflection.BindingFlags.Instance
 
  ' keine Kriterien (filterCriteria) nötig --> Der Parameter ist Nothing
  Dim members() As Reflection.MemberInfo _
    = GetType(Control).FindMembers(Reflection.MemberTypes.Property, flags, filter, Nothing)
 
  ' existiert eine Eigenschaft mit dem Namen thePropName?
  Return (members.Length > 0)
End Function

Die Funktionen realisieren auch, dass Controls in einem bestimmten Container sich befinden können, eventuell sogar auch in weiteren Containern.

Beispiel des Aufrufs:
Im Container werden alle Controls (falls sie die Eigenschaft Font besitzen) mit einem neuen Font versehen.

setAllControlsPropVal(SplitContainer1.Panel1, "Font", Font)



Anzeige

Kauftipp Unser Dauerbrenner!Diesen und auch alle anderen Tipps & Tricks finden Sie auch auf unserer aktuellen vb@rchiv  Vol.6

Ein absolutes Muss - Geballtes Wissen aus mehr als 8 Jahren vb@rchiv!
- nahezu alle Tipps & Tricks und Workshops mit Beispielprojekten
- Symbol-Galerie mit mehr als 3.200 Icons im modernen Look
Weitere Infos - 4 Entwickler-Vollversionen (u.a. sevFTP für .NET), Online-Update-Funktion u.v.m.
 
 
Copyright ©2000-2020 vb@rchiv Dieter OtterAlle Rechte vorbehalten.


Microsoft, Windows und Visual Basic sind entweder eingetragene Marken oder Marken der Microsoft Corporation in den USA und/oder anderen Ländern. Weitere auf dieser Homepage aufgeführten Produkt- und Firmennamen können geschützte Marken ihrer jeweiligen Inhaber sein.