为什么不在ASP.NET页面生命周期的事件处理点初始化所有控件?

时间:2010-01-29 02:31:40

标签: asp.net page-lifecycle

我在Web部件中嵌入了用户控件。它有以下代码片段:

protected TextBox searchTextBox;
protected Button goButton;
protected Button nextButton;
protected Repeater pushpins;
protected Label currentPageLabel;

protected void goButton_Click(object sender, EventArgs e)
{
 // Do stuff
}

<asp:TextBox ID="searchTextBox" runat="server" />
<asp:Button ID="goButton" runat="server" Text="Go" OnClick="goButton_Click" />
<asp:Repeater ID="pushpins" runat="server" EnableViewState="false">
 <ItemTemplate>Blah</ItemTemplate>
</asp:Repeater>
<asp:Label ID="currentPageLabel" runat="server" />
<asp:Button ID="nextButton" runat="server" Text=" >> " OnClick="nextButton_Click" />

(没有OnLoad或CreateChildControls方法。)

如果我在goButton_Click的第一行放置一个断点,我会发现:

  • searchTextBox已初始化
  • goButton已初始化
  • nextButton NULL
  • pushpins已初始化
  • currentPageLabel NULL

为什么某些控件已初始化而其他控件未初始化?如果我想更新Text上的currentPageLabel媒体资源,如何解决此问题?

更新

我在整个页面生命周期中都放置了断点,发现nextButtoncurrentPageLabel 从未初始化。断点放在OnLoad,CreateChildControls,goButton_Click,OnPreRender,Render和OnUnload。

2 个答案:

答案 0 :(得分:0)

你是否有可能无意中获得了名为currentPageLabel和/或nextButton的局部变量?编译器很乐意允许这个......

这在从ASP.NET 1.1迁移到2.0或更高版本时尤其常见,因为设计人员定义这些控件的方式发生了变化。

答案 1 :(得分:0)

问题是所有未初始化的控件都在Repeater控件中的HeaderTemplate中。 (为了节省空间,我没有把我的所有代码都粘贴到问题中,然后就开始了。)

我把它们移出来,问题解决了。显然,HeaderTemplate中的控件由Repeater实例化,并且不遵循正常的页面生命周期。