У меня есть элемент управления ASP.Net TreeView, который я привязываю к источнику данных XML. Я хочу иметь возможность контролировать, какие узлы раскрываются, а какие свертываются в файле определения XML. Однако Expanded = '' у меня не работает. В следующем простом примере я хочу, чтобы узел 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>





Хм ... ну, использование "Expanded" по умолчанию никуда вас не приведет, поскольку DataBinding даже не будет смотреть на это ... Я полагаю, вы могли бы настроить какую-то особую привязку DataBinding, но я предлагаю подключитесь к событию OnTreeNodeDataBound и разверните / сверните там по мере необходимости, хотя ваш опыт может варьироваться в зависимости от этого подхода.
Ваша проблема связана с тем, как происходит привязка данных для древовидного представления: если у вас есть под рукой Reflector, проверьте метод DataBindRecursive в элементе управления TreeView. Если у вас нет Reflector под рукой, установите его. :)
К сожалению, вы не можете сделать это в XML. Это недостаток контроля. Вам нужно будет заполнить TreeView XML, а затем рекурсивно пройти все узлы и развернуть нужную ветку. Попробуйте следующее:
Добавьте атрибут OnPreRender в элемент управления TreeView ...
<asp:XmlDataSource ID = "oXmlDataSource" runat = "server" />
<asp:TreeView ID = "TreeView1" runat = "server" EnableViewState = "false" DataSourceID = "oXmlDataSource" OnPreRender = "TreeView1_PreRender"></TreeView>
Затем добавьте следующее в код (я рекомендую добавить несколько тестов и добавить try / catch) ...
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);
}