Если вы удалите вызов функции foo () из OnLoad (), я думаю, код начнет работать.
Причина этого связана с порядком событий в жизненном цикле страницы. Чтобы элемент управления мог вызывать события, он должен быть создан до того, как произойдут события ProcessPostData (), RaiseChangedEvents () и RaisePostBackEvents () (графическое представление жизненного цикла страницы см. http://www.eggheadcafe.com/articles/o_aspNet_Page_LifeCycle.jpg) Эти события возникают после OnInit (), но до OnLoad ()
Поскольку ваш код стоит в данный момент, вызывая foo () в OnLoad (), вы уничтожаете экземпляр, созданный при вызове foo () в OnInit (), и поэтому, когда вызывается событие, элемент управления, который его вызвал, больше не существует. следовательно, сообщение «Ссылка на объект не установлена на экземпляр».