OK, doing a little more research.
EnsureChildControls is a method of the Control class. It does a virtual call
to CreateChildControls. You override CreateChildControls, which means when
EnsureChildControls calls CreateChildControls, its your method that gets
called.
I did a look to see who in the System.Web.dll calls EnsureChildControls.
There where two that look interesting:
PreRenderRecursiveInternal method of the Control class. Most likely
called at prerender that happens after the page load.
FindControl method of the Control class. Some methods who use this are
ProcessPostData and RaisePostBackEvent methods of the Page class.
The one that looks interesting here is ProcessPostData. What this method
does is go through looking for controls using FindControl, which of course
calls EnsureChildControls, and checks for controls that implement
IPostBackDataHandler interface and calls on this interface the method
LoadPostData. LoadPostData, in the page lifecycle, gets called during the
Load Postback Data phase which is before page load, and only happens on
postback. This is documented.
If I had to guess this is the guy. But I'm guessing since you did not
provide a sample or the callstack output. Tomorrow I may give it a try and
see if I can replicate it.
But again CreateChildControls purpose is to create the contained controls.
Relying on it to happen at a certain time in the page lifecycle is probably
wrong since its not documented in the page lifecycle, and hence can be
called at anytime.
JD