在使用TreeView服务端控件时,静态定义数据结构有时是不可行的,或者数据可能会依赖运行时收集的信息。为了动态显示数据,TreeView 控件支持动态节点填充。将 TreeView 控件配置为即需填充时,该控件将在用户展开节点时引发事件。事件处理程序检索相应数据,然后填充到用户单击的节点。若要以数据即需填充 TreeNode 对象,请将节点的 PopulateOnDemand 属性设置为 true,并创建 TreeNodePopulate 事件处理程序以向 TreeNode 对象中填充数据。(以上引自M$DN)
示例:
<asp:TreeView ID="trvTreeMenu" runat="server" AutoGenerateDataBindings="False" ExpandDepth="0" PopulateOnDemand="True" ShowExpandCollapse="true"
Width="195px" OnTreeNodePopulate="Treeview1_TreeNodePopulate" ExpandImageUrl="img/selectChildNode.gif" Font-Names="宋体" Font-Size="10pt" Height="100%" ShowLines="True" ForeColor="Black">
<Nodes>
<asp:TreeNode Value="1" Text="根节点" PopulateOnDemand="true" NavigateUrl="#" > </asp:TreeNode>
</Nodes>
</asp:TreeView>
在后端代码中可以实现Treeview1_TreeNodePopulate方法,动态填充TreeNode节点
public void Treeview1_TreeNodePopulate(object sender, TreeNodeEventArgs e)
{
if (IsCallback)
if (e.Node.ChildNodes.Count == 0)
{
LoadChildNode(e.Node);
}
}
但是你会发现,因为节点是动态填充的,所以在页面刚打开时,整个TreeView总是处于收缩状态的.无论你是否设置了
ShowExpandCollapse这个属性,你也会发现,只有用鼠标点击来展开树,Treeview1_TreeNodePopulate函数才会被触发。
这样以来想让页面加载后树就处于部分展开状态,又想使用PopulateOnDemand的方式,只有手工加载需要展开的节点,其他的继续使用PopulateOnDemand="true"的方式
原来的代码稍稍进行修改
<asp:TreeView ID="trvTreeMenu" runat="server" AutoGenerateDataBindings="False" ExpandDepth="0" PopulateOnDemand="True" ShowExpandCollapse="true"
Width="195px" OnTreeNodePopulate="Treeview1_TreeNodePopulate" ExpandImageUrl="img/selectChildNode.gif" Font-Names="宋体" Font-Size="10pt" Height="100%" ShowLines="True" ForeColor="Black">
<Nodes>
<asp:TreeNode Value="1" Text="根节点" PopulateOnDemand="false" NavigateUrl="#" > </asp:TreeNode>
</Nodes>
</asp:TreeView>
在页面Page_Load函数里加上
LoadChildNode(trvTreeMenu.Nodes[0]); 这样就仅仅展开了一级节点
在LoadChildNode里增加节点时,以后的节点还是按需打开的:
child.PopulateOnDemand = true;
总结一下:
在TreeView控件里,使用PopulateOnDemand按需加载时,其下不能有子节点,也就是无法手工进行初始化。如果需要手工初始化,PopulateOnDemand设置为false既可。