how to get list all buttons in all forms of the project

Viewed 1000

I have the next code to get all forms in the project in vb.net.

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    Dim myAssembly As System.Reflection.Assembly = System.Reflection.Assembly.GetExecutingAssembly()

    Dim types As Type() = myAssembly.GetTypes()
    For Each t As Type In types
        If UCase(t.BaseType.ToString) = "SYSTEM.WINDOWS.FORMS.FORM" Then
            MessageBox.Show(t.Name)
        End If
    Next
End Sub

how to get a list of all buttons in all project's form?

4 Answers
Dim formType As Type = Me.GetType().BaseType
        Dim forms As List(Of Form) = (From t In Me.GetType().Assembly.GetTypes() Where t.IsSubclassOf(formType) = True Select DirectCast(Activator.CreateInstance(t), Form)).ToList()
        For Each f In forms
            Dim ctrl As Control = f.GetNextControl(Me, True)
            Do Until ctrl Is Nothing
                If TypeOf ctrl Is Button AndAlso ctrl.Name <> "cmdClose" Then
                    ctrl.Enabled = False
                End If
                ctrl = f.GetNextControl(ctrl, True)

                If ctrl Is Nothing Then
                    GoTo Line1
                Else
                    If ctrl.GetType = GetType(Button) Then
                        MsgBox(f.Text & " _ " & ctrl.Name)
                    End If
                End If
Line1:
            Loop
        Next

Here is how to get every Form in your project: https://stackoverflow.com/a/2364515/1920035

You can use this recursive method to get every control on a Form:

Private Function GetAllControls(root As Control) As  IEnumerable(Of Control)
    Dim children = root.Controls.OfType(Of Control)().ToList()

    For index = children.Count - 1 To 0 Step -1
        children.AddRange(GetAllControls(children(index)))
    Next

    Return children
End Function

Putting it all together, it would look something like this:

Dim formType As Type = Me.GetType().BaseType
Dim forms As List(Of Form) = (From t In Me.GetType().Assembly.GetTypes() Where t.IsSubclassOf(formType) = True Select DirectCast(Activator.CreateInstance(t), Form)).ToList()
Dim allControls = New List(Of Button)()
For Each f In forms
    allControls.AddRange(GetAllControls(f).OfType(Of Button))
Next

This should work

    Dim allForms As IEnumerable(Of String)
    allForms = From t As Type In Me.GetType().Assembly.GetTypes()
                Where t.BaseType Is GetType(Form)
                Select t.Name

    For Each frmName As String In allForms
        MessageBox.Show(frmName)
    Next

edit:

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    Dim allForms As IEnumerable(Of Form)
    'get all forms in project
    allForms = From t As Type In Me.GetType().Assembly.GetTypes()
                Where t.BaseType Is GetType(Form)
                Let f = DirectCast(Activator.CreateInstance(t), Form)
                Select f

    'get all buttons
    Dim allButtons As New List(Of Button)
    For Each f As Form In allForms
        allButtons.AddRange(IterateControls(f))
    Next

    For Each b As Button In allButtons
        Debug.WriteLine(b.Parent.Name)
    Next
End Sub

Private Function IterateControls(ctrl As Control) As List(Of Button)
    Dim rv As New List(Of Button)
    If TypeOf ctrl Is Button Then 'button?
        rv.Add(DirectCast(ctrl, Button)) 'yes
    Else 'no
        For Each c As Control In ctrl.Controls
            rv.AddRange(IterateControls(c))
        Next
    End If
    Return rv
End Function

You can do this with a short recursive function:

Function GetAllButtons(controls As Control.ControlCollection) As List(Of Button)

    Dim buttons As List(Of Button) = New List(Of Button)
    For Each c As Control In controls
        Select Case True
            Case c.Controls.Count > 0
                buttons.AddRange(GetAllButtons(c.Controls))
            Case TypeOf c Is Button
                buttons.Add(DirectCast(c, Button))
        End Select
    Next c
    Return buttons
End Function

Call this from the main form code (or wherever you like really):

Dim buttons As List(Of Button) = GetAllButtons(Me.Controls)
Related