已经有一段时间了,因为我不得不进行树遍历并想要一些输入。这是一个示例树:
树是我的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">
答案 0 :(得分:2)
您基本上可以使用已有方法和GetChildById()
方法的组合。
private Control GetChildById(string controlId, Control parent)
{
return GetChildControls(parent).First(c => c.ID == controlId);
}
这将重用GetChildControls
完成的树遍历。请注意,如果找不到控件,它将抛出异常 - 如果您不想这样做,请使用FirstOrDefault
代替First
。
您可以像这样使用它:
GetChildControls(GetChildById("SystemMasterMainContentPlaceHolder", Page));