我正在维护一些较旧的C#代码,这些代码依赖于回发来保存数据。我很难理解生命周期中发生的事情。
似乎RaisePostBackEvent
在任何表单控件onLoad
事件运行之前正在运行。
例如,我在页面上有一个下拉列表和一个文本框。
下拉列表定义了以下处理程序
public class MyPage
{
private void Page_Init(object sender, EventArgs e)
{
ddlDemo.SelectedIndexChanged += new EventHandler(ddlDemo_SelectedIndexChanged);
}
}
文本框控件在onLoad事件中执行一些操作
public class MyTextBox: System.Web.UI.WebControls.TextBox
...
protected override void OnLoad(EventArgs e)
{
base.OnLoad(e);
//do some stuff
}
...
}
我的问题是dropdownlist处理程序在MyTextBox OnLoad事件之前运行。
根据MSDN和CSharpcorner所描述的ASP.NET生命周期,(据我所知),事件的顺序应为
我正在经历的是
有人可以向我解释为什么处理程序在任何控件OnLoad运行之前运行?
答案 0 :(得分:1)
控件不会参与页面生命周期直到它被添加到页面的控件树中。一旦将它添加到Page的控制树中,它就会“赶上”(参见下面有关动态控件的文章)。您的控件是否已添加到页面的控件树中?你怎么知道的? (你没有发布相关代码,所以我不能确定。)
其次,阅读并理解这两篇文章,一般会对你有很大的帮助: Dynamic Controls Viewstate
顺便说一句,我在ASP.NET中生锈了但是当我还是初学者(我基本上还是这样)时,我的大部分问题都归结为以下两种情况之一:误解了视图状态或误解了控件如何参与页面生命周期。这就是我将以下两篇文章联系起来的原因,这两篇文章是我在这些主题上发现的最佳参考资料。
答案 1 :(得分:1)
我的ASP.Net生锈了。你可以尝试这个,移动一行:
ddlDemo.SelectedIndexChanged += new EventHandler(ddlDemo_SelectedIndexChanged);
到Page_Load
事件。这应该可以解决您的问题。
为什么你有{?1}}事件的特殊原因? Page_Init
会在生命周期的早期和Page_Init
事件之前触发。
答案 2 :(得分:0)
终于找到了问题。
ddlDemo.Load += new EventHandler(ddlDemo_SelectedIndexChanged);
在调试我想到的代码时,我正在查看SelectedIndexChanged
事件。
这应该是(它看起来像是在某一点,但这段代码已有几年了)
ddlDemo.SelectedIndexChanged += new EventHandler(ddlDemo_SelectedIndexChanged);