我有一个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>
答案 0 :(得分:1)
不幸的是,您无法在XML中执行此操作。这是控制的短暂结果。您需要使用XML填充TreeView,然后递归遍历所有节点并展开所需的分支。请尝试以下方法:
将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);
}
答案 1 :(得分:0)
嗯......好吧,使用“Expanded”默认不会让你到任何地方,因为DataBinding甚至都不会看到...我想你可以设置某种自定义DataBinding,但我的建议将挂钩到OnTreeNodeDataBound事件并根据需要展开/折叠,尽管您的里程可能因此而异。
你的问题围绕树视图的数据绑定发生的方式:如果你有方便的Reflector,请检查TreeView控件上的DataBindRecursive方法。如果您没有方便的Reflector,请安装它。 :)