динамическое управление на основе обратной передачи пользователя - PullRequest
4 голосов
/ 04 марта 2010

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

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


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

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

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

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

Ответы [ 5 ]

1 голос
/ 04 марта 2010

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

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

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

0 голосов
/ 22 февраля 2012

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

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

0 голосов
/ 22 марта 2010

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

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

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

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

0 голосов
/ 20 марта 2010

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

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

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

0 голосов
/ 04 марта 2010

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

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...