自从我不得不遍历树已经有一段时间了,我想要一些输入。下面是一个示例树:
这棵树是我的ASP.NET页面。此页由2个母版页和内容页组成。我想要做的是找到作为我的第二个母版页的主要内容的控件,然后将所有控件放在一个平面数据结构中,比如一个列表。
因此,鉴于Orange节点是第二母版页的主要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">
发布于 2013-03-12 17:33:54
您基本上可以使用已有方法和GetChildById()
方法的组合。
private Control GetChildById(string controlId, Control parent)
{
return GetChildControls(parent).First(c => c.ID == controlId);
}
这重用了由GetChildControls
完成的树遍历。请注意,如果找不到控件,它将抛出异常-如果您不想这样做,请使用FirstOrDefault
而不是First
。
你可以像这样使用它:
GetChildControls(GetChildById("SystemMasterMainContentPlaceHolder", Page));
https://stackoverflow.com/questions/15367917
复制相似问题