2013-03-12 168 views
4

这是一段时间,因为我不得不做树遍历并且想要一些输入。下面是一个简单的树:如何解决这个树遍历

tree

树是我的ASP.NET页面。该页面由2个主页面和内容页面组成。我想要做的是找到作为我的第二个母版页的主要内容的控件,然后将所有控件放在平面数据结构(如列表)中。

因此,鉴于橙色节点是第二个母版页的主要ContentPlaceHolder,我想将所有那些存储在我的列表中的蓝色椭圆。我已经创建了一些代码,返回我所有的孩子,孙子,等控制的集合在此:

private IEnumerable<Control> GetChildControls(Control parentControl) 
{ 
    foreach (Control control in parentControl.Controls) 
    { 
     yield return control; 
     foreach(Control grandchild in GetChildControls(control)) 
     { 
      yield return grandchild; 
     } 
    } 
} 

但我停留在如何将这些树过滤到节点的位和它的孩子。如果有帮助,橙色的节点应该是以下几点:

<asp:Content ID="SystemMasterMainContentPlaceHolder" runat="server" ContentPlaceHolderID="MainContentPlaceholder"> 

回答

2

你基本上可以使用已有的方法和GetChildById()方法的组合。

private Control GetChildById(string controlId, Control parent) 
{ 
    return GetChildControls(parent).First(c => c.ID == controlId); 
} 

这将重新使用树遍历由GetChildControls完成。请注意,如果找不到控件,它将引发异常 - 如果您不需要,请使用FirstOrDefault而不是First

你可能会使用它,像这样:

GetChildControls(GetChildById("SystemMasterMainContentPlaceHolder", Page));