Повторитель ItemCreated не вызывается на PostBack - PullRequest
0 голосов
/ 27 апреля 2019

Прямо сейчас происходит "кошка Шредингера".

Сначала немного информации о моей настройке. Большая часть этого, вероятно, не имеет значения, но, для полноты, я предоставляю это. Я использую .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, коллекция теперь пуста.

Я перепробовал все, что мог придумать, чтобы выяснить, почему это происходит, и не добился успеха. Если у кого-нибудь есть какие-либо предложения о том, что я могу проверить, в каких местах я могу искать или что-то в этом роде, я хотел бы получить совет.

Заранее спасибо!

...