Динамические элементы управления на основе пользовательского обращения

StackOverflow https://stackoverflow.com/questions/2376001

Вопрос

Предположим, у меня есть TreeView, где каждый Treenode содержит идентификатор для другого набора пользовательских элементов управления. Когда пользователь нажимает узел, эти элементы управления должны быть загружены на страницу. Поскольку я понимаю жизненный цикл ASP страницы, динамические элементы управления должны быть добавлены на этапе инициализации, а события отспуска будут пожалены позже.

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


Редактировать: я попробовал предложение от Arronls:

То, что я сделал, было добавить значение узла к массиву сеанса и использовать это, когда я делаю init, чтобы выбрать, какие элементы формы для загрузки на элементы управления элементами управления заполнителем. На событии TreeView Click я обновляю узел в массиве сеанса, очистите старые элементы формы в заполнителе, и добавьте новые элементы формы в элементы управления. Когда страница загружается снова, она теперь должна найти узел в момент инициализации, поэтому проблемы с просмотром будут обходными.

Теперь я еще не проверил это, но был другой Подобный пост Это говорит о проблемах, которые могут привести к просмотру. Они предлагают решение, которое опросы запроса [] часть контекста (в их случае Dropbox) в управлении init, вручную обрабатывающую в эксплуатацию некоторые из функций обратной связи.

Мой новый вопрос Как добраться до выбранного узла в TreeView с помощью массива запроса?

Это было полезно?

Решение

Следствием не загрузки элементов управления в INIT заключается в том, что если существуют изменения в свойствах в состоянии просмотра, они не будут сохраняться на контроль. Например, если в первом запросе страницы вы динамически создаете элементы управления в init, а затем на спине «Опублику» вы снова создаете их в init, затем после init, любые значения свойств в ViewState применяются к элементу управления.

Поэтому, если вы создали контроль изначально в событии TreeView Click, я догадаю, что все должно быть в порядке, потому что пока не накапливается, чтобы применить к контролю, поскольку он был только что создан. Тем не менее, я не уверен, приведет к ли этому контролю не сохранять ViewState. Вам придется экспериментировать с этим.

После последующих отступлений после первого, теперь вам нужно будет создать элемент управления в init для накопленного viestate, который будет применяться к нему, поэтому вам понадобится какой-то механизм «запомнить», что вы создали контроль один раз, изначально в ответ на Нажмите «Событие», а затем в последующих отложениях создайте контроль снова в init. Вы должны воссоздать контроль на каждый запрос, если вы этого не знали.

Таким образом, вопрос становится тем, насколько важно представляет собой ViewState для контроля.

Редактировать: Я также добавлю, что я не совсем уверен, будет ли другим следствием, кроме того, как это влияет на ViewState.

Другие советы

Это может не быть ответом на ваш прямой вопрос, но так как я никогда не нашел ответ, вот обходной путь, который я использовал.

Подход, который я всегда использовал при работе с TreeView, заключается в том, чтобы объявить элементы управления на странице ASPX один раз, а затем на событии CLICK, свяжите элементы управления данными на основе идентификатора. При необходимости вы можете изначально установить видимость для видимой = «ложь» и изменить его при связании. Этот подход работает красиво, потому что это позволяет избежать только загадочной передачи.

Если вы не против отказаться от TreeViews, Вложенный повторитель Подход тоже работает хорошо.

Просто выбросил другую мысль, надеясь получить еще более отзывы ...

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

Похоже, плохая идея, поэтому я надеюсь на что-то еще.

Если я правильно понял, вы хотите, чтобы другой контент показан для каждого узла дерева. Я предполагаю, что есть Thereview слева и некоторую зону содержания в середине.

С точки зрения UI, я обычно решаю это, используя MultiView, где каждый индивидуальный вид - отделенный usercontrol с необходимым содержанием. Событие Treenode Click просто меняет MultiView ActiveIndex, содержащийся в свойство Node VALUE (идентификатор хранится в PatteriTem), и вы просто выключаете область содержимого.

Как правило, даже если узлы деревьев динамически генерируются, от данных, например, там будет только конечное количество «узел View» UserControls, которые вам нужно определить.

Примечание. Будьте осторожны при использовании элемента управления MultiView, так как все представленные представления загружены во время жизненного цикла страниц, поэтому не помещайте никаких «тяжелых подъемов» в страницу на странице и т. Д.

Это может помочь вспомнить, что идентификатор выбранного узла передается как значение формы, которое всегда доступно из Request.Form Сбор, даже во время события init. Ключ будет что-то вроде ctl00_Content1_TreeView1_SelectedNode. Отказ Однако только этот идентификатор, вероятно, не получит вам ценность, которую вам нужно, так что вы хотели бы посмотреть на Request.Form["__EVENTARGUMENT"] а также использовать Request.Form["__EVENTTARGET"] Чтобы убедиться, что это было действительно TreeView, который вызвал поступление.

Более чем вероятность необходимой вами информации может быть вытащена из коллекции формы. Это просто вопрос установки точки останова и изучения ценностей. Этот вид кода всегда чувствует себя ужасно взлом, но в этом случае вы просто не можете дождаться, когда мероприятие Control Control Control необходимо обрабатывать, когда вам нужно использовать значения, представленные в форме, чтобы сделать что-то на странице_инит. Просто не бойся смотреть на значения формы вместо того, чтобы ждать .NET упаковывать его все хорошо с сильно напечатанными свойствами. К тому времени будет слишком поздно.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top