Похоже, вы используете VB здесь, и мой ответ будет на C#, я боюсь.
Вот мое решение, и вы можете увидеть скриншот (надеюсь, если эта чертова ссылка работает!) От нее работает здесь.
Вам нужно рекурсивно перебора всех элементов управления на форме, спускаясь в коллекцию Controls каждого из них, если у него есть дети.
Это решение использует закрытый элемент управления ControlInfo, внутри которого находится экземпляр Control, который переопределяет операцию ToString(), поэтому вы можете легко настроить текст, отображаемый в комбо. Затем вы привязываете комбо к совокупности этих данных после их создания из дерева управления формы.
Чтобы использовать этот код создать новую форму и поместите комбо под названием ComboBox1 там, то вы должны быть в состоянии заменить все с этим:
public partial class Form1 : Form
{
private class ControlInfo
{
public Control Control { get; set; }
public override string ToString()
{
return string.Format("{0} ({1})", Control.Name, Control.GetType());
}
}
public Form1()
{
InitializeComponent();
comboBox1.DataSource =
GetControls(this.Controls.Cast<Control>()).OrderBy(c => c.Name).
Select(c => new ControlInfo() { Control = c }).ToList();
}
private IEnumerable<Control> GetControls(IEnumerable<Control> controls)
{
foreach (var control in controls)
{
yield return control;
if (control.Controls.Count > 0)
{
foreach (var childControl in GetControls(
control.Controls.Cast<Control>()))
{
yield return childControl;
}
}
}
}
Предположим, что если у вас есть панель, которая, в свою очередь, содержит другие элементы управления, вы можете проверить, просто установите условие - проверьте, что Control.Count больше нуля ... вы можете использовать ту же логику рекурсивно. –