Развернув узел в ASP.Net в TreeView с помощью XML-атрибута
У меня есть ASP.Net элемент управления TreeView, который я привязываю к источнику данных XML. Я хочу иметь возможность контролировать, какие узлы расширяются, а какие сворачиваются в файле определения XML. Расширенное= " не работает для меня, хотя. В следующем простом примере я хочу, чтобы узел 2 был полностью развернут.
Страница ASP...
<asp:XmlDataSource ID="oXmlDataSource" runat="server" />
<asp:TreeView ID="TreeView1" runat="server" EnableViewState="false" DataSourceID="oXmlDataSource"></TreeView>
Код Сзади...
oXmlDataSource.Data = MyXMLString;
oXmlDataSource.XPath = "/Tree/Node";
Вот XML...
<?xml version='1.0' encoding='utf-8' ?>
<Tree Text='example.aspx' Href='example.aspx'>
<Node Text='Example Node 1' Href='0800200c9a66.aspx' Expanded='false'></Node>
<Node Text='Example Node 2' Href='0800200c9a66.aspx' Expanded='true'>
<Node Text='Example Node 3' Href='0800200c9a66.aspx' Expanded='false'></Node>
<Node Text='Example Node 4' Href='0800200c9a66.aspx' Expanded='false'></Node>
<Node Text='Example Node 5' Href='0800200c9a66.aspx' Expanded='false'></Node>
<Node Text='Example Node 6' Href='0800200c9a66.aspx' Expanded='false'></Node>
</Node>
</Tree>
2 ответа:
К сожалению, вы не можете сделать это в XML. Это короткий приход контроля. Вам нужно будет заполнить TreeView XML, а затем рекурсивно обойти все узлы и развернуть нужную ветвь. Попробуйте следующее:
Добавьте OnPreRender attrobite в элемент управления TreeView...
<asp:XmlDataSource ID="oXmlDataSource" runat="server" /> <asp:TreeView ID="TreeView1" runat="server" EnableViewState="false" DataSourceID="oXmlDataSource" OnPreRender="TreeView1_PreRender"></TreeView>
Затем добавьте следующее в код (я рекомендую добавить некоторые тесты и добавить try / catches)...
protected void TreeView1_PreRender(object sender, EventArgs e) { SelectCurrentPageTreeNode(TreeView1); } private void SelectCurrentPageTreeNode(TreeView tvTreeView) { tvTreeView.CollapseAll(); if (Request.Url.PathAndQuery != null) { ExpandTreeViewNodes(tvTreeView, Request.Url.PathAndQuery); } } private TreeNode ExpandTreeViewNodes(TreeView tvTreeView, string sPathAndQuery) { if (tvTreeView != null) { if (!string.IsNullOrEmpty(sPathAndQuery)) { sPathAndQuery = sPathAndQuery.ToLower(); { TreeNode tnWorkTreeNode = null; for (int iLoop = 0; iLoop < tvTreeView.Nodes.Count; iLoop++) { tvTreeView.Nodes[iLoop].Expand(); tvTreeView.Nodes[iLoop].Selected = true; if (tvTreeView.Nodes[iLoop].NavigateUrl.ToLower() == sPathAndQuery) { return (tvTreeView.Nodes[iLoop]); } else { tnWorkTreeNode = ExpandTreeViewNodesR(tvTreeView.Nodes[iLoop], sPathAndQuery); } if (tnWorkTreeNode != null) { return (tnWorkTreeNode); } tvTreeView.Nodes[iLoop].Collapse(); } } } } return (null); } private static TreeNode ExpandTreeViewNodesR(TreeNode tvTreeNode, string sPathAndQuery) { TreeNode tnReturnTreeNode = null; if (tvTreeNode != null) { tvTreeNode.Expand(); if (tvTreeNode.NavigateUrl.ToLower() == sPathAndQuery) { return (tvTreeNode); } else { tnReturnTreeNode = null; for (int iLoop = 0; iLoop < tvTreeNode.ChildNodes.Count; iLoop++) { tvTreeNode.ChildNodes[iLoop].Selected = true; tnReturnTreeNode = ExpandTreeViewNodesR(tvTreeNode.ChildNodes[iLoop], sPathAndQuery); if (tnReturnTreeNode != null) { return (tnReturnTreeNode); } } tvTreeNode.Collapse(); } } return (null); }
Хм...ну, использование "расширенного" никуда не приведет вас по умолчанию, так как привязка данных даже не будет смотреть на это...Я предполагаю, что вы можете настроить какую-то пользовательскую привязку данных, но мое предложение будет заключаться в том, чтобы подключиться к событию OnTreeNodeDataBound и развернуть/свернуть его по мере необходимости, хотя ваш пробег может варьироваться в зависимости от этого подхода.
Ваша проблема заключается в том, как происходит привязка данных для treeview:если у вас есть рефлектор под рукой, проверьте метод DataBindRecursive на панели управления TreeView. Если у вас нет рефлектора под рукой, идите и установите его. :)