Как получить развернутые узлы в элементе управления TreeView - PullRequest
2 голосов
/ 23 февраля 2012

В моем приложении ASP.NET Web Forms у меня есть download.aspx макет с панорамированием страницы. На левой панели у меня есть элемент управления TreeView , а на правой панели я отображаю некоторый контент, как только пользователь выбирает листовой узел .

Если пользователь ( не вошел в систему ) щелкает по конечному узлу TreeView , который требует авторизации, пользователь отправляется на компонент входа и после входа в систему он перенаправляется в download.aspx с TreeView, не расширенным .

Я бы хотел изменить это поведение, перенаправив пользователя (после входа в систему) на страницу загрузки с расширением TreeView , как и прежде, чем он / она был отправлен в компонент входа в систему.

Я не проектировал страницу и никогда не пользуюсь TreeView широко. Мое первое предположение, поскольку я не вижу никакой QueryString , это то, что расширение узла управляется JavaScript (или JScript) обработчиком , который обрабатывает onExpand событие TreeView и асинхронно выбирает подузлы из базы данных. Однако я не уверен, что это так работает.

Моя идея состоит в том, чтобы создать объект Session State Session ["downloadTVdepth"] где каждый раз, когда пользователь расширяет узел, я каким-то образом сохраняю те узлы, которые он / она достиг. Поэтому, когда происходит перенаправление с компонента входа в систему на файл downloads.aspx, код проверяет, существует ли значение Session ["downloadTVdepth"] , а eventuallty расширяет дерево.

Мой подход правильный? Как я могу получить информацию о расширенных узлах TreeView? Как я могу запустить событие onExpand без фактического расширения пользователем узла?

Ответы [ 3 ]

1 голос
/ 23 февраля 2012

Treeview имеет событие onSelectedNodeChanged, вы можете проверить его на http://msdn.microsoft.com/en-us/library/system.web.ui.webcontrols.treeview.selectednodechanged.aspx

1 голос
/ 23 февраля 2012

Как насчет установки TreeNode.NavigateUrl для каждого TreeNode, затем через URL вы можете передать пользовательский параметр.

string nodeText = ...;
string nodeId = ...;
var node = new TreeNode(nodeText, nodeId) 
   {
     NavigateUrl = String.Format("~/download.aspx?CurrentId={0}", nodeId);
   };

tree.Nodes.Add(node);

Затем в Page_Load() страницы вы можете проверить Request.QueryString["CurrentId"] value.

Если вы используете встроенную аутентификацию форм, вы можете найти полезную функцию RedirectUrl, см. эту статью для описания с примером.

0 голосов
/ 06 марта 2014

Это очень просто.Ниже вы можете увидеть мою рекурсивную версию:

//List of storage ids of expanded nodes
List<int> expandedNodeIds = new List<int>();
//call recursive fun for our tree
CollectExpandedNodes(tree.Nodes);
//recursive fun for collect expanded node ids
private void CollectExpandedNodes(TreeListNodes nodes)
{
   foreach (TreeListNode node in nodes)
   {
      if (node.Expanded) expandedNodeIds.Add(node.Id);
      if (node.HasChildren) CollectExpandedNodes(node.Nodes);
   }
}
...