如何在ASP.NET PreInit事件中获得控制权?指针为null,FindControl方法返回null。
我正在使用主页和内容页面。 内容页面的标记如下所示:
<asp:Content ID="Content2" ContentPlaceHolderID="ContentBody" runat="server">
<asp:Table ID="Table1" runat="server" Width="100%">
.....
</asp:Table>
</asp:Content>
这样的代码:
private void Page_PreInit(object sender, EventArgs e)
{
Control table = this.FindControl("Table1");
//table is null here
}
因此,在this.FindControl(“Table1”)之后,表仍然为null。该页面的NamingContainer也为null。我做错了什么?
更新我必须使用此事件来创建控件。如ASP.NET Page Life Cycle Overview中所述,此事件应用于动态控件创建。我需要在表格中创建一个链接列表。可能还有另一种方法吗?
答案 0 :(得分:5)
在初始化控件之前触发PreInit。请阅读ASP.NET Page Life Cycle以获取更多详细信息。
初始
在所有控件初始化和任何皮肤后引发 设置已应用。初始 发生个别控制事件 在页面的Init事件之前。使用此事件进行阅读或初始化 控制属性。
答案 1 :(得分:1)
在PreInit()事件中,尚未在该阶段创建标准(已定义)控件,因此您无法获得对任何控件的任何引用。
使用Page_Load()事件创建动态控件。在此活动期间,您可以将任何动态控件添加到现有控件中。
在Page_Load()中创建动态控件后,使用PreRender()进行任何更改/更新。
就个人而言,我使用PreInit来定义页面范围的对象(即数据库连接,用户会话对象)以及我执行安全认证检查(如果未经授权则重定向)的地方。
答案 2 :(得分:1)
在初始化控件之前触发了Page的PreInit事件,因此控件尚不存在。您必须在以后的事件中访问该控件,例如Page的Load事件。请参阅http://msdn.microsoft.com/en-us/library/ms178472.aspx。
答案 3 :(得分:0)
有和没有母版页的页面之间都有区别,如HERE中所述。
如果没有母版页,则可以在PreInit事件中创建控件并将其添加到现有控件中,但是如此处答案所示,有了母版页,您仍无法访问现有控件,因此您必须在其中创建动态控件之后的事件,例如Init事件。
由于使用的是母版页,因此应在以后的事件(如Init事件)中创建动态控件,或尝试Valio在此提供的选项。