Получить родителей контроля в winforms

Я имею Panel1 внутри этого Panel2 и внутри этого Panel3... так представь как

Panel1->Panel2->Panel3->button1

Итак, как можно получить строку пути, как

string path=\Panel1\Panel2\Panel3\button1

если я хочу, чтобы получить все родители Button1.
И могу ли я сделать это, используя определение класса, который реализует IExtenderProvider, так что это возможно сделать во время разработки.

1 ответ

Решение

Вот метод расширения, чтобы получить все имена родителей как IEnumerable<string>:

public static class Extensions
{
    public static IEnumerable<string> GetControlPath(this Control c)
    {
        yield return c.Name;

        if (c.Parent != null)
        {
            Control parent = c.Parent;

            while (parent != null)
            {
                yield return parent.Name;
                parent = parent.Parent;
            }                
        }
    }
}


А вот свойство UserControl, которое я добавил в проект и которое будет использовать его:

public partial class CustomControl : UserControl
{
    public CustomControl()
    {
        InitializeComponent();
    }

    public string ControlPath
    {
        get
        {
            return string.Join(@"\", this.GetControlPath().Reverse());
        }
    }
}


После сборки перетащите пользовательский элемент управления на форму из панели инструментов. Обязательно вложите его в другие элементы управления довольно хорошо. Я вложил 3 панели и поместил их в самую внутреннюю панель, как в вашем примере. Вот как выглядят свойства во время разработки:

Свойства пользовательского элемента управления

Это должно быть применимо к любому классу, который вы делаете, который происходит от Control, IExtenderProvider кажется неуместным здесь.

Другие вопросы по тегам