ASP.NET Viewstate/Postbackdata control "catchup"
===

Hopefully this is my last question about this subject! :)

  I am completely puzzled by some people's claims about ASP.NET's "playing catchup" mechanism when it comes to custom usercontrol/webcontrol. What is said is that once you add a control, be it user control or webcontrol into the parent's ControlCollection using the Add() method, the ControlCollection will call all the events from the beginning of the page cycle up to the current point of the page cycle on the newly added control. It is also said that the view state will be restored during this "catchup" phase, even if you did not add the custom control on Init(). I have a situation where there is no way other than to add a usercontrol on OnLoad of page. 
  Please look/run the example below. Put a breakpoint into the usercontrol's onload method.
First time when you click on node "1" everything works as expected. When you click node "2", the onload of the usercontrol properly assigns the value "2" to the textbox, but then the postbackdata is updated sometime after onload and the textbox is overwritted with "1" again. 
In the onprerender event of the usercontrol you can see that the value of textbox is always "1". 

1) How come the postbackdata is being updated after the onload event in the usercontrol? 
2) Wasnt the "control catchup" mechanism suppose to load viewstate/postbackdata already before onload of usercontrol hit?
3) How can I accomplish what I am trying to do here? 

I really appreciate if someone can help me with this, since this is something I stumbled many times on and have found no clean way to handle.

Here is the page:

    <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="TestPage.aspx.cs" Inherits="UserControlViewStateTesting.TestPage" %>
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head runat="server">
        <title></title>
        <script type="text/C#" runat="server">    
            protected override void OnLoad(EventArgs e)
            {
                base.OnLoad(e);
                if (null != treeView.SelectedNode)
                {
                    UserControlViewStateTesting.MyUserControl control = LoadControl("MyUserControl.ascx") as UserControlViewStateTesting.MyUserControl;
                    control.Number = treeView.SelectedNode.Text;
                    ContentBody.Controls.Add(control);
    
                }
            }
        </script>
    </head>
    <body>
        <form id="form1" runat="server">
        <div>
            <asp:TreeView ID="treeView" runat="server">
                <Nodes>
                    <asp:TreeNode Text="1" Value="1" />
                    <asp:TreeNode Text="2" Value="2" />
                    <asp:TreeNode Text="3" Value="3" />
                </Nodes>
            </asp:TreeView>        
        </div>
        <div> 
            <asp:Panel ID="ContentBody" runat="server" />
        </div>        
        </form>
    </body>
    </html>


  Here is the MyUserControl.ascx:

    <%@ Control Language="C#" AutoEventWireup="true" CodeBehind="MyUserControl.ascx.cs" Inherits="UserControlViewStateTesting.MyUserControl" %>
    <script type="text/C#" runat="server">
      
        protected void Page_Load(object sender, EventArgs e)
        {
            if (Convert.ToString(ViewState["PostBack"]) != Number)
            {
                Name.Text = Number;
                ViewState["PostBack"] = Number;
            }
        }

        protected override void OnPreRender(EventArgs e)
        {
            string value = Name.Text; //always "1"!!?
        }
    </script>
    <asp:Panel runat="server">
        <asp:TextBox ID="Name" runat="server" />
    </asp:Panel>
     
  Here is the MyUserControl.ascx.cs:

    public partial class MyUserControl :System.Web.UI.UserControl
    {
        public string Number { get; set; }
    }  
