今天在动态加载(LoadControl)ascx时,发现了一个问题,搞了半天,才发现问题的所在,不知道算不算是微软设计中的一个bug。
问题是这样的:webform上有一个placeholder,还有一个button,button的click事件是这样的
private void Button1_Click(object sender, System.EventArgs e)
{
Control ctl = LoadControl("WebUserControl1.ascx");
placeholder1.Controls.Add(ctl);
}
WebUserControl1.ascx上有一个label,然后WebUserControl1.ascx中的Page_Load事件是这样的
private void Page_Load(object sender, System.EventArgs e)
{
if (!IsPostBack)
{
Label1.Text = "hello world!";
}
}
看上去没什么问题,点击button后placeholder加载一个控件,这个控件给自己的一个label置一个初始值。但事实,并不是我们想上去的那样……
程序运行后,点击button,自定义控件正常加载,但是label上并不是我们想要的"hello world!",而是默认的"label",为什么???
经过研究,我发现了这个一个事实,这个自定义控件被加载时,其IsPostBack已经是true了(虽然它才第一次被加载),而不是我们想象中的false。
我的想法本来是这样的,点击button时,主form上的ispostback是true,而自定义控件的是false,但事实并不是我们有时所想象的。
所以,结论是,自定义控件中,在!IsPostBack 框框中来初始化值是不正确的(很多介绍asp.net的书籍中都在!IsPostBack中初始化值,但这仅对webform有效),会产生一些意想不到的后果。 所以,建议初始化工作可以放在oninit事件中。