2015-02-03 6 views
0

Я хочу получить список всех элементов управления; Мне удалось сделать это в коде ниже; проблема в том, что в этом списке перечислены только элементы управления вне контейнеров. Я хочу получить список всех элементов управления, включая те внутри контейнеров (например, элементы управления внутри TabControl). Мой вопрос: как это сделать в VB.Net?VB.Net Список элементов управления

Sub ListAllControls() 
    Me.RichTextBox1.Clear() 
    Dim MekdamCTL As Control 
    For Each MekdamCTL In Me.Controls 
     Me.RichTextBox1.AppendText("Control: " & MekdamCTL.Name & Environment.NewLine) 
    Next 
    Me.RichTextBox1.AppendText("How to include ALL Controls in ALL Containers, such as Controls in TabControl ??") 
End Sub 

Заранее благодарим за помощь и/или комментарии.

+0

Вы можете использовать рекурсию, но вам не обязательно. См. Мой ответ. – dbasnett

ответ

0

Это немного сложнее, чем вам нужно, но следующая функция возвращает все элементы управления любого данного типа и, возможно, ищет любые встроенные контейнеры

''' <summary>Get all Controls of a specified type within a container and optionally any embedded containers</summary> 
''' <typeparam name="ctrlType">The type of Control to be searched for (must inherit from Control)</typeparam> 
''' <param name="parent">The top level container</param> 
''' <param name="searchContainers">True if embedded containers are to be searched</param> 
''' <returns>IEnumerable with all Controls of the specified type that were found</returns> 
Function GetControlsOfType(Of ctrlType As Control)(parent as Control, searchContainers As Boolean) As IEnumerable(Of ctrlType) 
    Dim ctrls As New List(Of ctrlType) 
    For Each ctrl As Control In parent.Controls 
     If TypeOf ctrl Is ctrlType Then ctrls.Add(DirectCast(ctrl, ctrlType)) 
     If searchContainers AndAlso ctrl.Controls.Count > 0 Then ctrls.AddRange(GetControlsOfType(Of ctrlType)(ctrl, searchContainers)) 
    Next 
    Return ctrls 
End Function 

Если вы хотите перечислить все элементы управления любого типа, вы можете назвать это так:

For Each ctrl As Control In GetControlsOfType(Of Control)(Me, True) 
    Me.RichTextBox1.AppendText("Control: " & ctrl.Name & vbCrLf) 
Next 
2

вы должны рекурсивную функцию, которую можно вызвать из вашей основной формы

Public Sub ListControls(coll As Control.ControlCollection) 
    for each ctr in coll 
     Me.RichTextBox1.AppendText("Control: " & ctr.Name & Environment.NewLine) 
     if ctr.Controls.Count > 0 Then 
      ListControls(ctr.Controls) 
     End if 
    Next 
End Sub 

Вызывается из главной формы

ListControls(Me.Controls) 
+0

Спасибо, да, это портирование кода C#. – Steve

+0

Я получил свой ответ; но мне просто интересно, этот код не перечислял «Inside Controls» ?? Можете ли вы проверить? он дал идентичные результаты моему опубликованному коду в моем вопросе. – Abbas1999

+0

Хорошо, он не печатает имя контейнера управления, исправленного сейчас. – Steve

1

Дайте этому попытку:

'this loop will get all the controls on the form 
    'no matter what the level of container nesting 

    Dim ctrl As Control = Me.GetNextControl(Me, True) 
    Do Until ctrl Is Nothing 
     RichTextBox1.AppendText("Control: " & ctrl.Name & Environment.NewLine) 
     ctrl = Me.GetNextControl(ctrl, True) 
    Loop 

С помощью этого метода нет необходимости для проверки или рекурсии.

Смежные вопросы