4

自从我不得不进行树遍历并想要一些输入以来已经有一段时间了。这是一个示例树:

树

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

1 回答 1

2

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

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

这将重用由 完成的树遍历GetChildControls。请注意,如果找不到控件,它将引发异常 - 如果您不希望这样,请使用FirstOrDefault代替First.

您可能会像这样使用它:

GetChildControls(GetChildById("SystemMasterMainContentPlaceHolder", Page));
于 2013-03-12T17:33:54.327 回答