c# – 如何处理这个树遍历

已经有一段时间了,因为我不得不进行树遍历,并希望得到一些输入.这是一个示例树:

树是我的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">

最佳答案 您基本上可以使用已有方法和GetChildById()方法的组合.

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

这将重用GetChildControls完成的树遍历.请注意,如果找不到控件,它将抛出异常 – 如果您不想这样,请使用FirstOrDefault而不是First.

您可以像这样使用它:

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