4

ツリートラバーサルをしなければならなかったので、しばらく時間が経ちました。いくつかの入力が必要です。サンプル ツリーは次のとおりです。

木

ツリーは私の ASP.NET ページです。このページは、2 つのマスター ページとコンテンツ ページで構成されています。私がやりたいことは、2 番目のマスター ページのプライマリ コンテンツであるコントロールを見つけて、すべてのコントロールをリストなどのフラットなデータ構造に配置することです。

オレンジ色のノードが 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 に答える