我以前也碰到过这个问题,当时我非常困惑。后来经过测试,发现只有在页面的Page_Init事件使用LoadControl()方法载入用户控件后,可以在Page_Load中读取用户控件中的值。

解决方案 »

  1.   

    to  NetColorWolf(NCW) :没错,我都觉得asp.net的事件顺序真的是有问题,在写程序中老是要纠缠与一些事件的顺序问题
      

  2.   

    TO: chnking(kent)你不要老写些这么高深的东东,就不会同那些讨厌的事件的顺序问题打交道了:)
      

  3.   

    asp.net事件是没有顺序的,如果你想控制事件顺序,只是徒劳!
      

  4.   

    when you dynamically create a control, its events will not be triggered until you add it to the control hierarchy through Controls.Add(). At that time, the system will catch up all its events to the current stage, for example, if in Page_Load, you callWebUserControl1 myWebUserControl1 = (WebUserControl1)Page.LoadControl("WebUserControl1.ascx");
    PlaceHolder1.Controls.Add(myWebUserControl1);after the last statement, the system will call myWebUserControl1's Init/LoadViewState/LoadPostData
      

  5.   

    to saucer(思归, MS .NET MVP)你说的我理解,msdn上也是这么说的,可是实际情况并不是这样的啊,PlaceHolder1.Controls.Add(myWebUserControl1) 之后,开始进入myWebUserControl1's Init/LoadViewState/LoadPostData的过程,这个过程中控件的LoadPostData过程是在控件的Page_Load过程之前的,就是说,postback的数据应该在控件的Page_Load过程之前就已经恢复到用户控件的各个控件上了,可是实际情况是在Page_Load事件中控件的值并没有得到恢复,我测试过,在控件的PreRender事件时得到了恢复.
      

  6.   

    实际上我的问题可以简单的这样描述:在用Page.LoadControl载入的用户控件中的实现了IPostBackDataHandler接口的控件,它们的PostBack的值应该是在用户控件的Page_Load事件之前(LoadPostData
    过程)就应该得到恢复了,可是实际测试结果是,它们的PostBack的值在用户控件的Page_Load事件时还没有得到恢复,而在Page_Load事件后的别的用户触发事件时(比如按钮事件)或之后得到恢复了.
      

  7.   

    form controls are special, if  you implement the control's LoadPostData, you will see the value is restored in LoadPostDatahere is something I tested (the user control is loaded in the page's Page_Load)In Page: Page_Load 
    in Control: OnInit
    in Control: LoadViewState
    in Control: hidden Value: 
    in Control: Page_Load
    hidden Value: 
    in Control: LoadPostData Begin
    in Control: hidden Value: Wed Jul 9 23:06:10 EDT 2003
    in Control: NameValueCollection Count:4
    __VIEWSTATE=dDw4NTgzNDQ5Mjk7dDw7bDxpPDE+Oz47bDx0PDtsPGk8MT47PjtsPHQ8O2w8aTwwPjs+O2w8dDxwPHA8bDxUZXN0Oz47bDw3LzkvMjAwMyAxMTowNjowNCBQTTs+Pjs+Ozs+Oz4+Oz4+Oz4+O2w8X2N0bDA7Pj4cnlC69WA90hUJ8i7RofdwOkkepQ==
    _ctl0:myhidden=Wed Jul 9 23:06:10 EDT 2003
    _ctl0:TextBox1=
    Button1=Submit
    in Control: LoadPostData End
    in Control: RaisePostDataChange
    In Page: OnPreRender 
    in Control: OnPreRender
      

  8.   

    in Control: Page_Load
    hidden Value: 
    in Control: LoadPostData BeginLoadPostData 在Page_Load之后吗?
      

  9.   

    如果真是这样的话,我的问题就可以解释了,不过这又跟msdn上的说法不一致了,msdn的说法是控件的LoadPostData 是在控件的Page_Load之前的
      

  10.   

    if you load the user controls in Page_Init, everything seems normalbut if you load the user control in Page_Load, it does seem to be a little odd
    *********************************
    user control is loaded in OnInit
    *********************************
    in Page: OnInit
    In Page: Loading controls
    in Control: OnInit
    In Page: added to Controls
    In Page: LoadViewState 
    in Control: LoadViewState
    in Control: hidden Value: 
    in Control: LoadPostData Begin
    in Control: hidden Value: Wed Jul 9 23:32:38 EDT 2003
    in Control: LoadPostData End
    In Page: OnLoad after base's Onload. 
    in Control: after base's OnLoad
    hidden Value: Wed Jul 9 23:32:38 EDT 2003
    in Control: RaisePostDataChange
    In Page: OnPreRender 
    in Control: OnPreRender
    hidden Value: Wed Jul 9 23:32:38 EDT 2003
    In Page: SavedViewState 
    in Control: SaveViewState*********************************
    User Control is loaded in OnLoad
    *********************************
    in Page: OnInit
    In Page: LoadViewState 
    In Page: OnLoad after base's Onload. 
    In Page: Loading controls
    in Control: OnInit
    in Control: LoadViewState
    in Control: hidden Value: 
    In Page: added to Controls
    in Control: after base's OnLoad
    hidden Value: 
    in Control: LoadPostData Begin
    in Control: hidden Value: Wed Jul 9 23:33:32 EDT 2003
    in Control: LoadPostData End
    in Control: RaisePostDataChange
    In Page: OnPreRender 
    in Control: OnPreRender
    hidden Value: Wed Jul 9 23:33:32 EDT 2003
    In Page: SavedViewState 
    in Control: SaveViewState
      

  11.   

    因为一般用户在做初始化工作都是在Page_Load中做的
      

  12.   

    to saucer(思归, MS .NET MVP) 还有一个问题,就是你上面列出的那么详细的事件发生的顺序过程,使用什么方法得到的?
      

  13.   

    给你找到一个答案,虽然不知道他是从哪里得出这结论来的,也许应该去查看一下MONO的源码http://groups.google.com/groups?hl=en&lr=&ie=UTF-8&oe=UTF-8&selm=%23wS0ppzIDHA.2220%40TK2MSFTNGP10.phx.gbl"
    Postback data is processed again right after Load so controls added during
    Load get a chance to process postback data (in what its called the "second
    try"). Without this any controls added at the Load event will have already
    missed their chance to process postback data. Take a look at this:Init
    LoadViewState
    Process postback data
    Load
    Process postback data 2nd trySo if you're adding your control at Init then its LoadPostData will be
    called before Load, but if you're adding it at Load, its LoadPostData will
    be called after Load.
    "是override那些OnInit/OnLoad/....函数,在里面用Response.Write得到的
      

  14.   

    如果你的用户控件的HtmlInputHidden(以下专称Hidden控件)没有关联ServerChange事件。
    那么它的Value是不会自动使用ViewState保持的。
    他的Value恢复的时候,是在ProcessPostData时做的。(使用Form来恢复)
    ProcessPostData是页面的生命周期。在Page.Load前后各执行一次。
    因为在第一次的ProcessPostData时,
    Hidden控件还没有加上,所以值不能恢复。
    而在Page.Load时,虽然用了Controls.Add,恢复Hidden的“控件生命周期”到Load
    但是,控件生命周期是不会调用ProcessPostData - IPostBackDataHandler.LoadPostData的。
    所以Hidden值也没有恢复。
    知道页面LoadRecursive完成后,
    进行第二次的ProcessPostData,
    这时Hidden控件的值才得到恢复。这我在
    http://expert.csdn.net/Expert/TopicView1.asp?id=1974290
    里已经分开几个地方说明了。
      

  15.   

    “如果你的用户控件的HtmlInputHidden(以下专称Hidden控件)没有关联ServerChange事件。
    那么它的Value是不会自动使用ViewState保持的。”
    --控件的PostBack数据跟它是否关联事件没有关系,不关联其PostBack数据依然会保持的,就如你所说,由Request.Form读取后保持的.“因为在第一次的ProcessPostData时,
    Hidden控件还没有加上,所以值不能恢复。”
    --第一次的ProcessPostData时,用户控件已经经过了OnInit方法了,用户控件已经初始化了,用户控件中包含的控件也都装载了。“控件生命周期是不会调用ProcessPostData - IPostBackDataHandler.LoadPostData的。”
    --控件的生命周期中当然要调用控件自己的ProcessPostData 过程,不调用怎么恢复postback数据哦。
      

  16.   

    “如果控件状态因回发而更改,则 LoadPostData 返回 true;否则返回 false。页框架跟踪所有返回 true 的控件并在这些控件上调用 RaisePostDataChangedEvent。更改事件(如果有)就是从该方法引发的。因此,回发数据处理分两个阶段进行——更新状态和引发更改通知。这可防止在加载回发数据过程中引发更改通知,在该过程中,更改通知可能在各控件加载回发数据之前错误地修改状态。”这是msdn中的一段话,可以看出ProcessPostData两个阶段的各自作用