Прямо сейчас происходит "кошка Шредингера".
Сначала немного информации о моей настройке. Большая часть этого, вероятно, не имеет значения, но, для полноты, я предоставляю это. Я использую .NET 4.6.2 WebForm (.ASPX страницу) с MasterPage. MasterPage содержится в другой MasterPage. В WebForm у меня есть UpdatePanel (UpdateMode = Условный). Внутри UpdatePanel у меня есть другая UpdatePanel (также с UpdateMode = Conditional). Внутри этой внутренней панели обновления у меня есть повторитель и кнопка. Повторитель привязывается во время события Page_Load WebForm и внутри блока! Page.IsPostBack. Кнопка имеет событие Click, которое обращается к коллекции Repeater.Items.
По какой-то причине при нажатии кнопки в PostBack, если к коллекции Repeater.Controls обращаются в любое время до Page_Load, коллекция очищается. Я попытался выяснить, в какой именно момент заполнение Коллекции происходит в PostBack, но, похоже, это происходит где-то внутри файла System.Web.dll, и я не могу отлаживать его внутри (несвязанный, но расстраивающий выпуск).
Чтобы смоделировать это, я сделал следующее:
1) Добавил пустой обработчик для события Repeater.ItemCreated и поместил точку останова в это событие
2) Поместите точку останова в событие Page_Init WebForm
3) Добавлены часы отладчика для метода Repeater.HasControls ()
Когда страница загружается впервые и достигается точка останова Page_Init, метод Repeater.HasControls () правильно оценивается как ложный. Во время события Page_Load, поскольку это не PostBack, Repeater привязан, а события Repeater.ItemCreated и Repeater.ItemDataBound запускаются один раз для каждой строки, созданной в Repeater.
Когда кнопка нажата, происходит PostBack. Когда достигается точка останова Page_Init, метод Repeater.HasControls () снова оценивается как ложный. Если я больше ничего не сделаю, следующее событие, которое вызывается, - это событие Repeater.ItemCreated, по одному разу для каждой строки - на этот раз событие Repeater.ItemDataBound не запускается, что является нормальным, поскольку Repeater не восстанавливается в PostBack. (и, в этом отношении, мы так или иначе не достигли события Page_Load). Затем оценивается событие «Нажатие кнопки», и оно корректно проходит по коллекции Repeater.Items. Все хорошо.
Однако , если во время этого события Button Click PostBack Page Init вместо простой оценки метода Repeater.HasControls () я получаю доступ к коллекции Repeater.Controls - IE, я помещаю блок кода, который проверяет Repeater.Controls, я ставлю часы на Repeater.Controls, или я просто делаю быстрые часы на Repeater.Controls, событие Repeater.ItemCreated больше не запускает . Когда событие «Нажатие кнопки» оценивается и оно пытается выполнить цикл по коллекции Repeater.Items, коллекция теперь пуста.
Я перепробовал все, что мог придумать, чтобы выяснить, почему это происходит, и не добился успеха. Если у кого-нибудь есть какие-либо предложения о том, что я могу проверить, в каких местах я могу искать или что-то в этом роде, я хотел бы получить совет.
Заранее спасибо!