Alle Controls einer Form auflisten

  • VB.NET

Es gibt 6 Antworten in diesem Thema. Der letzte Beitrag () ist von dusti.

    Alle Controls einer Form auflisten

    Ich möchte für absolut alle Controls einer Form etwas machen. Ich habe mir eine rekursive Methode erarbeitet, die auch alle "Childcontrols" eines Controls durchgeht. Mein Problem ist, dass dabei aber z.B. nicht die ToolStripMenuItems aufgelistet werden. Mein Code sieht wie folgend aus:

    VB.NET-Quellcode

    1. Public Sub TranslateForm(ByRef frm As Form)
    2. For Each cntrl As Control In frm.Controls
    3. Me.TranslateControl(cntrl)
    4. Next
    5. End Sub
    6. Private Sub TranslateControl(ByRef cntrl As Control)
    7. MsgBox("Control: " & cntrl.Name)
    8. For Each item As System.Windows.Forms.Control In cntrl.Controls
    9. Me.TranslateControl(item)
    10. Next
    11. End Sub

    Damit werden mir zwar alle Buttons, Listviews, Toolstrips etc ausgegeben, aber eben nicht die ToolStripMenuItems. Gibt es wirklich keine andere Möglichkeit als das Control, das gerade "durchsucht" wird, in den entsprechenden Typ zu casten und dann mittels items alle Subitems durchzugehen? Hat jemand einen Tipp (oder eventuell sogar fertigen Sourcecode), wie ich das schaffen könnte?

    Ich möchte für absolut alle Controls einer Form etwas machen

    ToolstripMenuItem ist keine Control ;)

    VB.NET-Quellcode

    1. System.Object
    2. System.MarshalByRefObject
    3. System.ComponentModel.Component
    4. System.Windows.Forms.ToolStripItem
    5. System.Windows.Forms.ToolStripDropDownItem
    6. System.Windows.Forms.ToolStripMenuItem


    bleibt dir vermutlich außer casten nix übrig.
    Argh, Casten wäre echt schlimm, da ich das ja für jedes Element, das sich auf der Form befindet, aber kein Control ist, machen müsste und das wird viel Geschreibsel. Naja, muss ich dann scheinbar durch, falls niemand anderes einen Tipp hat.
    Nein, die reichen leider nicht. Ich möchte auf alle Texte, die ein Element auf der Form anzeigen kann, zugreifen. Das ist meisstens item.Text, aber teilweise haben die Items (wie eben Menus oder Listviews) "Unterkategorien", die ich auch einbeziehen muss.
    Hi,

    das Zauberwort heißt einerseits Rekursion -damit bekommt man die Steuerelemente in Containern- und andererseits muß man sich für das Toolstrip mit einer extra Schleife behelfen, weil die Controls-Eigenschaft fehlt. Zusammen bekommt man so eine vollständige Auflistung.

    Ein einfaches Beispiel, das die Namen aller Controls auf der Form ausgeben sollte. Das beinhaltet sowohl die Controls in Containern, sowie solche in Menüs.

    VB.NET-Quellcode

    1. Public Class Form1
    2. Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    3. DoToAllControls(Me)
    4. End Sub
    5. Sub DoToAllControls(ByVal m_Control As Control)
    6. For Each ctrl As Control In m_Control.Controls
    7. If ctrl.Controls.Count > 0 Then
    8. DoToAllControls(ctrl)
    9. End If
    10. If ctrl.GetType().Equals(GetType(ToolStrip)) Then
    11. For Each item As ToolStripItem In DirectCast(ctrl, ToolStrip).Items
    12. MsgBox(item.Name)
    13. Next
    14. End If
    15. MsgBox(ctrl.Name)
    16. Next
    17. End Sub
    18. End Class


    Für Menütypen mußt du das bei Bedarf erweitern, aber das sollte dann ja nicht mehr die Schwierigkeit sein.

    Gruß,

    f0x
    Mit Rekursion hatte ich es ja auch erst gelöst, dies funktioniert ja auch für Controls. Aber es geht mir nicht nur um Controls, sondern auch z.B. um Spalten in Listviews etc, also um alle Strings, die irgendwie in der GUI auftauchen können. Aber dein code hilft mir schon weiter, ich habe jetzt zwar schon etwas gebastelt, das ist aber viel zu kompliziert, ich werde mal schauen, ob ich dein Snipped erweitern kann. Danke.