2010-03-04 3 views
4

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

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


Edit: Я попытался предложение от ArronLS:

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

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

Мой новый вопрос: Как получить доступ к выбранному узлу в древовидной структуре с помощью массива Request?

ответ

0

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

Итак, если вы создали элемент управления изначально в событии щелчка древовидной формы, я бы предположил, что это должно быть хорошо, потому что еще нет какого-либо накопителя, который будет применяться к элементу управления, поскольку он был только что создан. Тем не менее, я не уверен, приведет ли это к тому, что элемент управления не сохранит статус viewstate. Вам придется поэкспериментировать с этим.

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

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

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

+0

Спасибо, я попробую. Подводя итог тому, что я думаю, вы говорите: первый раз, когда узел щелкнут, загрузите его через событие postback и каким-то образом сохраните конфигурацию. Затем в последующих загрузках postbacks/page загрузите сохраненный узел в функцию init. – tbischel

1

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

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

Если вы не против отказа от древовидной структуры, то подход nested repeater работает хорошо.

+0

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

0

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

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

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

0

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

С точки зрения пользовательского интерфейса я обычно решаю это с помощью MultiView, где каждый отдельный вид представляет собой отдельный пользовательский контроль с требуемым контентом. Событие нажатия treenode просто изменяет MultiView ActiveIndex, содержащиеся в свойстве свойства Node (ID хранится в DataItem), и вы просто выключаете область содержимого.

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

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

+0

Хороший учебник, использующий multiviews динамически. Я должен будет проверить это для проблем в представлении. http://visualstudiomagazine.com/articles/2009/10/22/generate-complex-pages-with-multiview.aspx – tbischel

0

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

Скорее всего, необходимую информацию можно извлечь из коллекции Form. Это просто вопрос установления точки останова и изучения ценностей. Такой код всегда чувствует себя ужасно взломанным, но в этом случае вы просто не можете дождаться, когда событие управления TreeView будет обработано, когда вам нужно использовать значения, представленные в форме, чтобы что-то сделать во время Page_Init. Только не бойтесь смотреть на значения формы, а не ждать, пока .NET упакует все хорошо с сильно типизированными свойствами. К тому времени будет уже слишком поздно.