Если у вас есть EnableViewState = true для вашего UserControl и всех элементов управления внутри него, все должно работать нормально. При включенном ViewState ASP перезапустит ваши элементы управления из ViewState после запуска Init. Это означает, что аргумент события обратной передачи (который указывает на индекс в вашем списке элементов управления) все равно найдет элемент управления в этой позиции списка. В противном случае список пуст при обратной передаче.
Однако ViewState - это работа дьявола, и он был разработан просто для того, чтобы создать иллюзию того, что вы работаете в среде с состоянием. Можно использовать его для небольших объемов данных, но обычно это не рекомендуется для шаблонных элементов управления, таких как повторители и списки, потому что вы не знаете, сколько данных будет создано во ViewState.
Если вы имеете дело со статическими или относительно статическими данными, сохраняйте их в кеше приложения и каждый раз перепривязывайте списки в Page.Init (обратите внимание, что это должно быть в Init, потому что post-init - это когда ASP перезапускается из ViewState ; если вы попадете туда первыми, вместо этого будут использованы ваши данные).
Если вы имеете дело с изменчивыми данными, у вас есть проблема, потому что данные, которые вы перепривязываете, должны быть точно такими же, как исходный запрос страницы, в противном случае события обратной передачи будут запускаться против неправильных строк. В этом случае вам нужно либо сохранить исходные данные в сеансе, либо просто сохранить список идентификаторов строк (в скрытой переменной или сеансе), и вы каждый раз воссоздаете данные для привязки по идентификаторам.
Еще лучшее решение - вообще не использовать события обратной передачи. Попробуйте превратить все ваши события в GET, которые имеют идентификатор в строке запроса. Вы все еще можете создать список, используя привязку в первый раз через страницу (как вы делаете в настоящее время), и вы даже можете получить ту же страницу с новым идентификатором.
Если вам нужно сохранить состояние на той же странице, но нужно ответить пользователю, меняющему выбор переключателя (или что-то еще), подумайте об использовании вызовов Ajax для обновления экрана. Вы также делаете это с помощью идентификатора, который вы передаете вызову Ajax.
В целом, чем больше вы отказываетесь от использования ASP с сохранением состояния, тем легче и отзывчивее становятся ваши страницы. Вы также сможете лучше перейти на MVC без сохранения состояния, если это необходимо. Вы также сэкономите много времени, потраченного на отладку непонятных проблем, потому что ViewState недоступен, когда это необходимо.
Лучший анализ ViewState, который я прочитал, находится по ссылке ниже. Если вы полностью понимаете, как это работает, вы можете продолжать использовать его без необходимости оплачивать расходы.
http://weblogs.asp.net/infinitiesloop/archive/2006/08/03/truly-understanding-viewstate.aspx