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

给定对 a 的引用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 关联到您的页面

于 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 回答