控件在哪个阶段添加到页面 (.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。那么我可以在另一个页面阶段执行此操作吗?
还是我完全偏离了轨道?
生命周期
的可视细分,包括母版页。
好的,我认为这里还有更多的事情要做。
首先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 范围之上的级别中,您可能需要重新考虑您的设计。