0

ページ上のすべてのコントロールのコレクション (Page.Controlsおよびそれらのコントロールの子とその子の子など) を反復処理する場合、コントロールがページのマスター ページからのものかどうかをどのように判断できますか?

以下は機能しているようですが、少し汚れているように感じます。この情報を取得するためのより良い方法はありますか?

更新: 申し訳ありませんが、一部のコードを以前に見逃していました。

List<Control> allControls = GetAllControls(this.Page)
foreach (Control c in allControls)
{
       bool isFromMaster = c.NamingContainer.TemplateControl.GetType().BaseType.BaseType == typeof(MasterPage);
}

GetAllControlsページ上のすべてのコントロールを再帰的に取得する場所

ありがとう

4

3 に答える 3

1

への参照が与えられると、プロパティControlを再帰的に見ることができます。Parent

bool IsFromMasterPage(Control control)
{
    while(control.Parent != null)
    {
        if (control.Parent is MasterPage) return true;
        control = control.Parent;
    }
    return false;
}
于 2012-09-14T15:08:58.080 に答える
0

現在のページのPage.Controls コントロールのみを含む

MasterPage コントロールを確認する場合は、次を使用します。

this.Master.Controls

一方、ページで MasterPage コントロールを見つけたい場合は、次のようにします。

IEnumerable<MasterPage> masterPageControls = this.Page.Controls.OfType<MasterPage>();

ページに関連付けることができる MasterPage は 1 つだけですが、

于 2012-09-14T14:11:47.423 に答える
0

ソリューションは、コンテンツ プレース ホルダーの子を除外して、マスター ページからコントロールを通過することが判明しました (これらは、ページ自体から追加されたコントロールを提供するため)。

public static bool IsFromMasterPage(Control control)
{
    if (control.Page.Master != null)
    {
        // Get all controls on the master page, excluding those from ContentPlaceHolders
        List<Control> masterPageControls = FindControlsExcludingPlaceHolderChildren(control.Page.Master);
        bool match = masterPageControls.Contains(control);
        return match;
    }
    return false;
}    

public static List<Control> FindControlsExcludingPlaceHolderChildren(Control parent)
{
    List<Control> controls = new List<Control>();
    foreach (Control control in parent.Controls)
    {
        controls.Add(control);
        if (control.HasControls() && control.GetType() != typeof(ContentPlaceHolder))
        {
            controls.AddRange(FindControlsExcludingPlaceHolderChildren(control));
        }
    }
    return controls;
}
于 2012-09-17T11:00:34.380 に答える