Навигация по элементам управления и компонентам - PullRequest
2 голосов
/ 18 октября 2011

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

public void Traverse(Control cnt)
{
    foreach (Control c in cnt.Controls)
    {
        if (c.HasChildren) Traverse(c);
        Debug.Print(c.Name); // For debugging purpose only
        // My code goes here
    }
}

Проблема возникает, когда функции встречают ToolStrip : у него нет дочерних элементов, но элементы (ToolStripItemCollection: IList, ICollection, IEnumerable).

Мне наплевать на тип: используя Reflection, мне нужно установить какое-то свойство, поэтому я чувствую себя хорошо, имея объекты в результате.
Как я могу получить имя каждого компонента, который находится внутри моего UserControl?
Спасибо

1 Ответ

1 голос
/ 18 октября 2011

Я написал версию, которая просматривает свойства элемента управления и ищет IComponent s с ICollection s:

Метод:

private void GetControls(ICollection controls, IList<string> names)
{
    foreach (var ctl in controls)
    {
        if (ctl is IComponent)
        {
            var name = ctl.GetType().GetProperty("Name");
            if (name != null)
                names.Add((string) name.GetValue(ctl, null));

            foreach (var property in ctl.GetType().GetProperties())
            {
                var prop = property.GetValue(ctl, null);
                if (prop is ICollection)
                    GetControls((ICollection)prop, names);
            }
        }
    }
}

Вызывается:

var ctlNames = new List<string>();
GetControls(Controls, ctlNames);

Я проверил это и, похоже, нашел все элементы управления в форме.Я не проверял его для каждого вида контроля и не могу подтвердить, насколько он эффективен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...