If you access the Controls property of GridView on postback before OnLoad phase of page's lifecycle, rows are not populated from the ViewState.
Cause: CompositeDataBoundControl calls EnsureChildControls() method in Controls property getter. This marks the control with ChildControlsCreated=true even in case that no control is actually created by CreateChildControls() method. Because child Table of GridView is not created, but GridView is marked as ChildControlsCreated=true, child Table is not created even in subsequent calls of EnsureChildControls() method later in page's processing. This child Table of GridView is responsible for restoring rows on postback, so they are not populated in OnLoad phase.
Microsoft .NET Framework Version:2.0.50727.42; ASP.NET Version:2.0.50727.210