8

如何在 ASP.NET PreInit 事件中获得控制权?指针为空,FindControl 方法返回空。

我正在使用母版页和内容页。内容页面的标记如下所示:

<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") 之后表仍然为空。页面的 NamingContainer 也为空。我究竟做错了什么?

更新我必须使用这个事件来创建控件。如ASP.NET 页面生命周期概述中所述,此事件应用于动态控件创建。我需要在我的表中创建一个链接列表。可能有另一种方法吗?

4

4 回答 4

5

PreInit 在控件初始化之前被触发。阅读ASP.NET 页面生命周期以获取更多详细信息。

Init
在初始化所有控件并应用任何皮肤设置后引发。单个控件的 Init 事件发生在页面的 Init 事件之前。

使用此事件来读取或初始化控件属性。

于 2010-07-01T15:26:39.593 回答
1

在 PreInit() 事件中,在那个阶段还没有创建标准(定义的)控件,因此您无法获得对任何控件的任何引用。

使用 Page_Load() 事件来创建动态控件。在此活动期间,您可以将任何动态控件添加到现有控件中。

在 Page_Load() 中创建动态控件后,使用 PreRender() 进行任何更改/更新。

就个人而言,我使用 PreInit 来定义页面范围的对象(即,数据库连接、用户会话对象)以及我执行安全身份验证检查的位置(如果未授权则重定向)。

于 2013-03-23T15:27:24.427 回答
1

Page 的 PreInit 事件在控件初始化之前触发,因此控件还不存在。您必须在稍后的事件中访问该控件,例如 Page 的 Load 事件。请参阅http://msdn.microsoft.com/en-us/library/ms178472.aspx

于 2014-05-19T18:45:59.357 回答
0

如问题和答案中所述,或没有母版页的页面之间存在差异。

如果没有母版页,您可以在 PreInit 事件中创建控件并将它们添加到现有控件,但使用母版页您无法访问现有控件,如此处的答案中所述,因此您必须在以后的事件中创建动态控件像 Init 事件。

由于您使用的是母版页,您应该在稍后的事件(如 Init 事件)中创建动态控件,或尝试 Valio 提供的选项。

于 2019-01-03T13:18:50.697 回答