2013-05-09 81 views
2

一个控制我Panel1这个Panel2里面,这里面Panel3 ...所以,想象一下像
获取父母在的WinForms

Panel1->Panel2->Panel3->button1 

那么如何才能得到一个路径字符串像

string path=\Panel1\Panel2\Panel3\button1 

如果我想要得到所有家长的button1
我可以使用定义一个实现IExtenderProvider的类来做到这一点,所以有可能在设计时做到这一点。

+0

'Control.Parent'可能是你想要的。您能否详细说明设计阶段的概念 - 比如设置字符串与设计时间相比运行时间有什么不同? – 2013-05-09 22:12:25

+0

@JeremyThompson啊我的坏...我的意思是我不想使用Control的标签属性来分配标签属性控制路径。我想使用Extender类,所以在我的程序中我想获取该属性的值(路径) – 2013-05-09 22:17:51

回答

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; 
      }     
     } 
    } 
} 


这里是我加入到项目中的用户控件的属性,将利用它:

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

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


建立之后,拖动用户控制到从工具箱中的窗体。一定要将它嵌入到其他控件中很不错。我嵌套3个面板,并将其放置在最类似于您的示例的面板中。这里的性质是什么样子,在设计时间:

User Control Properties

这应该是适用于你从中赚取Control派生的任何类。 IExtenderProvider似乎无关紧要。