为什么在 Page_Load 中创建的动态控件就取不到值,Page_Init 中创建的就能?

作者:vkvi 来源:ITPOW(原创) 日期:2011-4-20

在 Page_Load 中创建的动态控件,在网页回值时,是取不到值的;而在 Page_Init 中创建的就能。为什么呢?

原因是这样的,ASP.NET 在回值时,会把 ViewState 赋给该控件,然后再来操作这个元素。大概是这样的:

第一步,ASP.NET 构造一个控件,这个控件的值都是默认的。

第二步,ASP.NET 会把 ViewState 的值,或者 POST 的值,赋给这个控件,这个控件的值就变了,变成客户端用户改变过的值了,这时我们就可以用什么 TextBox1.Text 这样的代码取客户端提交的值了,而不必用 Request.Form(虽然用 Request.Form 也可以)。

问题就是这个第二步是在 Page_Load 之前完成的,如果是动态控件,又是在 Page_Load 创建的,那么这个赋值给这个控件的动作就不会成功,因为控件都不存在,怎么能赋成功呢(当然也不会报错),所以后面就取不到值了。

而若是在 Page_Init 中动态创建的,此时还没有执行赋值这个动作,后面赋值就会成功,就不会影响使用。

不止 Page_Init

有时候,我们会发现动态创建的控件放在另一个控件中,而另一控件在 Page_Init 中还没有完全准备好,其实这种情况下,可以将动态创建的控件放在 Page_InitComplete 中。

相关文章