Mehrere Elemente in einer Schleife bearbeiten

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 4 Antworten in diesem Thema. Der letzte Beitrag () ist von tron25.

    Mehrere Elemente in einer Schleife bearbeiten

    Hallo,
    ich habe eine Form mit 6 Buttons und einer TabControl. Es gibt u.a. eine Registerkarte mit dem Namen "Farben". Diese enthält zudem drei Groupboxen, die jeweils mehrere Labels und Comboboxen enthalten. Auf allen Registerkarten befinden sich Labels, Comboboxen, Checkboxen und Buttons. Nun möchte ich, dass alle Labels beispielsweise die gleiche Höhe bekommen. Folgender Code funktioniert bei allen Labels, die nicht in einer Groupbox sind:

    VB.NET-Quellcode

    1. EinstellungenTab.Top = 10
    2. EinstellungenTab.Left = 10
    3. EinstellungenTab.Width = Me.ClientSize.Width - 20
    4. EinstellungenTab.Height = Me.ClientSize.Height - 40 - (BackupsLoeschenBefehl.Height * 2)
    5. Zeile = CInt((EinstellungenTab.ClientSize.Height - 20) / 10)
    6. Spalte = CInt((EinstellungenTab.ClientSize.Width - 60) / 4)
    7. Mitte = CInt(EinstellungenTab.ClientSize.Width / 2)
    8. For Each Registerkarten In Me.Controls.OfType(Of TabControl)()
    9. For Each Registerkarte In Registerkarten.Controls.OfType(Of TabPage)()
    10. For Each Beschriftung In Registerkarte.Controls.OfType(Of Label)()
    11. Beschriftung.Visible = False
    12. Beschriftung.AutoSize = False
    13. Beschriftung.Width = Spalte
    14. Beschriftung.Height = Zeile
    15. Beschriftung.TextAlign = ContentAlignment.MiddleLeft
    16. Next
    17. Next
    18. Next
    19. DruckerLabel.Left = 10
    20. DruckerLabel.Top = CInt((Zeile / 2) - (DruckerLabel.Height / 2))
    21. DruckerCombo.Left = 20 + Spalte
    22. DruckerCombo.Top = CInt((Zeile / 2) - (DruckerCombo.Height / 2))
    23. '...


    Natürlich könnte ich da auch eine weitere Schleife einfügen, die speziell alle Groupboxen durchläuft und die darin enthaltenen Elemente anpaßt. Gibt es eine Möglichkeit, alle Elemente unabhängig ihres Standortes anzusprechen? Oder muß ich tatsächlich für jede Ebene eine eigene Schleife basteln?

    tron25 schrieb:

    Gibt es eine Möglichkeit, alle Elemente unabhängig ihres Standortes anzusprechen?
    Ja, die ControlCollections stellen eine Baum-Struktur dar, da in jedem Control eine weitere Collection ist, und darin können wieder viele Controls sein...
    Mit For-Schleifen wird man dem nicht mehr gerecht.
    Es gibt zwei Standard-Algorithmen, mit denen man hierarchische Strukturen durchläuft: Der eine arbeitet Rekursiv, der andere mit einer Queue(Of T)
    Zu Rekursion habich Tut zu gemacht: Tree-Übungen - Rekursion
    Dort stelle ich einen eleganten Rekursion-Pattern vor (mit anonymer Methode), weil man kann Rekursionen auch recht unelegant implementieren.

    Ob das sinnvoll ist, zur Laufzeit das Layout von ausnahmslos allen Labels zu gestalten, lassichmal dahingestellt.
    PadreSperanzas Ansatz ist zwar mehr schreibarbeit, aber dafür kann man Ausnahmen besser berücksichtigen, wenn man die Controls halt bei ihrem Namen nennt.
    Übrigens kann man die Namen natürlich nicht in einer Schleife behandeln, sondern man tut alle Controls in ein Array - und das kann man durchschleifen.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „ErfinderDesRades“ ()

    @tron25 Ich hab mir inzwischen angewöhnt, auf komplexen TabControls UserControls zu gestalten und die mit entsprechenden Interfaces auszurüsten.
    Dann gehst Du in der GUI einfach die Interfaces durch und machst, was zu tun ist.
    Feddich.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Die Anzahl und Hirarchie der einzelnen Elemente ist bereits bekannt. Das "Tut zu" habe ich so verstanden, dass es eine generelle Methode ist, eine unbestimmte Anzahl von Elementen und Hirarchieebenen durchlaufen zu können. Ich habe mein Problem folgendermaßen gelöst:

    VB.NET-Quellcode

    1. EinstellungenTab.Top = 10
    2. EinstellungenTab.Left = 10
    3. EinstellungenTab.Width = Me.ClientSize.Width - 20
    4. EinstellungenTab.Height = Me.ClientSize.Height - 40 - (BackupsLoeschenBefehl.Height * 2)
    5. Zeile = CInt((EinstellungenTab.ClientSize.Height - 20) / 10)
    6. Spalte = CInt((EinstellungenTab.ClientSize.Width - 60) / 4)
    7. Mitte = CInt(EinstellungenTab.ClientSize.Width / 2)
    8. For Each Registerkarten In Me.Controls.OfType(Of TabControl)()
    9. For Each Registerkarte In Registerkarten.Controls.OfType(Of TabPage)()
    10. If Registerkarte.Name = "FarbenTab" Then
    11. For Each Gruppe In Registerkarte.Controls.OfType(Of GroupBox)()
    12. Gruppe.Width = (Spalte * 2) + 10
    13. For Each Beschriftung In Gruppe.Controls.OfType(Of Label)()
    14. Beschriftung.Width = Gruppe.ClientSize.Width - 30 - FensterhintergrundfarbeCombo.Width
    15. Beschriftung.Left = 10
    16. Next
    17. For Each Ausklappliste In Gruppe.Controls.OfType(Of ComboBox)()
    18. Ausklappliste.Left = Gruppe.ClientSize.Width - 10 - Ausklappliste.Width
    19. Next
    20. Next
    21. End If
    22. If Registerkarte.Name = "TextverarbeitungTab" Then
    23. For Each Gruppe In TextverarbeitungTab.Controls.OfType(Of GroupBox)
    24. Gruppe.Width = (Spalte * 2) + 10
    25. Gruppe.Height = Zeile * 2
    26. Gruppe.Top = 10
    27. Next
    28. End If
    29. For Each Beschriftung In Registerkarte.Controls.OfType(Of Label)()
    30. Beschriftung.AutoSize = False
    31. Beschriftung.Width = Spalte
    32. Beschriftung.Height = Zeile
    33. Beschriftung.TextAlign = ContentAlignment.MiddleLeft
    34. Next
    35. Next
    36. Next

    Vielen Dank für eure schnelle Hilfe.