2

我有 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

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

然后我尝试调用 ddlChildren onPreRender,但同样的情况发生了。

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

还是我完全偏离了轨道?

4

1 回答 1

1

生命周期的可视化细分,包括母版页。

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

首先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 范围之上的级别中,您可能需要重新考虑您的设计。

于 2012-04-13T18:19:33.680 回答