Как изменить дочерние элементы управления в составном серверном элементе управления при обратной передаче - PullRequest
3 голосов
/ 06 декабря 2009

У меня есть составной элемент управления веб-формы ASP.NET, назовем его элементом управления A, который содержит дочерний составной элемент управления, который я назову элементом управления B. Дочерние элементы управления элемента управления B зависят от свойства элемента управления A.

При начальной загрузке я устанавливаю этот параметр в OnLoad элемента управления A, и все отлично работает, когда элемент управления B правильно настраивает его дочерние элементы управления в CreateChildControls.

Однако, когда я хочу изменить этот параметр с помощью SelectedIndexChanged в раскрывающемся списке элемента управления A, кажется, что обработчик событий обрабатывается слишком поздно в жизненном цикле для элемента управления B, чтобы подобрать измененное значение. Предположительно это происходит потому, что метод управления B CreateChildControls уже был вызван.

Как я могу заставить элемент управления B обновлять его дочерние элементы управления таким образом, чтобы они могли затем проходить свой обычный жизненный цикл, загружая при необходимости состояние представления?

Просто для ясности, когда параметр элемента A изменяется, дочерние элементы управления элемента B могут иметь некоторые оставшиеся, некоторые должны быть удалены, а некоторые должны быть добавлены, следовательно, для оставшихся они еще нужно загрузить состояние.

1 Ответ

4 голосов
/ 06 декабря 2009

Событие SelectedIndexChanged будет обрабатываться после Page_Load (OnLoad) страницы и элемента управления A. И вы правы, полагая, что ваша страница уже перестроена, а представление состояния восстановлено обратно к элементам управления к тому времени, когда вы получите этот обработчик событий - как и должно быть, какой смысл обрабатывать события, когда страница / элемент управления еще не перестроены?

Три простых решения, которые я бы предложил для этого:

  • не имеет элемента управления B, проверяющего его родительское значение и затем строящего себя соответствующим образом, это немного против паттерна. Вместо этого, у элемента управления A загружается правильная версия элемента управления B в зависимости от значения раскрывающегося списка. IOW делает контроль A ответственным за то, что загружено, а не контроль B. Контроль B должен быть тупым и не заботиться о том, кто его родитель. Если ему нужно взаимодействовать с его родителем, он должен сделать это через интерфейс.

  • если вы только скрываете и показываете поля, просто держите их все под контролем B и скрывайте те, которые не должны отображаться. Большинство элементов управления не будут отображать HTML в выходной поток, если вы установите для свойства visible значение false, поэтому на стороне клиента будет минимальное влияние при отправке страницы обратно клиенту

  • имеет контроль А перестраивать части себя в зависимости от выбранного значения. Он может содержать DIV, вы делаете div.Controls.Clear (), а затем добавляете обратно правильные элементы управления. Это будет хорошо сделать в событии SelectedIndexChanged, так как вам все равно, какие элементы управления уже существуют и каковы их значения (если вам не безразличны некоторые из существующих элементов управления, то довольно просто не очистить их из коллекция элементов управления и добавление новых элементов управления вокруг них)

У каждого из этих трех методов есть свои плюсы и минусы, и то, что вы можете в итоге сделать, является смесью трех. Существует также другой возможный метод, в котором вы используете PageParser и его метод GetCompiledPageInstance, чтобы получить IHttpHandler, который вы используете для регенерации страницы, но это более сложный способ, чтобы покрыть небольшим ответом.

...