控件在哪个阶段添加到页面 (.Net) - 引用母版页控件

本文关键字:控件 Net 母版页 引用 添加 段添加 | 更新日期: 2023-09-27 18:31:07

我有 Main.Master,一个内部母版页 Inner.Master 和 abc.aspx。在Inner.Master中,我有一个下拉列表ddlChildren,我在Inner.Master页面加载时填充它。

我想,在加载页面abc.aspx时,我可以从其母版页Inner.Master访问ddlChildren:

int x = Int32.Parse(((DropDownList)this.Parent.FindControl("ddlChildren")).SelectedValue);

我在 abc.aspx 的页面加载上执行此操作。问题是找不到此控件。我认为发生这种情况是因为控件甚至尚未在 Inner.Master 中加载,因为当我这样做时:

this.Parent.Controls.Count

在调试时,我只有 1 个控件 Inner.Master,它的 Main.Master。

然后我试着在PreRender上调用ddlChildren,但同样的事情发生了。

根据 http://msdn.microsoft.com/en-us/library/ms178472.aspx,控件在预渲染时加载,但内部主控的预渲染称为 AFTER abc.aspx。那么我可以在另一个页面阶段执行此操作吗?

还是我完全偏离了轨道?

控件在哪个阶段添加到页面 (.Net) - 引用母版页控件

生命周期

的可视细分,包括母版页。

好的,我认为这里还有更多的事情要做。

首先FindControl不是递归的,除非你要找的是所讨论对象的直接子级,否则你不会找到它。

你需要一个这样的函数(没有测试过,但我以前写过类似的东西):

private WebControl FindControlRecursive(WebControl parentControl, string controlId)
{
    if( !parentControl.Controls.Any())
        return null;
    var foundControl = parentControl.FindControl(controlId);
    if(foundControl == null)
    {
        foreach(child in parentControl.Controls)
        {
            var foundChild = FindControlRecursive(child, controlId);
            if(foundChild != null)
                return foundChild;    
        }
    }
    return foundControl;
}

其次,您假设页面的Parent是母版页。这可能不是真的。请尝试在此处详细介绍Page.MasterPage

所以,最后,试试这个:

var dropDown = (DropDownList)FindControlRecursive(Page.MasterPage, "ddlChildren");

还有一件事。通常最好考虑一下,如果您发现自己访问的控件存在于当前 Page 范围之上的级别中,您可能需要重新考虑您的设计。