2

Panel1在这个里面Panel2和这个里面Panel3......所以想象一下

Panel1->Panel2->Panel3->button1

那么如何获得像这样的路径字符串

string path=\Panel1\Panel2\Panel3\button1

如果我想得到button1的所有父母。
我可以通过定义一个实现 IExtenderProvider 的类来做到这一点,那么是否可以在设计时实现它。

4

1 回答 1

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在这里似乎无关紧要。

于 2013-05-10T02:31:55.933 回答