【问题标题】:Get Parents of a Control in winforms在 winforms 中获取控件的父级
【发布时间】:2013-05-09 21:43:05
【问题描述】:

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

Panel1->Panel2->Panel3->button1

那么怎样才能得到这样的路径字符串

string path=\Panel1\Panel2\Panel3\button1

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

【问题讨论】:

  • Control.Parent 可能是您想要的。您能否详细说明设计时的概念——例如设置字符串与设计时相比与运行时有何不同?
  • @JeremyThompson 啊,我的错...我的意思是我不想使用 Control 的标签属性来分配标签属性控制路径。我想使用扩展器类,所以在我的程序中我想获取该属性的值(路径)

标签: c# winforms 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 在这里似乎无关紧要。

【讨论】:

    猜你喜欢
    • 2021-06-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多