2013-12-10 3 views
1

Все элементы управления находятся в одной панели обновлений.UpdatePanel - перемещение элемента управления в DOM приводит к сбросу таких элементов управления в исходное состояние после частичной обратной передачи

На начальной загрузки страницы, я двигаюсь управления в DOM, как, например:

DIV_Child.Parent.Controls.Remove(DIV_Child) 'Remove from original parent' 
DIV_NewParent.Controls.Add(DIV_Child) 

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

DIV_Child.Style("position") = "absolute" 
DIV_Child.style("background-color") = "black" 
'etc. 

Когда происходит частичный постбэк, DIV_Child возвращается в исходное состояние: непоколебим и без стилей.

  • Эта проблема возникает только для тех элементов управления, которые перемещаются внутри DOM. Если я удалю те строки, которые перемещают элементы управления, элементы управления сохраняют стиль и DOM-позиционирование между частичными обратными передачами.

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

ответ

2

Чтобы программно добавить или удалить элементы управления внутри UpdatePanel's ContentTemplate, необходимо использовать свойство ContentTemplateContainer.

В вашем случае вы должны добавить как содержащий DIV (в родительский DIV_Child и DIV_NewParent), а также DIV_Child в коллекцию ContentTemplateContainer контролирует в PageLoad: -

upd.ContentTemplateContainer.Controls.Add(DIV_OldParent); 
    upd.ContentTemplateContainer.Controls.Add(DIV_NewParent); 

    upd.ContentTemplateContainer.Controls.Add(DIV_Child); 

проблема возникает потому, что разметка содержит DIV в его оригинальное положение и стиль, а также потому, что он отличается от того, что представлено в частичной обратной передаче, UpdatePanel возвращает его как изменение (упрощенное объяснение).

Пожалуйста, попробуйте.

Обычно я рекомендую использовать UpdatePanel для чего-то быстрого и грязного, но для лучшей производительности вместо этого используйте jQuery Ajax и серверный HttpHandler. Хотя это (немного) больше работы, это дает вам большую гибкость, и вам гарантировано, что ничто не будет мешать разделу DOM, который не находится внутри UpdatePanel.

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

+0

sh1rts, я работаю, чтобы понять ваш ответ здесь. Я сделал то, что вы упомянули в моей функции загрузки страницы. Эти элементы управления действительно сохраняют свой стиль между частичными обратными передачами сейчас, но теперь они являются desdendents самой панели обновлений (отображается как div). Я пытаюсь переместить эти элементы управления из точки A на панели обновления, чтобы определить B на панели обновления. Какие-нибудь советы? –

+0

Вам еще нужно добавить «DIV_Child» в контейнер, который вы хотели, например, DIV_NewParent, прежде чем добавлять все в ContentTemplateContainer. – sh1rts

+0

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