如何判断控件是否来自母版页

时间:2012-09-14 14:05:39

标签: c# webforms

当遍历页面上所有控件的集合(来自Page.Controls以及那些控件的子项及其子项的子项等)时,如何判断控件是否来自Page的主页?

以下似乎有效,但感觉有点脏。有没有更好的方法来获取这些信息?

更新:抱歉,错过了之前的一些代码。

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

GetAllControls递归获取页面上的所有控件

由于

3 个答案:

答案 0 :(得分:1)

鉴于对Control的引用,您可以递归查看Parent属性:

bool IsFromMasterPage(Control control)
{
    while(control.Parent != null)
    {
        if (control.Parent is MasterPage) return true;
        control = control.Parent;
    }
    return false;
}

答案 1 :(得分:0)

Page.Controls 仅包含当前页面的控件

如果要检查MasterPage控件,请使用:

this.Master.Controls

另一方面,如果您想在页面上找到MasterPage控件:

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

虽然您只能将一个MasterPage与您的网页相关联

答案 2 :(得分: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;
}